微机接口技术实验三测试微机系统串行口

实验名称:  测试微机系统串行口(实验教程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
 		
    特记下,以备后日回顾。

你可能感兴趣的:(汇编/微机接口)