51单片机用定时器方式1设计一个交通灯,倒计时12秒,时间到灯亮的代码
时间: 2024-02-06 18:10:43 浏览: 27
下面是用定时器方式1设计一个交通灯倒计时12秒的代码:
```c
#include <reg51.h>
sbit red = P1^0; // 红灯
sbit yellow = P1^1; // 黄灯
sbit green = P1^2; // 绿灯
unsigned char count = 0; // 计数器,记录定时器中断次数
void timer0_isr() interrupt 1 { // 定时器0中断函数
TH0 = 0x4C; // 重新赋初值
TL0 = 0x00;
count++; // 计数器加1
if (count == 120) { // 12秒时间到
count = 0;
red = 0; // 红灯亮
yellow = 1;
green = 1;
}
}
void main() {
TMOD = 0x01; // 定时器0工作在方式1
TH0 = 0x4C; // 赋初值
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启中断总开关
TR0 = 1; // 启动定时器0
while (1);
}
```
注:定时器0的时钟源为系统时钟,频率为11.0592MHz/12=921.6kHz,定时1ms需要计数的值为921.6-1=920,所以定时12秒需要计数的值为921.6*12-1=11059。为方便计算,这里采用了每100个计数器中断一次的方式,总共需要120次中断才能完成12秒倒计时。这种方式精度不高,但对于交通灯这种场景来说已经足够。