STC89C52单片机串口通信C语言实现 - 发送和接收数据
#include <reg52.h>
// 定义波特率 #define BAUDRATE 9600
// 定义串口发送和接收的缓冲区大小 #define BUFFER_SIZE 64
// 定义串口发送和接收的缓冲区 unsigned char rxBuffer[BUFFER_SIZE]; unsigned char txBuffer[BUFFER_SIZE];
// 定义串口发送和接收的指针和计数器 unsigned char rxIndex = 0; unsigned char txIndex = 0; unsigned char rxCount = 0; unsigned char txCount = 0;
// 初始化串口 void UART_Init() { // 设置波特率 TMOD = 0x20; // 设置定时器1为模式2,8位自动重装 TH1 = 256 - (11059200 / 12 / 32 / BAUDRATE); // 设置定时器1重装值 TL1 = TH1; // 初始化定时器1 TR1 = 1; // 启动定时器1
// 设置串口模式
SCON = 0x50; // 设置串口工作在模式1,允许串口接收
// 允许串口中断
EA = 1; // 允许全局中断
ES = 1; // 允许串口中断
}
// 串口中断服务函数 void UART_Interrupt() interrupt 4 { // 接收中断 if (RI) { RI = 0; // 清除接收中断标志位 rxBuffer[rxIndex] = SBUF; // 读取接收数据 rxIndex = (rxIndex + 1) % BUFFER_SIZE; // 更新接收指针 rxCount++; // 更新接收计数器 }
// 发送中断
if (TI) {
TI = 0; // 清除发送中断标志位
txCount--; // 更新发送计数器
if (txCount > 0) {
SBUF = txBuffer[txIndex]; // 发送下一个数据
txIndex = (txIndex + 1) % BUFFER_SIZE; // 更新发送指针
}
}
}
// 串口发送数据 void UART_SendData(unsigned char *data, unsigned char length) { unsigned char i; for (i = 0; i < length; i++) { while (txCount >= BUFFER_SIZE); // 等待发送缓冲区有空位 txBuffer[(txIndex + txCount) % BUFFER_SIZE] = data[i]; // 将数据写入发送缓冲区 txCount++; // 更新发送计数器 }
if (!TI) {
TI = 1; // 启动发送中断
}
}
// 主函数 void main() { unsigned char sendData[] = 'Hello, World!\n';
UART_Init(); // 初始化串口
while (1) {
if (rxCount > 0) {
UART_SendData(rxBuffer, rxCount); // 回传接收到的数据
rxCount = 0; // 清除接收计数器
rxIndex = 0; // 清除接收指针
}
UART_SendData(sendData, sizeof(sendData)); // 发送数据
delay(1000); // 延时1秒
}
}
该代码中,我们使用STC89C52单片机的定时器1和串口模块来实现串口通信。在UART_Init函数中,我们设置了波特率和串口模式,并允许了串口中断。在UART_Interrupt函数中,我们处理了接收中断和发送中断。在UART_SendData函数中,我们将要发送的数据写入发送缓冲区,并更新发送计数器。在主函数中,我们使用了一个循环来接收数据并回传,然后发送一段固定的数据并延时1秒。
请注意,上述代码仅为示例,实际使用时可能需要根据具体需求进行适当的修改。还需要根据实际的硬件连接情况来配置相关的引脚和寄存器设置。
原文地址: https://www.cveoy.top/t/topic/pf1p 著作权归作者所有。请勿转载和采集!