实验名称: 测试微机系统串行口(实验教程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