【Proteus仿真】51单片机+数码管0-99.99秒表计数器

【Proteus仿真】51单片机+数码管0-99.99秒表计数器


  • 🌻Proteus仿真演示
    在这里插入图片描述
⛳本实验采用的是共阴数码管。

📢实验说明

🎯当按键P34按下时,开始计数,当二次按下时,将暂停计数,第三次按下时计数值清零,第四次按下时,重新开始计数,如此循环。

📝程序代码

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
#include <REGX52.H>
//共阴码段码表
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
unsigned char second=0,second_s=0;
unsigned char keycnt; //按键次数检测
unsigned int tcnt; //定时器0计数

void main(void)
{
unsigned char i,j;

TMOD=0x02; //T0工作在方式2
ET0=1; //启用定时器0
EA=1; //使能总中断
// second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
P1=dispcode[second_s];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--); //这是按键消抖,可以封装成函数放到这里来
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1: //开始跑秒
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2: //暂停计数
TR0=0;
break;
case 3: //重新计数
keycnt=0;
second=0;
second_s=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
P1=dispcode[second_s];
break;
}
while(P3_5==0);
}
}
}
}
//定时器0中断
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt>=400)
{
tcnt=0;
second++;
if(second>=100)
{
second=0;
second_s++;
second_s %=10;
// if(second\_s>=10)second\_s=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
P1=dispcode[second_s];
}
}



📌程序源码和仿真资源

🎈本实验基于proteus8.12仿真平台

1
2
3
链接:https://pan.baidu.com/s/179l\_DEXwynughxl9ssi1GA 
提取码:5gs6