89C52利用定时器定时5秒改变流水灯方向
时间: 2023-07-04 07:10:29 浏览: 138
89c52控制流水灯
好的,我来给你解答。
89C52是一款单片机,它内部集成了定时器/计数器模块,可以用来定时。流水灯是一种LED灯的显示方式,可以通过改变LED灯的亮灭顺序实现流水灯的效果。
下面是基于89C52的定时器和流水灯的程序:
```
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 led = 0x01; // 初始灯光从最右边的灯开始
bit dir = 0; // 初始流水灯方向为从左往右
void timer0_init() // 定时器0初始化
{
TMOD &= 0xF0; // 清零T0控制位
TMOD |= 0x01; // 设置T0为模式1
TH0 = 0xB1; // 定时5秒,高8位赋值为0xB1
TL0 = 0xE0; // 定时5秒,低8位赋值为0xE0
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xB1; // 重新赋值
TL0 = 0xE0;
if (dir == 0) // 方向为从左往右
{
led <<= 1; // 左移一位
if (led == 0x80) // 最左边的灯亮了
{
dir = 1; // 改变方向为从右往左
}
}
else // 方向为从右往左
{
led >>= 1; // 右移一位
if (led == 0x01) // 最右边的灯亮了
{
dir = 0; // 改变方向为从左往右
}
}
}
void main()
{
timer0_init(); // 定时器0初始化
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
while(1)
{
P1 = led; // 输出灯光
}
}
```
在上面的程序中,我们通过定时器0的中断服务函数来控制流水灯的方向和速度。当定时器0计数器溢出时,流水灯的方向会改变,并且灯光的移动速度为5秒一次。
希望这段程序能够对你有所帮助!
阅读全文