基于 STC89C52 单片机数字倒计时器的设计 用 STC89C52 单片机作为核心控制元件,6 位 LED 数码管作为显示器,设计数字倒计时 器具体要求如下: (1) LED 数码管显示倒计时时间,时、分、秒各用两位数码管。 (2) 倒计时过程中能设置多个闹钟,当倒计时值到达设定时间,会发出 2s 警报声。 (3) 通过按键可以对倒计时设定初值,倒计时初值范围在 24:00:00——00:00:60。写个程序,里边必须有
时间: 2024-03-07 13:50:43 浏览: 30
STC89C52单片机开发板PDF原理图+软件程序例程源码(48例).rar
5星 · 资源好评率100%
主函数和中断服务函数,程序框架如下:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^1; // 按键1
sbit key2 = P3^2; // 按键2
sbit key3 = P3^3; // 按键3
uchar hour = 0; // 小时
uchar minute = 0; // 分钟
uchar second = 0; // 秒钟
uchar alarm_hour1 = 0; // 闹钟1小时
uchar alarm_minute1 = 0; // 闹钟1分钟
uchar alarm_second1 = 0; // 闹钟1秒钟
uchar alarm_hour2 = 0; // 闹钟2小时
uchar alarm_minute2 = 0; // 闹钟2分钟
uchar alarm_second2 = 0; // 闹钟2秒钟
uchar alarm_hour3 = 0; // 闹钟3小时
uchar alarm_minute3 = 0; // 闹钟3分钟
uchar alarm_second3 = 0; // 闹钟3秒钟
// 数码管段码表
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// 数码管位选表
uchar code place[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
// 数码管显示函数
void display(uchar hour, uchar minute, uchar second) {
uchar digit[6];
digit[0] = hour / 10;
digit[1] = hour % 10;
digit[2] = minute / 10;
digit[3] = minute % 10;
digit[4] = second / 10;
digit[5] = second % 10;
for (uchar i = 0; i < 6; i++) {
P2 = table[digit[i]];
P0 = place[i];
delay(1); // 延时1ms
P0 = 0xff; // 关闭数码管
}
}
// 计时器中断服务函数
void timer0() interrupt 1 {
TH0 = 0xfc;
TL0 = 0x18;
second--;
if (second == 0xff) {
second = 59;
minute--;
if (minute == 0xff) {
minute = 59;
hour--;
if (hour == 0xff) {
hour = 23;
}
}
}
display(hour, minute, second);
}
// 延时函数
void delay(uint ms) {
uint i, j;
for (i = ms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xfc;
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许中断总开关
TR0 = 1; // 启动定时器0
while (1) {
if (!key1) { // 按键1设置闹钟1
delay(10);
if (!key1) {
alarm_hour1 = hour;
alarm_minute1 = minute;
alarm_second1 = second;
}
while (!key1);
}
if (!key2) { // 按键2设置闹钟2
delay(10);
if (!key2) {
alarm_hour2 = hour;
alarm_minute2 = minute;
alarm_second2 = second;
}
while (!key2);
}
if (!key3) { // 按键3设置闹钟3
delay(10);
if (!key3) {
alarm_hour3 = hour;
alarm_minute3 = minute;
alarm_second3 = second;
}
while (!key3);
}
if (hour == alarm_hour1 && minute == alarm_minute1 && second == alarm_second1) {
alarm();
alarm_hour1 = 0;
alarm_minute1 = 0;
alarm_second1 = 0;
}
if (hour == alarm_hour2 && minute == alarm_minute2 && second == alarm_second2) {
alarm();
alarm_hour2 = 0;
alarm_minute2 = 0;
alarm_second2 = 0;
}
if (hour == alarm_hour3 && minute == alarm_minute3 && second == alarm_second3) {
alarm();
alarm_hour3 = 0;
alarm_minute3 = 0;
alarm_second3 = 0;
}
}
}
// 警报函数
void alarm() {
P2 = 0xff;
P0 = 0x00;
delay(2000);
P0 = 0xff;
}
```
注意:以上代码仅供参考,具体实现还需要根据硬件电路和需求进行调整和完善。
阅读全文