利用8086和8251A,设计一个带有串行通信接口功能的小系统,该系统利用串口,向外循环打印字符串“HELLO WORLD!” 要求:端口地址为40H和42H,8251A异步模式,波特率9600,波特率因子16,8个数据位,无校验位,一个停止位
时间: 2024-02-05 19:02:54 浏览: 20
好的,这是一个比较具体的硬件设计问题,需要结合汇编语言编写程序。以下是基本的硬件连接方式:
![image.png](attachment:image.png)
其中,8251A芯片的TXD引脚连接到串口的RXD引脚,RXD引脚连接到TXD引脚。8251A的MODEM控制引脚应该接地,表示不使用硬件流控。
下面是8086汇编代码的实现:
```assembly
ORG 100h
MOV AL, 00h
MOV DX, 42h
OUT DX, AL ; 设置波特率因子为16
MOV AL, 0h
MOV DX, 40h
OUT DX, AL ; 设置8251A工作在异步模式
MOV AL, 0b00000011
MOV DX, 40h
OUT DX, AL ; 设置数据位为8,停止位为1
MOV AL, 0b00000000
MOV DX, 40h
OUT DX, AL ; 设置校验位为无校验位
MOV AL, 0b00000110
MOV DX, 40h
OUT DX, AL ; 启用8251A发送和接收功能
MOV CX, 11 ; 循环次数,包括字符串和结束符
MOV SI, OFFSET MSG ; 字符串起始地址
SEND_LOOP:
LODSB ; 读取字符串中的一个字符
MOV DX, 42h
MOV AL, 0
SEND_BYTE:
PUSH CX
PUSH DX
MOV CX, 1000 ; 延时等待发送缓冲区为空
WAIT_FOR_EMPTY:
IN AL, DX
AND AL, 0b00100000 ; 检查THRE(Transmitter Holding Register Empty)位
JNZ WAIT_FOR_EMPTY
POP DX
POP CX
OUT DX, AL ; 发送字符
LOOP SEND_LOOP ; 循环发送直到字符串结束
HLT ; 停机
MSG DB 'HELLO WORLD!', 0
```
这段程序首先设置8251A的波特率因子、工作模式、数据位、停止位和校验位等参数,然后启用发送和接收功能。接着,程序使用 LODSB 指令读取字符串中的字符,并且通过 OUT 指令发送字符。为了确保发送缓冲区为空,程序在发送每个字节之前都会进行等待,直到THRE位被置位。最后,程序通过 HLT 指令停机。
需要注意的一点是,8251A芯片是异步通信芯片,它的发送速率是通过波特率因子来控制的,而不是直接设置发送速率。在本例中,波特率因子为16,因此实际的波特率为9600(115200 / 16)。此外,需要对发送缓冲区进行轮询,以确保发送的字节被成功传输。