51单片机定时器秒计数时钟+Proteus仿真
51单片机定时器秒计数时钟+Proteus仿真
- Proteus仿真

实例代码
本实例采用的是普中开发板Proteus模板
功能:电子钟,从左到右,1、2位为秒,3、4位为分,5、6位为时,7、8位为天
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<reg52.h>
sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4;
typedef unsigned char u8; typedef unsigned int u16;
u8 LedChar[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //共阴极数码管从0到9的真值 u8 LedBuff[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //数码管显示缓冲区,初值0xFF确保启动时都不亮 u8 flags = 1; //1秒定时标志
void TimeInit(); //定时器中断初始化函数
int main() { u8 sec = 0, minutes = 0, hours = 0, days = 0; //定义记录秒,分,时,天的变量 TimeInit(); //定时器中断初始化 while(1) { if(flags == 1) //判断1秒定时标志 { flags = 0; //标志位清零 sec++; //秒加1 if(sec == 60) //判断秒变量到达60秒 { sec = 0; //清0零 minutes++; //分钟位加1 } if(minutes == 60) //判断达到60分 { minutes = 0; //清零 hours++; //小时位加1 } if(hours == 24) //判断达到24小时 { hours =0; //清零 days++; //天数加1 } LedBuff[0]= LedChar[sec%10]; //秒的低位 LedBuff[1]= LedChar[sec/10%10]; //秒的高位 LedBuff[2]= LedChar[minutes%10]; //分钟的低位 LedBuff[3]= LedChar[minutes/10%10]; //分钟的高位 LedBuff[4]= LedChar[hours%10]; //小时的低位 LedBuff[5]= LedChar[hours/10%10]; //小时的高位 LedBuff[6]= LedChar[days%10]; //天数的低位 LedBuff[7]= LedChar[days/10%10]; //天数的高位 } } }
void TimeInit() { EA = 1; //打开中断总开关 ET0 = 1; //打开T0中断开关 TMOD = 0x01; //设置定时器工作在模式1 TH0=(65536-5000)/256; //高四位寄存器的值;//5000us=5ms TL0=(65536-5000)%256; //低四位寄存器的值;
TR0 = 1; //允许定时器T0工作 }
void InterruptTimer0() interrupt 1 { static u8 i = 0; //动态扫描的索引 static u16 cnt = 0; //用来记录中断次数,设置的中断定时为1ms,中断1000次即一秒钟 cnt++; //中断次数计数值加1 if(cnt>=200) //中断次数达到20次即为1秒 { cnt = 0; //清零,重新记录中断次数 flags = 1; //设置1秒定时标志位1 }
P0 = 0x00; //消隐 switch(i) //根据动态索引i的值进行位选,依次点亮八个数码管 { case 0 :LSA = 0; LSB = 0; LSC = 0;i++; P0 = LedBuff[0];break; case 1 :LSA = 1; LSB = 0; LSC = 0;i++; P0 = LedBuff[1];break; case 2 :LSA = 0; LSB = 1; LSC = 0;i++; P0 = LedBuff[2];break; case 3 :LSA = 1; LSB = 1; LSC = 0;i++; P0 = LedBuff[3];break; case 4 :LSA = 0; LSB = 0; LSC = 1;i++; P0 = LedBuff[4];break; case 5 :LSA = 1; LSB = 0; LSC = 1;i++; P0 = LedBuff[5];break; case 6 :LSA = 0; LSB = 1; LSC = 1;i++; P0 = LedBuff[6];break; case 7 :LSA = 1; LSB = 1; LSC = 1;i=0; P0 = LedBuff[7];break; default:break; } TH0=(65536-5000)/256; //高四位寄存器的值; TL0=(65536-5000)%256; //低四位寄存器的值; }
|
仿真资源和程序源码
1 2 3
| 链接:https://pan.baidu.com/s/1kV0iDnaCsXqAena6fgw00w 提取码:ayc8
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!