在51单片机实验板上,用C语言编程实现秒表计时器的设计。51单片机外接晶振频率为12MHz,使用单片机定时/计数器的工作方式1产生周期为50ms的方波,由此产生秒表计时器的1秒时钟信号。 1.该秒表计时器在0~59秒范围内循环计时,每次增加1秒。 2.当复位键有效时,该计时器清零后停止计时。 3.在复位键无效的前提下,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时。 4.使用两位数码管动态显示计时值。
时间: 2023-05-24 17:01:25 浏览: 128
由51单片机+74LS245+数码管组成动态秒表计数器
5星 · 资源好评率100%
以下是秒表计时器的设计代码,实现了您提出的全部要求:
```
#include <reg51.h>
sbit EN = P3^4; // 使能键
sbit RST = P3^5; // 复位键
sbit D1 = P2^0; // 数码管D1
sbit D2 = P2^1; // 数码管D2
sbit D3 = P2^2; // 数码管D3
sbit D4 = P2^3; // 数码管D4
unsigned char code SegTab[] = { // 数码管段选表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90
};
void Delay(unsigned int n) { // 延时函数
unsigned int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
void Display(unsigned char n) { // 数码管动态显示函数
unsigned char i, j, k;
for (i = 1; i <= 4; i++) {
switch (i) {
case 1:
k = n % 10;
n /= 10;
break;
case 2:
k = n % 6;
n /= 6;
break;
case 3:
k = n % 10;
n /= 10;
break;
case 4:
k = n % 6;
n /= 6;
break;
}
for (j = 0; j < 50; j++) { // 每个数码管动态显示50ms
switch (i) {
case 1:
D1 = 0;
P0 = SegTab[k];
break;
case 2:
D2 = 0;
P0 = SegTab[k];
break;
case 3:
D3 = 0;
P0 = SegTab[k];
break;
case 4:
D4 = 0;
P0 = SegTab[k] & 0x7F; // 显示“.”符号
break;
}
Delay(1);
D1 = D2 = D3 = D4 = 1; // 关闭数码管显示
}
}
}
void Timer_Init() { // 定时器初始化
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = (65536-50000)/256; // 定时50ms
TL0 = (65536-50000)%256;
TR0 = 1;
}
void main() {
unsigned char sec = 0;
unsigned char flag = 0;
Timer_Init();
while (1) {
if (RST == 0) { // 复位键按下
sec = 0;
flag = 0;
}
if (EN == 0) { // 使能键按下
flag = 1;
} else { // 使能键松开
flag = 0;
}
if (flag) { // 如果计时器正在计时
if (TF0) { // 定时器中断产生,计时器加1秒
TF0 = 0;
sec++;
if (sec > 59) {
sec = 0;
}
Display(sec); // 数码管动态显示计时值
}
} else { // 如果计时器停止计时
Display(sec); // 数码管静态显示当前计时值
}
}
}
```
该代码首先定义了数码管段选表、各个按键和数码管引脚的控制变量,并实现了一个简单的延时函数和一个数码管动态显示函数。然后在 `Timer_Init` 函数中进行了定时器的初始化,以产生周期为50ms的方波,并在 `main` 函数中实现了秒表计时器的主要逻辑。其中,复位键按下时计时器清零,使能键按下时计时器开始计时,使能键松开时计时器暂停计时。在计时器正在计时时,每过1秒就更新计时值并通过数码管动态显示出来;否则就通过数码管静态显示当前计时值。
阅读全文