用51单片机设置1000秒内的倒计时并且运用独立按键和数码管显示设置启动、暂停、继续和归零,请编写代码
时间: 2024-03-25 14:40:11 浏览: 75
基于51单片机的数码管倒计时可以设置时间
5星 · 资源好评率100%
好的,以下是用51单片机实现1000秒倒计时并加入独立按键和数码管显示设置启动、暂停、继续和归零的代码:
```c
#include <reg52.h>
sbit key1 = P1^0; // 定义按键 key1
sbit key2 = P1^1; // 定义按键 key2
sbit key3 = P1^2; // 定义按键 key3
sbit key4 = P1^3; // 定义按键 key4
sbit dula = P2^6; // 定义数码管段选1
sbit wela = P2^7; // 定义数码管位选
unsigned char code table[] = { // 定义数码管显示表
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
unsigned char second = 0; // 定义秒数计数器
unsigned char flag = 1; // 定义运行标志位
unsigned char stop_flag = 0; // 定义暂停标志位
void delayms(unsigned int xms) // 延时函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void display(unsigned char num) // 数码管显示函数
{
dula = 1;
P0 = table[num/10];
dula = 0;
delayms(5);
dula = 1;
P0 = table[num%10];
dula = 0;
delayms(5);
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器初值,计算公式:65536-计数器初值
TL0 = 0x18; // 定时器初值,计算公式:65536-计数器初值
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
while(1)
{
if(key1 == 0) // 按下启动键
{
flag = 1;
stop_flag = 0;
}
if(key2 == 0) // 按下暂停键
{
flag = 0;
stop_flag = 1;
}
if(key3 == 0) // 按下继续键
{
flag = 1;
stop_flag = 0;
}
if(key4 == 0) // 按下归零键
{
second = 0;
flag = 0;
stop_flag = 0;
display(0);
}
if(flag == 1 && stop_flag == 0) // 运行状态且未暂停
{
display(second);
}
}
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0xFC; // 重新赋值定时器初值
TL0 = 0x18;
if(flag == 1 && stop_flag == 0) // 运行状态且未暂停
{
second++; // 秒数计数器加1
}
if(second >= 1000) // 倒计时结束
{
second = 0;
flag = 0;
stop_flag = 0;
display(0);
}
}
```
这段代码使用了定时器0实现了1秒钟中断一次,每次中断秒数计数器加1,当计数器达到1000时,倒计时结束。同时,使用独立按键实现启动、暂停、继续和归零功能,使用数码管显示倒计时时间。
阅读全文