编写串口方式3下的51单片机接收程序(包括主程序和中断服务程序)。设波特率为 2400bps,fosc=6MHZ,接收数据采用偶校验。接收数据存放在片外RAM,起始地址为5020H,数据块长度为40字节。
时间: 2024-03-21 16:42:05 浏览: 16
以下是串口方式3的51单片机接收程序示例,包括主程序和中断服务程序:
```c
#include <reg51.h>
#define BAUDRATE 2400
#define FOSC 6000000
#define RX_BUF_SIZE 40
unsigned char idata rx_buf[RX_BUF_SIZE];
unsigned char rx_buf_head = 0;
unsigned char rx_buf_tail = 0;
void init_uart() {
// 计算波特率发生器的值
unsigned int br = (unsigned int)(65536 - FOSC / (32 * BAUDRATE));
// 设置波特率发生器的值
TH1 = br / 256;
TL1 = br % 256;
// 设置串口模式3、允许接收中断、启用全局中断
SCON = 0x50;
ES = 1;
EA = 1;
}
void uart_isr() interrupt 4 using 1 {
if (RI) {
// 接收到数据
RI = 0;
// 读取数据并存入接收缓冲区
unsigned char data = SBUF;
if (rx_buf_head != rx_buf_tail) {
// 接收缓冲区未满,存入数据
rx_buf[rx_buf_head] = data;
rx_buf_head = (rx_buf_head + 1) % RX_BUF_SIZE;
}
}
}
void main() {
init_uart();
while (1) {
// 判断接收缓冲区是否有数据
if (rx_buf_head != rx_buf_tail) {
// 从接收缓冲区取出数据
unsigned char data = rx_buf[rx_buf_tail];
rx_buf_tail = (rx_buf_tail + 1) % RX_BUF_SIZE;
// 处理数据
// ...
}
}
}
```
与之前的示例程序相比,唯一的区别是在中断服务程序上加了一个 using 1 的修饰符,表示将该函数使用的局部变量放在寄存器组1中,以提高中断响应速度。