微机接口串行口的测试

版权声明:请多多关注博主哟~ https://blog.csdn.net/qq_37865996/article/details/85274268

要求

运用微机系统串行口知识,进行微机系统串行偶的测试;完成硬件测试环境,编写程序对微机系统的串口进行自发自收外环测试;数据发送从键盘输入,接收数据在屏幕显示。

硬件

实验前,首先要进行串口的连接以实现外环自发自收。

代码

.586     
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位——发送保持寄存器空闲标志位
	   JZ SCANT		  ; D5为1则空闲,D5为0则不空,接着跳转继续查询  
	
	                  
      MOV AH,1       
	   INT 16H
	   JZ SCANT  
	   MOV AH,0       ;因为进行串性口的自发自收测试,使用BIOS 0号子功能调用 不回显输入
	   INT 16H       
	   
	   AND AL,7FH     ;屏蔽最高位,使用AND指令满足ASCII7位的要求
	   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

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

 I8259  PROC
 		IN  AL,21H  
 		AND AL,11110111B			   ;将辅串口置为0
 		OUT 21H,AL                ;写中断命令字
 		RET
 I8259	ENDP

 RD0B   PROC
 		MOV AX,350BH
 		INT 21H
 		MOV WORD PTR OLD0B ,BX        
 		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

猜你喜欢

转载自blog.csdn.net/qq_37865996/article/details/85274268