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