在51单片机实现秒表计时器设计该秒表计时器在0~59秒范围内循环计时,每次增加1秒。 当复位键有效时,该计时器清零后停止计时。在复位键无效的前提下,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时。并使用两位数码管动态显示计时值。
时间: 2023-05-25 18:03:28 浏览: 89
代码如下:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1 = P3^2; // 复位键
sbit KEY2 = P3^3; // 使能键
sbit LATCH = P2^4; // 锁存信号
sbit SCLK = P2^5; // 时钟信号
sbit SDATA = P2^6; // 数据信号
uchar code Table[] = { // 数码管编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar Time[2] = {0, 0}; // 保存计时值的数组
bit StartFlag = 0; // 计时器启动标志位
// 数码管动态扫描函数
void Display(uint Num) {
uchar i = 0;
for (i = 0; i < 2; i++) {
LATCH = 0;
SCLK = 0;
SDATA = Table[Num % 10];
Num /= 10;
SCLK = 1;
}
LATCH = 1;
}
// 计时器中断函数
void Timer0_ISR() interrupt 1 {
if (StartFlag) { // 启动标志位为1
Time[0]++; // 秒数加1
if (Time[0] == 60) { // 秒数达到60
Time[0] = 0; // 秒数清零
Time[1]++; // 分钟数加1
if (Time[1] == 60) { // 分钟数达到60
Time[1] = 0; // 分钟数清零
}
}
Display(Time[1] * 100 + Time[0]); // 数码管显示
}
}
// 初始化定时器函数
void InitTimer0() {
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器初值为65536-5000
TL0 = 0x18; // 定时器初值为65536-5000
EA = 1; // 打开中断总开关
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
}
void main() {
InitTimer0(); // 初始化定时器
while (1) {
if (KEY1 == 0) { // 复位键按下
Time[0] = 0; // 秒数清零
Time[1] = 0; // 分钟数清零
StartFlag = 0; // 启动标志位清零,停止计时
}
if (KEY2 == 0) { // 使能键按下
StartFlag = 1; // 启动标志位置1,开始计时
} else {
StartFlag = 0; // 启动标志位清零,暂停计时
}
}
}
```
阅读全文