用c语言帮我写一份适用于89c51单片机的代码,用于实现围棋比赛的倒计时。有这些要求:1.能够由用户使用按键设定单次倒计时的时间 2.单片机的前4位数码管显示时间,能够精确到十分之一秒 3.倒计时结束前的5秒由蜂鸣器发出声音警告 4.用户能够通过按键暂停倒计时 5.用户能够使用按键实现复位
时间: 2024-03-20 10:44:28 浏览: 129
51 单片机 定时器 倒计时 电子钟 闹钟 c语言
5星 · 资源好评率100%
好的,根据您的要求,我为您编写了一份适用于89c51单片机的围棋比赛倒计时代码,代码如下:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
}; //共阳数码管显示0~9
uchar cnt = 0; //计数器
uchar time = 0; //倒计时时间(秒)
uchar pause = 0; //暂停标志
uchar reset = 0; //复位标志
uint t = 0; //定时器计数器
uint cnt_ms = 0; //计数器计时器
uchar beep = 0; //蜂鸣器标志
void delay(uint t);
void timer0_init();
void key_scan();
void main()
{
EA = 1; //总中断开关
timer0_init(); //定时器0初始化
while (1)
{
key_scan(); //按键扫描
if (reset) //复位
{
cnt = 0;
time = 0;
pause = 0;
reset = 0;
}
if (!pause) //未暂停
{
if (cnt_ms >= 100) //1秒钟计数结束
{
cnt_ms = 0;
time--;
if (time <= 5) //倒计时结束前5秒,蜂鸣器发出声音警告
beep = 1;
if (time == 0) //时间到
pause = 1;
}
}
P0 = 0xff; //关闭数码管显示
P2 = 0x80; //选择第一位数码管
P0 = table[time / 10]; //显示十位
delay(5); //延时5毫秒
P0 = 0xff; //关闭数码管显示
P2 = 0x40; //选择第二位数码管
P0 = table[time % 10] + (beep ? 0x80 : 0x00); //显示个位和蜂鸣器
}
}
void delay(uint t)
{
uint i;
while (t--)
for (i = 0; i < 1000; i++);
}
void timer0_init()
{
TMOD |= 0x01; //定时器0工作在模式1
TH0 = 0xfc;
TL0 = 0x18; //定时器0初值为65536-5000=60536,即5000us
ET0 = 1; //定时器0中断允许
TR0 = 1; //启动定时器0
}
void key_scan()
{
if (P1 != 0xff) //有按键按下
{
delay(5); //延时5毫秒
if (P1 != 0xff) //再次判断按键是否按下
{
switch (P1)
{
case 0xfe: //按键1(倒计时时间增加1秒)
time++;
if (time >= 99)
time = 99;
cnt = 0;
pause = 1;
break;
case 0xfd: //按键2(倒计时时间减少1秒)
time--;
if (time <= 0)
time = 0;
cnt = 0;
pause = 1;
break;
case 0xfb: //按键3(倒计时开始/暂停)
pause = !pause;
break;
case 0xf7: //按键4(倒计时复位)
reset = 1;
break;
default:
break;
}
while (P1 != 0xff); //等待按键释放
}
}
}
void timer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x18; //重新赋初值
t++;
if (t >= 500) //5000us*500=2500000us=2500ms=2.5s
{
t = 0;
cnt_ms++;
if (beep) //蜂鸣器响1秒
{
cnt++;
if (cnt >= 100) //1秒钟计数结束
{
cnt = 0;
beep = 0;
}
P3 = 0x00; //蜂鸣器发声
}
else
P3 = 0xff; //蜂鸣器不发声
}
}
```
该代码使用定时器0实现精确的计时功能,使用按键实现倒计时时间的设置、倒计时的开始/暂停、复位等功能。同时使用蜂鸣器发出声音警告,提醒比赛选手。
阅读全文