用51单片机设置1000秒内的倒计时并且运用独立按键(结合蜂鸣器)和八位数码管显示设置启动计时、暂停计时、继续计时和归零计时,请编写代码。
时间: 2024-03-25 19:40:25 浏览: 137
好的,以下是代码实现:
```
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5; //定义蜂鸣器控制引脚
sbit key_start = P3^0; //定义启动计时按键
sbit key_pause = P3^1; //定义暂停计时按键
sbit key_continue = P3^2; //定义继续计时按键
sbit key_reset = P3^3; //定义归零计时按键
sbit dula = P2^6; //定义数码管段选控制引脚
sbit wela = P2^7; //定义数码管位选控制引脚
uchar code table[] = { //定义数码管显示0-9的编码表
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
uint cnt = 0; //定义计时器计数器
bit flag = 0; //定义计时器启动/停止标志位
bit beep_flag = 0; //定义蜂鸣器控制标志位
void delay(uint x); //声明延时函数
void display(uint n); //声明数码管显示函数
void main()
{
TMOD = 0x01; //设置计时器0为模式1
TH0 = 0x3c; //定时1ms
TL0 = 0xb0;
ET0 = 1; //允许计时器0中断
EA = 1; //开总中断
while(1)
{
if(!key_start) //启动计时
{
flag = 1;
beep_flag = 1;
}
if(!key_pause) //暂停计时
{
flag = 0;
beep_flag = 0;
}
if(!key_continue) //继续计时
{
flag = 1;
beep_flag = 0;
}
if(!key_reset) //归零计时
{
cnt = 0;
flag = 0;
beep_flag = 0;
display(cnt);
}
}
}
void timer0() interrupt 1 //计时器0中断服务函数
{
TH0 = 0x3c; //定时1ms
TL0 = 0xb0;
if(flag)
{
cnt++;
if(cnt == 1000) //计时器达到1000秒
{
flag = 0;
beep_flag = 1;
}
}
display(cnt);
if(beep_flag)
{
beep = ~beep;
delay(10);
beep = ~beep;
delay(990);
}
}
void display(uint n) //数码管显示函数
{
uchar i;
uchar code display_num[4] = {0,0,0,0}; //定义存储4位数码管显示值的数组
display_num[0] = n/1000; //千位
display_num[1] = (n%1000)/100; //百位
display_num[2] = (n%100)/10; //十位
display_num[3] = n%10; //个位
for(i=0; i<4; i++)
{
P0 = table[display_num[i]]; //发送数码管段选值
dula = 0; //打开数码管段选
dula = 1; //关闭数码管段选
P0 = 0xff; //清除上一个数码管的显示
P0 = 0x7f << i; //发送数码管位选值
wela = 0; //打开数码管位选
wela = 1; //关闭数码管位选
}
}
void delay(uint x) //延时函数
{
uint i, j;
for(i=x; i>0; i--)
{
for(j=110; j>0; j--);
}
}
```
其中,启动计时按键为P3.0,暂停计时按键为P3.1,继续计时按键为P3.2,归零计时按键为P3.3。数码管显示使用共阴极数码管,连接在P0口,段选控制引脚为P2.6,位选控制引脚为P2.7。计时器使用定时1ms的方式进行计时,计时器中断服务函数中,每隔1ms更新一次数码管显示,并进行计时和蜂鸣器控制。
阅读全文