任务4:倒计时大于20s时,绿灯闪烁,10s—20s时黄灯闪烁,10s内红灯闪烁; 任务5:按下独立按键K2,停止倒计时提醒,倒计时零; 任务6:倒计时结束后,蜂鸣器发声 任务7:按下独立按键K3,蜂鸣器停止发声;用c语言代码在51单片机上实现效果
时间: 2024-03-08 17:48:02 浏览: 106
以下是使用C语言在51单片机上实现倒计时、闪烁灯、蜂鸣器的代码:
```c
#include <reg51.h>
#define LED_GREEN P1_0
#define LED_YELLOW P1_1
#define LED_RED P1_2
#define KEY_K2 P3_2
#define KEY_K3 P3_3
#define BUZZER P3_7
int count = 30; // 初始倒计时30秒
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0xFC; // 定时器重装值,时钟频率为11.0592MHz,定时1ms
TL0 = 0x67;
count--; // 每次中断计数器减1
}
void main()
{
TMOD = 0x01; // 定时器0,模式1
TH0 = 0xFC; // 定时器重装值,时钟频率为11.0592MHz,定时1ms
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
while (1)
{
if (count > 20) // 倒计时大于20s时,绿灯闪烁
{
LED_GREEN = ~LED_GREEN; // 绿灯闪烁
LED_YELLOW = 0;
LED_RED = 0;
delay(500);
}
else if (count > 10 && count <= 20) // 10s—20s时,黄灯闪烁
{
LED_YELLOW = ~LED_YELLOW; // 黄灯闪烁
LED_GREEN = 0;
LED_RED = 0;
delay(500);
}
else if (count > 0 && count <= 10) // 10s内,红灯闪烁
{
LED_RED = ~LED_RED; // 红灯闪烁
LED_GREEN = 0;
LED_YELLOW = 0;
delay(500);
if (count == 1) BUZZER = 1; // 最后1秒,蜂鸣器响
}
else // 倒计时结束
{
LED_GREEN = 0;
LED_YELLOW = 0;
LED_RED = 0;
BUZZER = 0;
while (1)
{
if (KEY_K2 == 0) // 按下K2,停止倒计时提醒
{
count = 0;
break;
}
else if (KEY_K3 == 0) // 按下K3,蜂鸣器停止发声
{
BUZZER = 0;
}
else // 倒计时结束,蜂鸣器发声
{
BUZZER = ~BUZZER;
delay(100);
}
}
}
}
}
```
在代码中,使用了定时器0中断来实现倒计时,每次中断计数器减1。根据倒计时的时间,判断灯的状态和是否响蜂鸣器。当倒计时结束后,使用while循环来判断是否按下了K2或K3按键,以实现停止倒计时提醒或停止蜂鸣器发声的功能。
阅读全文