蓝桥杯单片机定时器与中断秒表实验+Proteus仿真

蓝桥杯单片机定时器与中断秒表实验


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

秒表实验

实验目标:在CT107D单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,具有清零、暂停、启动功能。

实验要求:
  1. 显示格式为: 分-秒- 0.05秒(即50ms),例:08-26-18表示: 8分 26秒900毫秒。
  2. 独立按键S4为:暂停|启动;独立按键S5为:清零 ,按键均为按下有效。

程序代码

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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "reg52.h"

sbit S4 = P3^3;
sbit S5 = P3^2;/\*独立按键\*/

unsigned char t_m = 0;/\*分\*/
unsigned char t_s = 0;/\*秒\*/
unsigned char t_005s = 0;/\*50毫秒\*/

unsigned char code SMG_NoDot[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};/\*共阳数码管真值\*/

void SelectHC573(unsigned char channel)/\*74HC573锁存器\*/
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void DelaySMG(unsigned int t)/\*数码管延时函数\*/
{
while(t--);
}
void DisplaySMG\_Bit(unsigned char value, unsigned char pos)/\*数码管显示函数\*/
{
P0 = 0x00;
SelectHC573(6);
P0 = 0x01 << pos;
P2=0x00;//消隐
SelectHC573(7);
P0 = value;
P2=0x00;//消隐
}



void DisplayTime()/\*设置数码管显示内容\*/
{
DisplaySMG\_Bit(SMG_NoDot[t_005s%10],7);
DelaySMG(500);

DisplaySMG\_Bit(SMG_NoDot[t_005s/10],6);
DelaySMG(500);
DisplaySMG\_Bit(SMG_NoDot[16],5);
DelaySMG(500);

DisplaySMG\_Bit(SMG_NoDot[t_s%10],4);
DelaySMG(500);
DisplaySMG\_Bit(SMG_NoDot[t_s/10],3);
DelaySMG(500);
DisplaySMG\_Bit(SMG_NoDot[16],2);
DelaySMG(500);

DisplaySMG\_Bit(SMG_NoDot[t_m%10],1);
DelaySMG(500);
DisplaySMG\_Bit(SMG_NoDot[t_m/10],0);
DelaySMG(500);
}

//=============定时器相关函数========================
void InitTimer0() /\*定时器0初始化\*/
{
TMOD = 0x01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
ET0 = 1;
EA = 1;
TR0 = 1;
}

//定时器中断服务函数
void ServiceTimer0() interrupt 1 //默认中断优先级 1
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;

t_005s++;
if(t_005s == 20)
{
t_s++;
t_005s = 0;
if(t_s == 60)
{
t_m++;
t_s = 0;
}
if(t_m == 99)
{
t_m = 0;
}
}
}
//==================按键相关函数=================================
void DelayK(unsigned char t) /\*按键延时函数\*/
{
while(t--);
}
void ScanKeys() /\*按键读值并设置按键功能\*/
{
if(S4 == 0) //秒表启动与暂停
{
DelayK(100);
if(S4 == 0)
{
TR0 = ~TR0;
while(S4 == 0)
{
DisplayTime();
}
}
}

if(S5 == 0) //秒表清零
{
DelayK(100);
if(S5 == 0)
{
t_005s = 0;
t_s = 0;
t_m = 0;
while(S5 == 0)
{
DisplayTime();
}
}
}
}
//==================函数=================================
void main()
{
InitTimer0();
while(1)
{
DisplayTime();
ScanKeys();
}
}


仿真资源和程序源码

1
2
3
链接:https://pan.baidu.com/s/1hLA69iEetIyEYXpdJ3-7lQ 
提取码:4jc7