编写串口方式3下的接收程序(包括主程序和中断服务程序)。设波特率为2400bps,fosc=6MHZ,接收数据采用偶校验。接收数据存放在片外RAM,起始地址为5020H,数据块长度为40字节。
时间: 2024-03-24 07:41:50 浏览: 157
定时器产生的常用波特率-单片机课程
以下是8051单片机串口接收程序的代码,其中采用了方式3,波特率为2400bps,偶校验,并将接收到的数据存放在外部RAM中。
```
#include <reg52.h>
#define BAUDRATE 2400
#define FOSC 6000000L
#define TIMER_RELOAD (65536 - FOSC / 32 / BAUDRATE)
sbit RXD = P3^0;
void InitUART() {
TMOD &= 0x0F;
TMOD |= 0x20;
SCON = 0x50;
TH1 = TIMER_RELOAD / 256;
TL1 = TIMER_RELOAD % 256;
TR1 = 1;
ES = 1;
EA = 1;
}
void UART_ISR() interrupt 4 {
static unsigned char count = 0;
static unsigned char buffer[40];
if (RI) {
RI = 0;
if (count < 40) {
buffer[count++] = SBUF;
}
}
if (TI) {
TI = 0;
}
}
void main() {
unsigned char *data_ptr = 0x5020;
InitUART();
while (1) {
if (count == 40) {
count = 0;
for (int i = 0; i < 40; i++) {
*data_ptr++ = buffer[i];
}
}
}
}
```
在主程序中,我们首先定义了外部RAM的起始地址为5020H,数据块长度为40字节。然后调用了InitUART()函数初始化串口,设置波特率为2400bps,偶校验,并启用中断。在中断服务程序UART_ISR()中,我们判断是否接收到了数据,并将其存放在buffer数组中。当buffer数组中的数据达到40字节时,我们将其写入外部RAM中,并将count清零。最后在主程序的无限循环中轮询count变量,以检查是否有新的数据需要写入外部RAM中。
阅读全文