(基于51单片机)使用数码管写一个倒计时器,使用按钮可以 设置倒计时时间,倒计时过程中按按钮停止倒计 时,并重新设置倒计时时间,倒计时时间到时,蜂 鸣器响3秒。
时间: 2024-05-07 10:21:53 浏览: 253
好的,下面是基于51单片机的倒计时器代码:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5; // 蜂鸣器
sbit btn = P3^2; // 按钮
uchar code table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 数码管段码表
void delay(uint xms); // 延时函数
void display(uchar num); // 数码管显示函数
void main()
{
uchar hours = 0, minutes = 0, seconds = 0; // 定义时分秒
uchar time_set = 0; // 是否设置时间
uchar time_stop = 0; // 是否停止计时
uchar count = 0; // 计时器
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器初值(计时1ms)
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while(1)
{
if(btn == 0) // 按钮按下
{
delay(10); // 延时去抖
if(btn == 0) // 再次判断按钮状态
{
time_set = ~time_set; // 切换设置时间/非设置时间状态
while(!btn); // 等待按钮松开
}
}
if(time_set) // 设置时间状态
{
if(count == 1000) // 每隔1s更新显示
{
display(hours / 10);
P2 = 0x7f; // 选择第二位数码管
delay(5);
display(hours % 10);
P2 = 0xbf; // 选择第三位数码管
delay(5);
display(minutes / 10);
P2 = 0xdf; // 选择第四位数码管
delay(5);
display(minutes % 10);
P2 = 0xef; // 选择第五位数码管
delay(5);
display(seconds / 10);
P2 = 0xf7; // 选择第六位数码管
delay(5);
display(seconds % 10);
count = 0; // 计时器清零
}
if(btn == 0) // 按钮按下
{
delay(10); // 延时去抖
if(btn == 0) // 再次判断按钮状态
{
seconds++; // 秒数加1
if(seconds >= 60) // 秒数超过60,分钟数加1
{
seconds = 0;
minutes++;
if(minutes >= 60) // 分钟数超过60,小时数加1
{
minutes = 0;
hours++;
if(hours >= 24) // 小时数超过24,重置为0
{
hours = 0;
}
}
}
while(!btn); // 等待按钮松开
}
}
}
else // 非设置时间状态
{
if(count == 1000) // 每隔1s更新显示
{
display(minutes / 10);
P2 = 0x7f; // 选择第二位数码管
delay(5);
display(minutes % 10);
P2 = 0xbf; // 选择第三位数码管
delay(5);
display(seconds / 10);
P2 = 0xdf; // 选择第四位数码管
delay(5);
display(seconds % 10);
P2 = 0xef; // 选择第五位数码管
delay(5);
count = 0; // 计时器清零
}
if(btn == 0) // 按钮按下
{
delay(10); // 延时去抖
if(btn == 0) // 再次判断按钮状态
{
time_stop = ~time_stop; // 切换计时器停止/非停止状态
while(!btn); // 等待按钮松开
}
}
if(!time_stop) // 计时器未停止
{
seconds--; // 秒数减1
if(seconds == 255) // 秒数减到0,分钟数减1
{
seconds = 59;
minutes--;
if(minutes == 255) // 分钟数减到0,小时数减1
{
minutes = 59;
hours--;
if(hours == 255) // 小时数减到0,计时结束
{
hours = 0;
minutes = 0;
seconds = 0;
beep = 1; // 蜂鸣器响3秒
delay(3000);
beep = 0;
}
}
}
}
}
}
}
void display(uchar num)
{
P0 = table[num]; // 显示数字
P2 = 0xfe; // 选择第一位数码管
}
void timer0() interrupt 1
{
TH0 = 0xFC; // 定时器初值(计时1ms)
TL0 = 0x67;
count++; // 计时器加1
}
void delay(uint xms)
{
uint i, j;
for(i = xms; i > 0; i--)
{
for(j = 110; j > 0; j--);
}
}
```
需要注意的是,该代码仅供参考,具体实现可能需要根据自己的硬件环境进行适当修改。同时,也需要在硬件电路中添加相应的数码管、蜂鸣器和按钮等元件。
阅读全文