项目8:倒计时定时提醒装置 任务1:通过串口下发倒计时定时提醒,定时时间范围(0-999s) 倒计时过程中无法更新定时时间;任务2:动态数码管显示定时时间; 任务3:按下独立按键K1,利用定时器按秒开始倒计时; [任务4:倒计时大于20s时,绿灯闪烁,10s—20s时黄灯闪烁,10s内红灯闪烁; 任务5:按下独立按键K2,停止倒计时提醒,倒计时零; 任务6:倒计时结束后,蜂鸣器发声 任务7:按下独立按键K3,蜂鸣器停止发声; 用c语言写代码,在51单片机上实现效果
时间: 2023-07-04 17:27:54 浏览: 51
以下是51单片机的代码实现:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P3^2; // 定时开始按键
sbit K2 = P3^3; // 定时停止按键
sbit K3 = P3^4; // 蜂鸣器停止按键
sbit BEEP = P2^3; // 蜂鸣器
sbit LED_R = P1^0; // 红灯
sbit LED_Y = P1^1; // 黄灯
sbit LED_G = P1^2; // 绿灯
uchar code SEG7[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar cnt; // 倒计时计数器
bit flag; // 倒计时标志
uint time; // 定时时间
uchar sec, min, hr; // 秒分时
void delay_ms(uint ms) { // 毫秒延时函数
uint i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
void timer0() interrupt 1 { // 定时器0中断
TH0 = (65536 - 1000) / 256; // 1ms定时器
TL0 = (65536 - 1000) % 256;
if (flag) { // 倒计时中
if (--cnt == 0) { // 计数器归零
flag = 0; // 倒计时结束
time = 0; // 清零计时时间
BEEP = 1; // 停止蜂鸣器
}
if (cnt >= 20000) { // 大于20s,绿灯闪烁
if (cnt % 500 == 0) LED_G = ~LED_G;
} else if (cnt >= 10000) { // 10s—20s,黄灯闪烁
if (cnt % 250 == 0) LED_Y = ~LED_Y;
} else { // 10s内,红灯闪烁
if (cnt % 100 == 0) LED_R = ~LED_R;
}
}
}
void display_time() { // 数码管显示时间
uchar i, j;
for (i = 0; i < 4; i++) {
switch (i) { // 分离出秒分时
case 0: j = sec % 10; break;
case 1: j = sec / 10; break;
case 2: j = min % 10; break;
case 3: j = min / 10; break;
}
P0 = SEG7[j]; // 显示数字
P2 = ~(0x01 << i); // 显示位置
delay_ms(1); // 短暂延时
}
}
void main() {
TMOD = 0x01; // 定时器0工作方式1
TH0 = (65536 - 1000) / 256; // 1ms定时器
TL0 = (65536 - 1000) % 256;
EA = 1; // 开总中断
ET0 = 1; // 定时器0中断
TR0 = 1; // 启动定时器
while (1) {
if (!flag) { // 倒计时结束
if (K1 == 0) { // 按下定时开始按键
flag = 1;
cnt = time * 1000; // 计算倒计时计数器
LED_G = 0; // 绿灯亮
LED_Y = LED_R = 1; // 黄灯、红灯灭
BEEP = 0; // 开始蜂鸣器
}
if (K2 == 0) { // 按下定时停止按键
time = 0; // 清零计时时间
}
}
if (K3 == 0) { // 按下蜂鸣器停止按键
BEEP = 1; // 停止蜂鸣器
}
if (time < 1000) { // 时间范围(0-999s)
if (K1 == 0) { // 按下定时开始按键
sec = 0;
min = 0;
hr = 0;
while (K1 == 0) delay_ms(20); // 等待按键弹起
while (K1) { // 等待定时时间设置
display_time(); // 显示时间
if (K2 == 0) break; // 按下定时停止按键
if (++sec >= 60) { // 秒进位
sec = 0;
if (++min >= 60) { // 分进位
min = 0;
if (++hr >= 24) { // 时进位
hr = 0;
}
}
}
delay_ms(200); // 按键消抖
}
time = sec + min * 60 + hr * 3600; // 计算定时时间
}
}
}
}
```
注意,该代码仅供参考,需要根据硬件电路进行调整和修改。