流水灯,定时器T0,延时5ms,从L1到L8
时间: 2023-06-18 16:02:18 浏览: 175
以下是基于8051单片机的流水灯程序,实现了定时器T0,延时5ms,从L1到L8的流水灯效果:
```
#include <reg52.h>
// 定义晶振频率
#define FREQ_OSC 11059200UL
// 定义延时时间
#define DELAY_TIME 5
// 定义LED的IO口
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 定义T0计数器初值
#define T0_INIT_VALUE (65536 - (FREQ_OSC / 12 / 1000 * DELAY_TIME))
// 定义T0中断标志
volatile bit T0_flag = 0;
// T0中断处理函数
void T0_ISR() interrupt 1 {
static unsigned int cnt = T0_INIT_VALUE;
TH0 = (cnt >> 8);
TL0 = (cnt & 0xFF);
T0_flag = 1;
cnt += T0_INIT_VALUE;
}
void main() {
// 初始化定时器T0
TMOD |= 0x01; // 16位定时器模式,使用T0
TH0 = (T0_INIT_VALUE >> 8);
TL0 = (T0_INIT_VALUE & 0xFF);
ET0 = 1; // 允许T0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动T0
while(1) {
// 等待T0中断
while(!T0_flag);
T0_flag = 0;
// LED流水灯效果
LED1 = 0; LED2 = 1;
LED2 = 0; LED3 = 1;
LED3 = 0; LED4 = 1;
LED4 = 0; LED5 = 1;
LED5 = 0; LED6 = 1;
LED6 = 0; LED7 = 1;
LED7 = 0; LED8 = 1;
LED8 = 0; LED1 = 1;
}
}
```
上述代码中,我们使用定时器T0实现了5ms的延时,并在T0中断中实现了LED的流水灯效果。具体实现方法为:通过设置T0计数器的初值,使得定时器每过一个周期(65536个机器周期),就会产生一次T0中断。在T0中断处理函数中,我们重新设置T0计数器的初值,使得下一次中断仍然在5ms后发生。同时,在每次中断中,我们将LED的输出口按照流水灯的顺序依次置高和置低,从而实现LED的流水灯效果。
阅读全文