51单片机串口通信控制流水灯
时间: 2023-07-31 10:13:24 浏览: 155
好的,以下是基于51单片机和串口通信的控制流水灯的程序:
```c
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
void InitUART() { // 初始化串口
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = 0xFD; // 波特率为9600,TH1=(256-11059200/12/32/9600)
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
}
void SendData(uchar dat) { // 发送一个字节的数据
TI = 0; // 清除发送完成标志
SBUF = dat; // 将数据写入发送缓冲区
while(!TI); // 等待发送完成
}
void main() {
uchar ch; // 用于接收串口数据的变量
uchar i = 0; // 计数变量
InitUART(); // 初始化串口
while(1) {
if(RI) { // 如果接收到了数据
ch = SBUF; // 读取接收缓冲区的数据
RI = 0; // 清除接收中断标志
switch(ch) {
case '1': // 收到1表示启动流水灯
while(1) {
LED1 = 1; LED2 = 0; LED3 = 0; LED4 = 0;
for(i = 0; i < 100; i++); // 延时一段时间
LED1 = 0; LED2 = 1; LED3 = 0; LED4 = 0;
for(i = 0; i < 100; i++);
LED1 = 0; LED2 = 0; LED3 = 1; LED4 = 0;
for(i = 0; i < 100; i++);
LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 1;
for(i = 0; i < 100; i++);
}
break;
case '0': // 收到0表示关闭流水灯
LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0;
break;
default: // 收到其他字符,回复错误信息
SendData('E');
SendData('R');
SendData('R');
SendData('O');
SendData('R');
break;
}
}
}
}
void UART() interrupt 4 { // 串口中断服务程序
if(RI) RI = 0; // 清除接收标志
if(TI) TI = 0; // 清除发送标志
}
```
在程序中,我们通过串口接收PC端发送的数据来控制流水灯的开关。如果收到字符'1',则将LED灯设置为流水灯模式,如果收到字符'0',则关闭流水灯,如果收到其他字符,则发送错误信息。
需要注意的是,在使用串口通信时,需要让单片机和PC端的波特率、数据位、停止位和校验位等参数一致,否则通信会出现问题。
阅读全文