单片机定时器TO工作方式1延迟两秒的完整c51程序
时间: 2024-02-13 19:05:28 浏览: 34
下面是一个使用定时器0延迟两秒的C51程序示例:
```c
#include <reg51.h>
void delay();
void timer0_isr() interrupt 1;
int count = 0;
void main() {
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置计时初值
TL0 = 0x66;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while (1) {
delay();
P1 = ~P1; // P1口取反
}
}
void delay() {
int i;
for (i = 0; i < 500; i++); // 空转一段时间
}
void timer0_isr() interrupt 1 {
count++; // 计数器加1
if (count == 4000) { // 如果计数器累加到4000
TR0 = 0; // 停止定时器0
count = 0; // 计数器清零
TH0 = 0xFC; // 重新设置计时初值
TL0 = 0x66;
TR0 = 1; // 启动定时器0
}
}
```
在这个程序中,我们使用了定时器0的模式1,每次计时65536个机器周期后会触发定时器中断。我们设置了计时初值为62208,这样每次计时65536 - 62208 = 3328个机器周期,也就是每秒钟大约计时4000次。我们在定时器中断服务程序中累加一个计数器,当计数器累加到4000时,说明已经延迟了一秒钟,我们就停止定时器0,重新设置计时初值,并再次启动定时器0,实现了两秒钟的延迟。在延迟期间,我们在主函数中调用了一个简单的延迟函数,以防止CPU空转过快。最后,我们在定时器中断服务程序中切换P1口的状态,以测试延迟是否正确。