AT89C52秒表倒计时
时间: 2023-08-30 10:06:29 浏览: 360
AT89C52是一种8位单片机,它可以用来实现秒表和倒计时功能。下面是一个简单的AT89C52秒表倒计时程序:
```C
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f //数码管段码
};
uchar cnt=0; //计数器变量
bit flag=0; //标志位,用于切换秒表和倒计时模式
void delay(uint z) //延时函数,z为延时时间
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(uchar dat) //数码管显示函数,dat为要显示的数字
{
P2=table[dat]; //将段码写入P2口,显示相应数字
}
void main()
{
TMOD=0x01; //定时器T0工作在模式1,16位定时器
TH0=0xfc; //定时器高8位初始值
TL0=0x18; //定时器低8位初始值
TR0=1; //启动定时器
while(1)
{
if(flag==0) //秒表模式
{
display(cnt); //显示计数器变量
if(TF0==1) //定时器溢出
{
TF0=0; //清除TF0溢出标志
cnt++; //计数器加1
if(cnt==60) cnt=0; //计数器满60归零
}
}
else //倒计时模式
{
display(60-cnt); //显示剩余时间
if(TF0==1) //定时器溢出
{
TF0=0; //清除TF0溢出标志
cnt++; //计数器加1
if(cnt==60) cnt=0; //计数器满60归零
}
if(cnt==30) //剩余时间为30秒时发出警报
{
P1=0x01; //发出警报信号
delay(100); //延时一段时间
P1=0x00; //停止警报
}
}
if(P3==0x01) //按键S1按下
{
flag=!flag; //切换秒表和倒计时模式
delay(10); //延时一段时间
while(P3==0x01); //等待按键释放
}
}
}
```
在上述程序中,通过定时器T0实现计时功能。当定时器溢出时,计数器变量加1,当计数器满60时,归零。通过按键S1可以切换秒表和倒计时模式,当进入倒计时模式时,倒计时时间为60秒,当剩余时间为30秒时,发出警报信号。
阅读全文