8251A串口双机通信在80x86指令集下的汇编代码
时间: 2023-11-09 07:06:47 浏览: 101
基于8251A的双机串口通信
4星 · 用户满意度95%
以下是8251A串口双机通信在80x86指令集下的汇编代码:
```
;初始化串口
MOV AL, 00110000B ;设置波特率为9600bps,数据位为8位,无校验位,停止位为1位
OUT 43H, AL ;将AL中的值送入8253的控制字寄存器中
MOV AL, 00000010B ;设置8253的控制字寄存器的第0位和第1位为10,选择第二个计数器
OUT 40H, AL ;将AL中的值送入8253的计数器0的初始计数值计数器中
MOV AL, 00110000B ;设置8253的控制字寄存器的第0位和第1位为00,选择第一个计数器
OUT 40H, AL ;将AL中的值送入8253的计数器0的初始计数值计数器中
MOV AL, 00000011B ;设置8251A的控制字寄存器为11,选择异步模式,禁止中断,允许接收和发送
OUT 3FH, AL ;将AL中的值送入8251A的控制字寄存器中
MOV AL, 00000110B ;设置8251A的命令寄存器为0110,清除接收和发送缓冲区
OUT 3FH, AL ;将AL中的值送入8251A的命令寄存器中
;发送数据
MOV DX, 02F8H ;将8251A的数据寄存器的端口地址送入DX中
MOV AL, 'H' ;将要发送的数据'H'送入AL中
MOV AH, 01H ;将AH的值设置为01,表示发送数据
CALL SEND_DATA ;调用发送数据的子程序
;接收数据
MOV DX, 02F8H ;将8251A的数据寄存器的端口地址送入DX中
MOV AH, 00H ;将AH的值设置为00,表示接收数据
CALL RECEIVE_DATA ;调用接收数据的子程序
SEND_DATA PROC
PUSH AX ;保存AX寄存器的值到栈中
PUSH DX ;保存DX寄存器的值到栈中
WAIT_FOR_SEND:
IN AL, 3FH ;将8251A的状态寄存器的值读入AL中
AND AL, 00100000B ;将AL与00100000B进行与操作,判断是否发送缓冲区为空
JNZ WAIT_FOR_SEND ;如果发送缓冲区不为空,则继续等待
OUT DX, AL ;将AL中的值送入8251A的数据寄存器中
POP DX ;将栈中保存的DX寄存器的值弹出
POP AX ;将栈中保存的AX寄存器的值弹出
RET ;返回
RECEIVE_DATA PROC
PUSH AX ;保存AX寄存器的值到栈中
PUSH DX ;保存DX寄存器的值到栈中
WAIT_FOR_RECEIVE:
IN AL, 3FH ;将8251A的状态寄存器的值读入AL中
AND AL, 00000001B ;将AL与00000001B进行与操作,判断是否接收缓冲区有数据
JZ WAIT_FOR_RECEIVE ;如果接收缓冲区没有数据,则继续等待
IN AL, DX ;将8251A的数据寄存器的值读入AL中
POP DX ;将栈中保存的DX寄存器的值弹出
POP AX ;将栈中保存的AX寄存器的值弹出
RET ;返回
```
阅读全文