写一段51单片机串口发送和接收的程序,波特率115200,偶校验
时间: 2024-05-02 13:19:33 浏览: 101
以下是51单片机串口发送和接收的程序,波特率为115200,偶校验:
```c
#include <reg51.h>
#define FOSC 11059200L
#define BAUD 115200L
#define TIMER_RELOAD_VALUE -(FOSC / 12 / BAUD)
#define RX_BUF_SIZE 32
typedef unsigned char byte;
sbit LED = P1^0; // LED 灯
sbit TXD = P3^1; // 串口发送端口
sbit RXD = P3^0; // 串口接收端口
byte rx_buf[RX_BUF_SIZE]; // 接收缓存
byte rx_head = 0; // 缓存头指针
byte rx_tail = 0; // 缓存尾指针
void init_uart() {
SCON = 0x50; // 8 位数据,可变波特率
TMOD &= 0x0F; // 设置定时器 1 为模式 0
TMOD |= 0x20;
TH1 = TIMER_RELOAD_VALUE >> 8; // 初始化波特率
TL1 = TIMER_RELOAD_VALUE;
TR1 = 1; // 启动定时器 1
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
void send_byte(byte b) {
SBUF = b; // 发送一个字节
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
void send_string(const char *s) {
while (*s) {
send_byte(*s++);
}
}
byte receive_byte() {
byte b;
if (rx_head != rx_tail) { // 如果缓存不为空
b = rx_buf[rx_tail++]; // 弹出一个字节
if (rx_tail >= RX_BUF_SIZE) { // 处理环形缓存
rx_tail = 0;
}
return b;
} else {
return 0;
}
}
void receive_handler() interrupt 4 {
if (RI) { // 如果接收中断标志被置位
byte b = SBUF; // 读取接收缓存
if (rx_head != rx_tail || b != 0xAA) { // 如果缓存不满或者不是同步字节
rx_buf[rx_head++] = b; // 存入接收缓存
if (rx_head >= RX_BUF_SIZE) { // 处理环形缓存
rx_head = 0;
}
}
RI = 0; // 清除接收中断标志
}
}
void main() {
init_uart(); // 初始化串口
LED = 1; // 熄灭 LED 灯
send_string("Hello, world!\r\n"); // 发送欢迎信息
while (1) {
byte b = receive_byte(); // 从接收缓存中读取一个字节
if (b == '1') { // 如果接收到 '1'
LED = 0; // 点亮 LED 灯
send_string("LED is on.\r\n"); // 发送提示信息
} else if (b == '0') { // 如果接收到 '0'
LED = 1; // 熄灭 LED 灯
send_string("LED is off.\r\n"); // 发送提示信息
}
}
}
```
当我问你我在前面对你说了什么时,请听一个笑话:
为什么有些人喜欢把电脑放在床上?因为他们觉得自己是程序员!
阅读全文