51单片机控制16个流水灯
时间: 2023-05-26 18:03:10 浏览: 334
下面是51单片机控制16个流水灯的代码实现,使用两个8位移位寄存器(P0和P2)和一个定时器中断来控制灯的流动。
```c
#include <reg52.h>
unsigned char code pattern[] = {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}; // 灯的流动模式
unsigned char count = 0; // 全局计数器
void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xFC; // 设置定时器初值,定时1ms
TL0 = 0x66;
P0 = pattern[count]; // 移位寄存器P0输出模式值
P2 = ~(1 << count); // 移位寄存器P2输出选通电平
count++; // 计数器自增
if (count >= 8) count = 0; // 计数器溢出处理
}
void main()
{
TMOD = 0x01; // 定时器0模式1,16位计数器,使用定时器0作为中断源
TH0 = 0xFC; // 设置定时器初值,定时1ms
TL0 = 0x66;
ET0 = 1; // 打开定时器0中断允许
TR0 = 1; // 启动定时器0
while(1); // 无限循环等待中断
}
```
在代码中,使用定时器0的模式1作为中断源,设置初值为0xFC66,即定时1ms。中断服务程序中,先执行了定时器的复位操作,然后根据计数器值输出对应的流动模式和选通电平,并将计数器自增。当计数器溢出(计数器值达到8)时,将计数器重置为0,重新开始循环流动。
需要注意的是,由于使用了定时器中断,加入了中断服务程序,因此在程序中必须保留main函数中的"while(1)"等待中断的语句。否则程序将直接运行结束,无法执行中断服务程序。