51单片机制作一个LED数码管显示的秒表,用2位数码管显示计时时间,最小计时单位为百毫秒,计时范围为0.0-9.9秒,按下第一次按键开始计时,第二次暂停,第三次秒表清零,如果计时到9.9s,重新开始从0计时。
时间: 2024-06-13 19:08:42 浏览: 199
51单片机实现基本秒表,四个功能,分别是对时分秒的设置
5星 · 资源好评率100%
以下是51单片机制作LED数码管显示秒表的代码实现:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key = P3^2; // 按键接口
sbit dula = P2^6; // 数码管段选接口
sbit wela = P2^7; // 数码管位选接口
uchar code table[] = { // 数码管显示0~9的编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uint count = 0; // 计数器
bit flag = 0; // 计时标志位
void delay(uint i) { // 延时函数
while (i--);
}
void display(uchar num) { // 数码管显示函数
P0 = table[num];
}
void timer0() interrupt 1 { // 定时器0中断函数
TH0 = (65536 - 45872) / 256; // 重新赋初值
TL0 = (65536 - 45872) % 256;
count++; // 计数器加1
if (count == 100) { // 计时到100,即1s
count = 0; // 计数器清零
flag = 0; // 计时标志位清零
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 45872) / 256; // 定时器0初值
TL0 = (65536 - 45872) % 256;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
while (1) {
if (key == 0) { // 按键按下
delay(1000); // 延时去抖
if (key == 0) { // 再次判断按键是否按下
while (!key); // 等待按键松开
if (flag == 0) { // 计时未开始
flag = 1; // 开始计时
} else { // 计时已开始
wela = 1; // 数码管位选
P0 = 0x00; // 显示0
wela = 0;
dula = 1; // 数码管段选
display(count / 10); // 显示十位
dula = 0;
wela = 1; // 数码管位选
P0 = 0x01; // 显示个位
wela = 0;
}
}
}
if (flag == 1) { // 计时标志位为1
dula = 1; // 数码管段选
display(count / 10); // 显示十位
dula = 0;
wela = 1; // 数码管位选
P0 = 0x01; // 显示个位
wela = 0;
}
if (count == 100) { // 计时到100,即1s
count = 0; // 计数器清零
flag = 0; // 计时标志位清零
}
}
}
```
阅读全文