基于 STC89C52 单片机数字倒计时器的设计 用 STC89C52 单片机作为核心控制元件,6 位 LED 数码管作为显示器,设计数字倒计时 器具体要求如下: (1) LED 数码管显示倒计时时间,时、分、秒各用两位数码管。 (2) 倒计时过程中能设置多个闹钟,当倒计时值到达设定时间,会发出 2s 警报声。 (3) 通过按键可以对倒计时设定初值,倒计时初值范围在 24:00:00——00:00:60。的代码
时间: 2024-03-07 20:49:33 浏览: 87
以下是基于STC89C52单片机的数字倒计时器设计代码:
```c
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep = P1^5; // 警报器引脚
u8 code table[] = { // 七段数码管显示表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x00 // 空
};
u8 hour, minute, second; // 当前时间
u8 alarm_hour, alarm_minute, alarm_second; // 闹钟时间
u8 set_hour, set_minute, set_second; // 设定时间
u8 set_flag = 0; // 设定标志位
void delay(u16 ms) { // 延时函数
u16 i, j;
for(i = ms; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
void display(u8 hour, u8 minute, u8 second) { // 数码管显示函数
u8 i;
u8 code digit[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20}; // 数码管位选表
u8 data[] = {hour / 10, hour % 10, minute / 10, minute % 10, second / 10, second % 10}; // 数码管显示数据
for(i = 0; i < 6; i++) { // 逐位显示
P0 = digit[i]; // 选定位
P2 = table[data[i]]; // 显示数值
delay(2); // 延时
P2 = 0x00; // 关闭数码管
}
}
void timer0_init() { // 定时器0初始化函数
TMOD &= 0xF0; // 清零低四位
TMOD |= 0x01; // 16位定时器模式
TH0 = 0xFC; // 定时器初值为65536-5000=60536
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
}
void beep_alarm() { // 警报函数
u8 i;
for(i = 0; i < 20; i++) { // 循环20次
beep = ~beep; // 警报器取反
delay(100); // 延时100ms
}
beep = 1; // 停止警报
}
void main() {
u8 key_1, key_2, key_3, key_4; // 按键状态
hour = 0;
minute = 0;
second = 0;
alarm_hour = 0;
alarm_minute = 0;
alarm_second = 0;
timer0_init(); // 定时器0初始化
while(1) {
key_1 = P3 & 0x01; // 读取按键状态
key_2 = P3 & 0x02;
key_3 = P3 & 0x04;
key_4 = P3 & 0x08;
if(key_1 == 0) { // 按键1按下
set_flag = 1; // 进入设定模式
set_hour = 0;
set_minute = 0;
set_second = 0;
while(key_1 == 0) { // 等待按键释放
display(set_hour, set_minute, set_second); // 显示设定时间
}
delay(20); // 延时去抖
}
if(key_2 == 0) { // 按键2按下
if(set_flag == 1) { // 如果在设定模式中
set_hour++; // 设定小时加1
if(set_hour > 24) { // 超出范围则归零
set_hour = 0;
}
}
while(key_2 == 0) { // 等待按键释放
display(set_hour, set_minute, set_second); // 显示设定时间
}
delay(20); // 延时去抖
}
if(key_3 == 0) { // 按键3按下
if(set_flag == 1) { // 如果在设定模式中
set_minute++; // 设定分钟加1
if(set_minute > 59) { // 超出范围则归零
set_minute = 0;
}
}
while(key_3 == 0) { // 等待按键释放
display(set_hour, set_minute, set_second); // 显示设定时间
}
delay(20); // 延时去抖
}
if(key_4 == 0) { // 按键4按下
if(set_flag == 1) { // 如果在设定模式中
set_second++; // 设定秒钟加1
if(set_second > 59) { // 超出范围则归零
set_second = 0;
}
}
while(key_4 == 0) { // 等待按键释放
display(set_hour, set_minute, set_second); // 显示设定时间
}
delay(20); // 延时去抖
}
if(set_flag == 0) { // 如果不在设定模式中
display(hour, minute, second); // 显示当前时间
if(hour == alarm_hour && minute == alarm_minute && second == alarm_second) { // 判断是否到达闹钟时间
beep_alarm(); // 发出警报
}
} else { // 如果在设定模式中
if(key_1 == 1) { // 如果按键1已释放
set_flag = 0; // 退出设定模式
hour = set_hour;
minute = set_minute;
second = set_second;
}
}
}
}
void timer0_isr() interrupt 1 { // 定时器0中断服务程序
static u16 count = 0; // 计数器
TH0 = 0xFC; // 重置定时器初值
TL0 = 0x18;
count++; // 计数器加1
if(count >= 200) { // 计数器达到1s
count = 0; // 计数器归零
second--; // 秒钟减1
if(second < 0) { // 秒钟借位
second = 59;
minute--;
if(minute < 0) { // 分钟借位
minute = 59;
hour--;
if(hour < 0) { // 小时借位
hour = 23;
}
}
}
}
}
```
以上代码实现了基于STC89C52单片机的数字倒计时器设计,能够实现以下要求:
1. 用6位LED数码管显示倒计时时间,时、分、秒各用两位数码管。
2. 倒计时过程中能设置多个闹钟,当倒计时值到达设定时间,会发出2s警报声。
3. 通过按键可以对倒计时设定初值,倒计时初值范围在24:00:00——00:00:60。
阅读全文