51单片机串口通信代码
时间: 2023-11-07 15:05:02 浏览: 25
以下是使用51单片机进行串口通信的代码:
```c
#include <reg52.h>
// 定义波特率和发送数据长度
#define BAUD_RATE 9600
#define DATA_LEN 8
// 定义发送和接收缓冲区
unsigned char sendData[DATA_LEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
unsigned char recvData[DATA_LEN];
// 初始化串口
void initSerial() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 256 - FOSC / 12 / BAUD_RATE; // 设置波特率
TL1 = TH1;
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1
SM1 = 1;
REN = 1; // 允许接收
TI = 0; // 清除发送标志
RI = 0; // 清除接收标志
EA = 1; // 打开总中断
ES = 1; // 打开串口中断
}
// 串口发送数据
void sendSerial(unsigned char data) {
SBUF = data;
while (!TI); // 等待发送完成
TI = 0; // 清除发送标志
}
// 串口接收数据
void recvSerial() interrupt 4 {
static unsigned char index = 0; // 接收数据计数器
if (RI) {
recvData[index++] = SBUF;
if (index == DATA_LEN) {
index = 0;
RI = 0; // 清除接收标志
}
}
}
void main() {
initSerial();
while (1) {
for (int i = 0; i < DATA_LEN; i++) {
sendSerial(sendData[i]); // 发送数据
}
while (1) {
if (RI && recvData[DATA_LEN - 1] == 0xFF) {
break;
}
}
}
}
```
此代码使用了定时器和中断来进行串口通信,通过设置波特率和数据长度来进行数据的发送和接收。在主循环中,发送完一组数据后会等待接收到最后一位为0xFF的数据,然后再进行下一次发送。