51单片机双机串口通信甲机向乙机发送一串数字c程序
时间: 2023-07-16 19:16:57 浏览: 113
以下是甲机向乙机发送一串数字的C程序,使用了51单片机的双机串口通信:
```c
#include <reg52.h>
// 定义波特率常量
#define BAUDRATE 9600
// 定义计数器初始值
#define TH1_INIT 256 - (11059200 / 12 / BAUDRATE)
// 定义发送数据缓冲区大小
#define BUFFER_SIZE 8
// 定义发送数据缓冲区
unsigned char send_buffer[BUFFER_SIZE] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
// 定义发送数据索引
unsigned char send_index = 0;
// 定义接收数据缓冲区大小
#define RECEIVE_BUFFER_SIZE 16
// 定义接收数据缓冲区
unsigned char receive_buffer[RECEIVE_BUFFER_SIZE];
// 定义接收数据索引
unsigned char receive_index = 0;
// 定义串口初始化函数
void init_serial() {
// 设置波特率
TH1 = TH1_INIT;
TL1 = TH1_INIT;
// 启用接收中断
ES = 1;
// 启用串口中断
EA = 1;
// 启用接收和发送
SCON = 0x50;
// 启动定时器1
TR1 = 1;
}
// 定义串口发送函数
void serial_send(unsigned char data) {
// 等待发送缓冲区为空
while (!TI);
// 清除发送完成标志
TI = 0;
// 发送数据
SBUF = data;
}
// 定义串口接收中断处理函数
void serial_receive() interrupt 4 {
// 读取接收数据
unsigned char data = SBUF;
// 将数据存入接收缓冲区
receive_buffer[receive_index] = data;
// 移动接收数据索引
receive_index++;
// 如果接收数据索引超过缓冲区大小,重置索引
if (receive_index >= RECEIVE_BUFFER_SIZE) {
receive_index = 0;
}
}
// 主函数
void main() {
// 初始化串口
init_serial();
// 发送数据
while (1) {
// 等待发送缓冲区为空
while (!TI);
// 清除发送完成标志
TI = 0;
// 发送数据
serial_send(send_buffer[send_index]);
// 移动发送数据索引
send_index++;
// 如果发送数据索引超过缓冲区大小,重置索引
if (send_index >= BUFFER_SIZE) {
send_index = 0;
}
}
}
```
在上述程序中,首先定义了波特率常量、计数器初始值、发送数据缓冲区大小和发送数据缓冲区。然后定义了接收数据缓冲区大小和接收数据缓冲区。接着定义了串口初始化函数、串口发送函数和串口接收中断处理函数。最后在主函数中循环发送数据。发送数据的方式是等待发送缓冲区为空,清除发送完成标志,发送数据,移动发送数据索引,如果发送数据索引超过缓冲区大小,重置索引。
阅读全文