c51单片机0-9红绿灯倒计时,且利用定时计数器实现精确秒
时间: 2023-06-14 15:05:29 浏览: 134
以下是基于C51单片机的0-9红绿灯倒计时程序,同时利用定时计数器实现精确秒的功能:
```c
#include <reg52.h>
sbit red = P1^0; // 红灯
sbit green = P1^1; // 绿灯
unsigned char sec = 0; // 秒数
unsigned int count = 0; // 计数器
void timer0_init() // 定时器0初始化
{
TMOD = 0x01; // 定时器0工作在模式1,16位定时器模式
TH0 = 0xFC; // 定时器初值为0xFC67,即65536-50000,每50ms中断一次
TL0 = 0x67;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 开启总中断
}
void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xFC;
TL0 = 0x67;
count++; // 计数器加1
if (count == 20) // 1秒钟
{
count = 0;
sec++; // 秒数加1
}
}
void main()
{
timer0_init(); // 定时器0初始化
while (1)
{
if (sec >= 10) // 倒计时结束
{
red = 1; // 红灯亮
green = 0; // 绿灯灭
}
else if (sec >= 5) // 剩余5秒
{
red = 0; // 红灯灭
green = 1; // 绿灯亮
}
else // 剩余5秒以内
{
red = 1; // 红灯亮
green = 0; // 绿灯灭
}
}
}
```
程序中利用定时器0中断每隔50ms计数器加1,当计数器累加到20时,即1秒钟,秒数加1。根据秒数的不同,控制红绿灯的状态,当秒数大于等于10时,倒计时结束,红灯亮,绿灯灭;当秒数大于等于5时,剩余5秒,红灯灭,绿灯亮;当秒数小于5时,剩余5秒以内,红灯亮,绿灯灭。通过这种方式实现了0-9的红绿灯倒计时,并且能够精确计时,保证了倒计时的准确性。