单片机c51基本要求: (1)设计一个1-100秒倒计时报警器。 (2)通过按键K1设置倒计时报簪器的初始值 加; •(3)通过按键K2设置倒计时报警器的初始值。 我; (4通过按键k3设置倒计时报警器的开始; (5)报警时间到,LED亮灭各一秒(精确) 同时剩余数码管显示HELLO报警提示。 K4实现系统复位功能
时间: 2023-05-28 09:01:35 浏览: 324
。基本思路:
1. 初始化:包括设置按键K1、K2、K3、K4为输入引脚;设置LED和数码管为输出引脚;初始化计时器定时器;
2. 获取按键信号:通过轮询方式获取按键信号,处理按键事件;
3. 倒计时:通过定时器中断实现倒计时功能,每秒减少一秒,当倒计时时间到达0时,触发报警事件;
4. 报警事件:LED灯闪烁1秒,同时数码管显示HELLO报警提示;
5. 复位事件:通过按键K4实现系统复位功能,将倒计时器的时间清零。
代码实现:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P2
#define DUL P0
#define WE P1
uchar time = 0; // 倒计时时间
uchar count = 0; // 计时器计数值
bit isStart = 0; // 是否启动计时器
bit isAlarm = 0; // 是否触发报警
bit isReset = 0; // 是否复位
void delay(uint n) // 延时函数
{
while(n--);
}
void initTimer() // 定时器初始化
{
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void display(uchar num) // 数码管显示
{
DUL = num;
delay(5);
DUL = 0xff;
}
void displayTime() // 显示倒计时时间
{
uchar i;
for(i = 0; i < 8; i++)
{
WE = 0x7f << i;
display(time % 10);
WE = 0x00;
delay(2);
WE = 0xbf << i;
display(time / 10);
WE = 0x00;
delay(2);
}
}
void handleK1() // 处理按键K1事件
{
if(time < 99) time++;
displayTime();
}
void handleK2() // 处理按键K2事件
{
if(time > 0) time--;
displayTime();
}
void handleK3() // 处理按键K3事件
{
isStart = 1;
isAlarm = 0;
isReset = 0;
count = 0;
displayTime();
}
void handleK4() // 处理按键K4事件
{
isStart = 0;
isAlarm = 0;
isReset = 1;
time = 0;
displayTime();
}
void main()
{
LED = 0xff; // 关闭LED灯
DUL = 0xff; // 关闭数码管
WE = 0xff; // 关闭数码管位选
P3 = 0x0f; // 设置按键K1~K4为输入引脚
initTimer(); // 初始化定时器
while(1)
{
if(isReset) continue; // 如果复位事件触发,则不执行其他操作
if(P3 != 0x0f) // 有按键按下
{
delay(1000);
if(P3 != 0x0f) // 确认按键确实被按下
{
switch(P3)
{
case 0x0e: handleK1(); break; // K1被按下
case 0x0d: handleK2(); break; // K2被按下
case 0x0b: handleK3(); break; // K3被按下
case 0x07: handleK4(); break; // K4被按下
}
}
}
if(isStart && !isAlarm) // 倒计时未触发报警
{
displayTime();
if(count >= 12000) // 1秒
{
count = 0;
time--;
displayTime();
if(time == 0) isAlarm = 1; // 触发报警事件
}
}
if(isAlarm) // 触发报警事件
{
uchar i;
for(i = 0; i < 4; i++)
{
LED = 0xff;
delay(50000);
LED = 0x00;
delay(50000);
}
LED = 0xff;
display(0xc); // 数码管显示HELLO
delay(200000);
display(0xe);
delay(200000);
display(0x3);
delay(200000);
display(0x3);
delay(200000);
display(0xf);
delay(200000);
display(0x0);
delay(200000);
display(0x0);
delay(200000);
display(0x0);
delay(200000);
display(0x0);
delay(200000);
display(0xff); // 关闭数码管
}
count++;
}
}
void timer0() interrupt 1 // 中断函数
{
TH0 = 0x3c;
TL0 = 0xb0;
}
阅读全文