89C52通过定时器每50秒改变一次流水灯方向源程序
时间: 2023-11-08 11:10:08 浏览: 29
以下是使用89C52定时器每50秒改变一次流水灯方向的源代码:
```
#include <reg52.h>
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
unsigned char direction = 0; // 流水灯方向,0表示向右,1表示向左
unsigned char time_cnt = 0; // 定时器中断计数器
void timer0_init()
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 定时50ms
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1
{
TH0 = 0xFC; // 重新赋值定时器初值
TL0 = 0x66;
time_cnt++; // 计数器加1
if (time_cnt == 100) // 50ms * 100 = 5s
{
time_cnt = 0; // 计数器清零
if (direction == 0) // 向右流动
{
LED8 = ~LED8;
LED7 = ~LED7;
LED6 = ~LED6;
LED5 = ~LED5;
LED4 = ~LED4;
LED3 = ~LED3;
LED2 = ~LED2;
LED1 = ~LED1;
}
else // 向左流动
{
LED1 = ~LED1;
LED2 = ~LED2;
LED3 = ~LED3;
LED4 = ~LED4;
LED5 = ~LED5;
LED6 = ~LED6;
LED7 = ~LED7;
LED8 = ~LED8;
}
}
}
void main()
{
timer0_init(); // 初始化定时器0
while (1);
}
```
在这个程序中,使用定时器0中断来产生50ms的定时器中断,每100个定时器中断,即5秒钟,改变一次流水灯的方向。其中,P2口的0~7位分别连接了LED1~LED8。在每次定时器中断时,先将定时器初值重新赋值,然后将计数器加1,当计数器等于100时,即5秒钟到了,就根据流水灯方向改变LED的状态。最后在主函数中,初始化定时器0,并进入一个死循环,程序将一直运行。