52单片机代码设计一个0.01秒精度的秒表,从00.00秒~19.99秒循环正计时并显示在数码管上; 设置一个报警门限值,范围08~12,初始门限值为10,选取两个按键可以对其进行加、减操作,并显示在数码管上; 当秒表数值大于该门限值,则发出声光报警,即用一个发光二极管指示灯闪烁,点亮0.1s,熄灭0.3s表示光报警;用蜂鸣器响0.1s,静音0.3s表示声报警; 再增加一个按键用于控制秒表暂停或继续计时。暂停期间,声光报警失效。
时间: 2023-04-10 09:03:21 浏览: 241
ChatGPT: 以下是代码实现:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P2^0; // 发光二极管
sbit BEEP = P2^1; // 蜂鸣器
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar second = 0; // 秒表计数器
uchar limit = 10; // 报警门限值
void delay(uint ms) { // 延时函数
uint i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(uchar num) { // 数码管显示函数
P0 = table[num / 10];
P1 = 0xfe;
delay(1);
P0 = table[num % 10];
P1 = 0xfd;
delay(1);
}
void main() {
uchar key1 = 1, key2 = 1, key3 = 1; // 按键状态
uchar pause = 0; // 秒表暂停标志
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3c; // 定时器0初值
TL0 = 0xb0;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while (1) {
if (key1 == 0) { // 按键1按下
delay(10); // 延时去抖动
if (key1 == 0) {
key1 = 1;
if (pause == 0) pause = 1; // 暂停秒表
else pause = 0; // 继续秒表
}
}
if (key2 == 0) { // 按键2按下
delay(10); // 延时去抖动
if (key2 == 0) {
key2 = 1;
if (limit < 12) limit++; // 报警门限值加1
}
}
if (key3 == 0) { // 按键3按下
delay(10); // 延时去抖动
if (key3 == 0) {
key3 = 1;
if (limit > 8) limit--; // 报警门限值减1
}
}
if (pause == 0) { // 秒表计时
if (second >= 200) second = 0;
display(second / 10 * 10 + second % 10);
if (second / 10 * 10 + second % 10 > limit) { // 报警
LED = 1;
BEEP = 1;
delay(1);
LED = 0;
BEEP = 0;
delay(3);
}
second++;
}
}
}
void timer0() interrupt 1 { // 定时器0中断服务函数
TH0 = 0x3c; // 重新赋初值
TL0 = 0xb0;
}
阅读全文