51单片机串口中断流水灯
时间: 2023-12-06 09:35:51 浏览: 156
以下是51单片机串口中断流水灯的代码实现:
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
unsigned char receive_data;
void main()
{
TMOD = 0x20; // 设置计数器1为模式2
TH1 = 0xfd; // 波特率为9600
TL1 = 0xfd;
SCON = 0x50; // 设置串口为模式1
TR1 = 1; // 启动计数器1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
while(1)
{
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
delay(500);
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 1;
delay(500);
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 1;
delay(500);
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
delay(500);
}
}
void serial() interrupt 4
{
if(RI == 1) // 判断是否接收到数据
{
receive_data = SBUF; // 读取接收到的数据
RI = 0; // 清除接收标志位
}
if(receive_data == '1') // 判断接收到的数据是否为'1'
{
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
}
else if(receive_data == '2') // 判断接收到的数据是否为'2'
{
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 1;
}
else if(receive_data == '3') // 判断接收到的数据是否为'3'
{
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 1;
}
else if(receive_data == '4') // 判断接收到的数据是否为'4'
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
}
}
void delay(unsigned int i)
{
unsigned int j, k;
for(j = i; j > 0; j--)
for(k = 125; k > 0; k--);
}
```
该代码实现了一个串口中断流水灯,当接收到字符'1'时,LED1亮,其余LED灭;当接收到字符'2'时,LED2亮,其余LED灭;当接收到字符'3'时,LED3亮,其余LED灭;当接收到字符'4'时,LED4亮,其余LED灭。
阅读全文