实验名称: 测试微机系统串行口(实验教程P109 实验6.10,可参考课本341页例9.3)
实验环境:PC系列机,汇编语言开发工具TASM5.0或 未来汇编
实验目的:
学习汇编语言程序设计的方法;掌握8250异步串行接口芯片的工作原理;掌握串行通信程序的设计。
实验内容:
1. 完成硬件测试环境;
2. 编写程序对微机系统的串口进行自发自收外环测试;发送采用查询方式,接收采用中断方式;
3. 数据发送从键盘键入,接受数据屏幕显示。
实验步骤:
1. 根据实验内容将系统机主机箱后的一个RS-232C口的发送和接收端子短接;
2. 利用汇编工具编写并生成串行通信程序的可执行程序;
3. 运行程序键盘输入需发送的字符,并观察显示内容;
4. 根据程序运行情况改进源程序直至无逻辑错误、符合实验要求。
实验结果需在实验室特定的自发自收的串口机器上运行才能正常显示,正常显示的结果应为输入字符正确显示在屏幕上,因调用的BIOS0号子功能输入所以输入字符不回显,经过自发自收后调用功能显示接收到的字符,所以显示字符并不是输入回显的字符,而是经过接收后显示的字符。程序按ESC键正常退出。
给出代码和一定注释:
.586 //by zwy
DATA SEGMENT USE16
OLD0B DD ?
FLAG DB 0
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE ,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CLI ;关中断
CALL I8250 ;辅串口初始化
CALL I8259 ;开发8259辅串口中断
CALL RD0B ;读中断向量
CALL WR0B ;写中断向量
STI ;开中断
SCANT: CMP FLAG ,-1 ;测试是否收到结束字符
JE RETURN ;接收到ESC则结束程序
MOV DX,2FDH ;读取通信线状态寄存器
IN AL,DX ;读取通信状态字
TEST AL,20H ;查询D5位 发送保持寄存器空闲标志位 为1则空闲
JZ SCANT ;结果为0 说明发送器D5位为0 不空 则跳转继续查询
MOV AH,1 ;查询键盘缓冲区
INT 16H
JZ SCANT
MOV AH,0 ;BIOS 0号子功能调用 不回显输入
INT 16H
AND AL,7FH ;屏蔽最高位 标准ASCII码为7位
MOV DX,2F8H ;送辅串口数据寄存器
OUT DX,AL
CMP AL,1BH ;判断是否是ESC 结束字符
JNE SCANT
TWAIT: MOV DX,2FDH ;读取通信线状态寄存器
IN AL,DX ;读取通信状态字
TEST AL,40H ;D6位为发送移位寄存器空闲标志位 为1则空闲 测试一帧数据是否发送完成
JZ TWAIT
RETURN:CALL RESET
MOV AH,4CH
INT 21H
RECEIVE PROC ;中断方式进行接收
PUSH AX ;保护现场
PUSH DX
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,2F8H ;接收缓冲寄存器
IN AL,DX ;读取接收缓冲区的内容
AND AL,7FH ;屏蔽最高位
CMP AL,1BH ;判断是否为结束字符
JE NEXT ;相等则跳转next
MOV AH,2 ;调用dos2号子功能
MOV DL,AL
INT 21H ;显示接收到的字符串
JMP EXIT
NEXT: MOV FLAG ,-1 ;将flag置为-1
EXIT: MOV AL,20H
OUT 20H,AL
POP DS
POP DX
POP AX
IRET
RECEIVE ENDP
;辅串口初始化
I8250 PROC
MOV DX,2FBH
MOV AL,80H
OUT DX,AL ;寻址地址为1
MOV DX,2F9H
MOV AL,0
OUT DX,AL ;写除数寄存器高8位
MOV DX,2F8H
MOV AL,60H
OUT DX,AL ;写除数寄存器低8位
MOV DX,2FBH
MOV AL,03H
OUT DX,AL ;写数据帧格式
MOV DX,2F9H
MOV AL,01H
OUT DX,AL ;允许8250内部提出接收中断
MOV DX,2FCH
MOV AL,08H
OUT DX,AL ;8250正常收发并允许送出中断请求
RET
I8250 ENDP
;开放辅8259串口中断
I8259 PROC
IN AL,21H
AND AL,11110111B ;将D3位置0 辅串口为D3位
OUT 21H,AL ;写中断命令字
RET
I8259 ENDP
;读中断向量
RD0B PROC
MOV AX,350BH
INT 21H
MOV WORD PTR OLD0B ,BX ;辅串口为0B
MOV WORD PTR OLD0B+2 ,ES
RET
RD0B ENDP
;写中断向量
WR0B PROC
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET RECEIVE
MOV AX,250BH
INT 21H
POP DS
RET
WR0B ENDP
;恢复原中断向量
RESET PROC
IN AL,21H
OR AL,00001000B
OUT 21H,AL
MOV AX,250BH
MOV DX, WORD PTR OLD0B
MOV DS, WORD PTR OLD0B+2
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG
特记下,以备后日回顾。