51单片机:数码管动态显示
程序员文章站
2022-06-08 20:49:45
...
要求
51单片机,用三个7段共阴极数码管动态显示0~99,每隔0.5s刷新一次数字。用keil与Proteus联合仿真。
硬件设计
以AT89C51单片机为核心,包括74HC573锁存器,三个7段共阴极数码管。
1.74HC573锁存器:
功能:用来控制数码管的位选端和段选端。
原理:LE为高电平时,输出随输入而改变,LE为低电平时,输出不随输入而改变。
2.7段共阴极数码管:
位选端:低电平时,选中此数码管;段选端:高电平时相应发光二极管亮起。
共阴极七段数码数据表格:
组合 | 显示数字 |
---|---|
0x3f | 0 |
0x06 | 1 |
0x5b | 2 |
0x4f | 3 |
0x66 | 4 |
0x6d | 5 |
0x7d | 6 |
0x07 | 7 |
0x7f | 8 |
0x6f | 9 |
0x77 | a |
0x7c | b |
0x39 | c |
0x5e | d |
0x79 | e |
0x71 | f |
3.RESPACK-8排阻
由于P0口没有上拉电阻,不能输出高电平,所以需要外接上拉电阻。
4.Proteus仿真图
程序
1.初始设置
#include<reg51.h>
#define unsigned char unchar;
#define unsigned int uint;
void delayms(uint); //延时函数
void show(uint); //数码管显示函数
unchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
sbit P2^6=a;
sbit P2^7=b;
uint sec=0;
uint count=0;
2.延时程序
void delayms(uint rms)
{
uint i,j;
for(i=0;i<rms;i++)
for(j=0;j<110;j++);
}
3.数码管动态显示程序
void show(uint s)
{
a=0;b=1; //启动控制位选端的锁存器
P0=0xfb; //选中第三个数码管
a=1;b=0; //启动控制段选端的锁存器
P0=table[s%10]; //使第三个数码管显示此时计时器数字的个位数
delayms(5);
a=0;b=1;
P0=0xfd;
a=1;b=0;
P0=table[s/10%10];
delayms(5);
a=0;b=1;
P0=oxfe;
a=1;b=0;
P0=table[s/10/10%10];
delayms(5)
}
4.中断部分
void jishu() interrupt 1 using 2
{
TH0=0x3c; //T0定时50ms,算出TH0和TL0的值
TL0=0xb0;
count++; //T0溢出即每过50ms时,count加1
if(count=10) //当count加到20,即刚好经过0.5m,将count清零,sec+1
{
count=0;
sec++;
}
}
5.主函数
void main()
{
TMOD=0x01; //设置T0工作方式1:16位计数器
EA=1; //CPU中断开放:此时每个中断源的中断允许与否由各自中断允许位决定
ET0=1; //允许T0中断
TR0=1; //开启定时器T0
while(1)
{
show(sec);
}
}
结果
推荐阅读
-
基于Proteus与keil联合仿真的51单片机学习记录(六)(串口通信)
-
基于51单片机的交通信号灯(Proteus仿真+源码)
-
基于Proteus仿真51单片机外部中断实验
-
proteus与keil联合使用51单片机的程序设计和仿真
-
基于Proteus与keil联合仿真的51单片机学习记录(五)(使用T/C的工作方式0定时)
-
《单片机实践项目》之《电子DIY》之基于51单片机温度(DS18B20)采集系统设计(串口打印数据)
-
按键使数码管循环显示从0到9 (51单片机+汇编语言+Proteus仿真)
-
pic单片机c语言入门基础知识(pic单片机与51的区别)
-
pic单片机c语言入门基础知识(pic单片机与51的区别)
-
单片机:按键(使用中断)控制数码管的数字加减(c语言实现)