编写串口方式3下的接收程序(包括主程序和中断服务程序)。设波特率为 2400bps,fosc=6MHZ,接收数据采用偶校验。接收数据存放在片外RAM,起始地址为5020H,数据块长度为40字节。
时间: 2024-03-21 13:42:03 浏览: 166
以下是串口方式3的接收程序示例,包括主程序和中断服务程序:
```c
#include <reg52.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 {
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;
// 处理数据
// ...
}
}
}
```
在上面的代码中,我们使用了一个循环队列来存储接收到的数据。当主程序需要处理数据时,它会从队列中取出一个数据并进行处理。当中断服务程序接收到一个字节的数据时,它会将数据存入队列中。由于串口方式3默认使用偶校验,因此不需要额外的校验处理。
阅读全文