【Proteus仿真】51单片机+按键简易定时器时钟

【Proteus仿真】51单片机+按键简易定时器时钟


  • ✨Proteus仿真演示
    在这里插入图片描述

📖功能说明

🌿使用的是8位共阴数码管作为时间显示,P1端口作为数码管的段选(具体显示什么数字),P3端口作为位选(在8位数码管中的具体哪一位显示),P00-P02用来调节时、分、秒、

📝程序代码

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <AT89X51.H> 
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};//共阴码段码表:0-9,-
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //位选
unsigned char dispbuf[8]={0,0,16,0,0,16,2,1}; //时间数据缓冲区
unsigned char dispbitcnt;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j;
void main(void)
{
TMOD=0x02; //T0工作在方式2
TH0=0x06; //初值
TL0=0x06;
TR0=1; //开启定时器0
ET0=1; //使能定时器0中断
EA=1; //使能总中断
hour=8;
while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--); //按键消抖
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{

mstcnt++;
if(mstcnt==8)
{
mstcnt=0;

P3=0xff; //关闭所有显示
P1=dispcode[dispbuf[dispbitcnt]]; //段选
P3=dispbitcode[dispbitcnt]; //位选
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[2]=10; //"-"
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[5]=10; //"-"
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}






⛳程序源码

📌本实验基于proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1wBrwjTOf6wznoY\_9XXJQIA 
提取码:x3jv