项目8:倒计时定时提醒装置 任务1:通过串口下发倒计时定时提醒,定时时间范围(0-999s) 倒计时过程中无法更新定时时间;任务2:动态数码管显示定时时间; 任务3:按下独立按键K1,利用定时器按秒开始倒计时; 任务4:倒计时大于20s时,绿灯闪烁,10s—20s时黄灯闪烁,10s内红灯闪烁; 任务5:按下独立按键K2,停止倒计时提醒,倒计时归零; 任务6:倒计时结束后,蜂鸣器发声; I 任务7:按下独立按键K3,蜂鸣器停止发声;用c语言写一段代码
时间: 2023-07-04 17:16:13 浏览: 109
qrs.rar_0-999_999秒倒计时器_countdown 999_qrs_时间 继电器
好的,以下是基于STC89C52单片机的C语言代码实现:
```c
#include <reg52.h> //头文件
sbit K1 = P3^2; //K1独立按键
sbit K2 = P3^3; //K2独立按键
sbit K3 = P3^4; //K3独立按键
sbit LED_G = P1^0; //绿灯
sbit LED_Y = P1^1; //黄灯
sbit LED_R = P1^2; //红灯
sbit BEEP = P2^3; //蜂鸣器
unsigned int time = 0; //倒计时时间
unsigned int count = 0; //计时器计数
unsigned int flag = 0; //倒计时标志位
void delayms(unsigned int xms) //延时函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Timer0Init() //定时器初始化
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x66;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1 //定时器中断
{
TH0 = 0xFC;
TL0 = 0x66;
count++;
}
void countdown() //倒计时函数
{
if(K1 == 0 && flag == 0) //按下K1开始倒计时
{
flag = 1;
count = 0;
time = 0;
while(K1 == 0); //等待K1松开
}
if(flag == 1) //倒计时开始
{
if(count == 1000) //计时器1s中断
{
count = 0;
time++;
if(time > 999) //倒计时结束
{
time = 0;
flag = 0;
BEEP = 1;
delayms(500);
BEEP = 0;
}
}
if(time <= 20) //倒计时小于等于20s时
{
if(count % 200 == 0) //0.2s闪烁
{
LED_G = !LED_G;
LED_Y = 0;
LED_R = 0;
}
}
else if(time <= 30) //倒计时大于20s且小于等于30s时
{
if(count % 100 == 0) //0.1s闪烁
{
LED_G = 0;
LED_Y = !LED_Y;
LED_R = 0;
}
}
else //倒计时大于30s时
{
if(count % 50 == 0) //0.05s闪烁
{
LED_G = 0;
LED_Y = 0;
LED_R = !LED_R;
}
}
}
}
void stop() //停止倒计时函数
{
if(K2 == 0 && flag == 1) //按下K2停止倒计时
{
flag = 0;
time = 0;
LED_G = 0;
LED_Y = 0;
LED_R = 0;
while(K2 == 0); //等待K2松开
}
}
void beepstop() //蜂鸣器停止函数
{
if(K3 == 0 && flag == 0) //按下K3停止蜂鸣器
{
BEEP = 0;
while(K3 == 0); //等待K3松开
}
}
void main()
{
Timer0Init(); //定时器初始化
while(1)
{
countdown(); //倒计时函数
stop(); //停止倒计时函数
beepstop(); //蜂鸣器停止函数
P0 = 0xFF; //数码管显示
}
}
```
注意:以上代码仅供参考,具体实现可能需要根据硬件平台进行适当的修改。
阅读全文