流水灯,定时器T0,延时5ms,从L1到L8 ,间隔2S,循环重复,不使用delay
时间: 2023-06-18 11:02:16 浏览: 249
以下是使用定时器T0和中断来实现流水灯效果的代码,不使用delay函数:
```c
#include <reg52.h>
#define LED_PIN P1 // LED灯接在P1口
unsigned char ledIndex = 0; // 当前亮灯的编号
void initTimer0(void);
void main(void) {
initTimer0(); // 初始化定时器T0
EA = 1; // 允许全局中断
while (1) {} // 主程序空循环,一直等待中断发生
}
void initTimer0(void) {
TMOD &= 0xF0; // 清零T0的控制位
TMOD |= 0x01; // T0工作在模式1(16位定时器)下
TH0 = 0xFC; // 65536 - 5000 = 60536,设置定时器初值为60536
TL0 = 0x67; // 5000us = 5ms,设置定时器初值为0x6767
ET0 = 1; // 允许T0中断
TR0 = 1; // 启动T0定时器
}
void timer0ISR(void) interrupt 1 {
static unsigned char ledSeq[8] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};
TH0 = 0xFC; // 重置定时器初值
TL0 = 0x67;
LED_PIN = ledSeq[ledIndex]; // 点亮当前灯
ledIndex = (ledIndex + 1) % 8; // 更新亮灯编号
}
```
在上述代码中,我们使用了16位定时器T0,其初值设置为60536,每次定时5ms。在定时器中断服务程序中,我们轮流点亮8盏LED灯,使其呈现流水灯效果。
阅读全文