编写串口方式3下的汇编接收程序(包括主程序和中断服务程序)。设波特率为 2400bps,fosc=6MHZ,接收数据采用偶校验。接收数据存放在片外RAM,起始地址为5020H,数据块长度为40字节。编写串口方式3下的接收程序(包括主程序和中断服务程序)。设波特率为 2400bps,fosc=6MHZ,接收数据采用偶校验。接收数据存放在片外RAM,起始地址为5020H,数据块长度为40字节。
时间: 2024-03-21 10:42:07 浏览: 72
串口通讯程序波特率9600程序设计
以下是串口方式3的汇编接收程序示例,包括主程序和中断服务程序:
```assembly
ORG 0H
LJMP MAIN
ORG 23H
SJMP UART_ISR
MAIN:
; 初始化串口
MOV TMOD, #0X20 ; 定时器1工作模式2
MOV TH1, #0XFD ; 波特率发生器计数初值
MOV TL1, #0XFD
MOV SCON, #0X50 ; 串口工作模式3
SETB ES ; 允许串口中断
SETB EA ; 允许总中断
; 主循环
LOOP:
; 判断接收缓冲区是否有数据
MOV A, rx_buf_head
CJNE A, rx_buf_tail, HAS_DATA
SJMP LOOP
HAS_DATA:
; 从接收缓冲区取出数据
MOV A, rx_buf_tail
MOV C, A
ADD A, #40
ANL A, #0XFF
MOV rx_buf_tail, A
MOV A, C
ADD A, #5020H
MOV DPTR, A
MOVX @DPTR, rx_buf
; 处理数据
; ...
SJMP LOOP
UART_ISR:
; 接收数据中断服务程序
JNB RI, UART_ISR_EXIT
CLR RI
; 读取数据并存入接收缓冲区
MOV A, SBUF
MOV B, rx_buf_head
CJNE B, rx_buf_tail, RX_BUF_NOT_FULL
SJMP UART_ISR_EXIT
RX_BUF_NOT_FULL:
MOVX @DPTR, A
INC rx_buf_head
CJNE rx_buf_head, #40, UART_ISR_EXIT
CLR rx_buf_head
UART_ISR_EXIT:
RETI
rx_buf_head: DB 0
rx_buf_tail: DB 0
rx_buf: DS 40
```
在上面的代码中,我们使用了一个长度为40的数组来存储接收到的数据,数组的起始地址为5020H。当主程序需要处理数据时,它会从数组中取出一个数据并进行处理。当中断服务程序接收到一个字节的数据时,它会将数据存入数组中。由于串口方式3默认使用偶校验,因此不需要额外的校验处理。
需要注意的是,由于8051单片机的指令集比较有限,因此需要通过一些技巧来实现数组访问和循环队列的操作。在上面的代码中,我们使用了 MOVX 指令来实现间接访问外部RAM,使用了 CJNE 指令来实现循环队列的操作。
阅读全文