南邮实验微机系统串行口的测试(内环自发自收)

实验要求:
学习串行接口8250的工作原理及编程和中断程序的设计,运用微机系统串行通信知识,进行微机系统串行口的测试。
实验要求:
编写程序对微机系统的串行口进行自发自收外环测试,从键盘键入发送数据,屏幕显示接收数据。发送要求采用查询方式,接收采用中断方式。

.586
DATA SEGMENT USE16
OLD0B DD ?    ;存储系统0BH中断向量
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		;开放8259A辅串口中断
	 CALL RD0B		;保存0BH中断向量
	 CALL WR0B	    ;置换0BH中断向量
	 STI			;开中断
SCANT:
	 CMP FLAG,-1    ;测试是否收到结束字符
	 JE RETURN		;接收到回车则结束程序
	 MOV DX,2FDH	;查询发送保持寄存器
	 IN AL,DX		
	 TEST AL,20H	;查询D5位发送保持寄存器空闲标志位
	 JZ SCANT
	 
	 MOV AH,1		;查询键盘缓冲区
	 INT 16H
	 JZ SCANT
	 MOV AH,0		;读取键盘缓冲区的内容 ASCII->AL
	 INT 16H
	 AND AL,7FH		;屏蔽最高位,使用AND指令满足ASCII7位的要求
	 MOV DX,2F8H 
	 OUT DX,AL
	
	 ;JMP SCANT     
	 CMP AL,0DH     ;判断是否是回车,回车对应的ASCII是0DH
	 JNE SCANT      ;若题目要求发送方输入回车结束程序运行,则将这两行代码注释去掉,然后注释上面的JMP SCANT
TWAIT:
	 MOV DX,2FDH
	 IN AL,DX
	 TEST AL,40H   ;测试一帧是否发送完
	 JZ TWAIT
RETURN:            ;当一帧发送完则执行结束程序
	 CALL RESET    ;恢复系统0BH中断向量
	 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,0DH   ;判断是否是回车
	  JE NEXT
	  MOV AH,2	   ;不是回车,显示字符在屏幕上
	  MOV DL,AL
	  INT 21H
	  JMP EXIT
NEXT: MOV FLAG,-1
EXIT: MOV AL,20H
 	  OUT 20H,AL
 	  POP DS
 	  POP DX
 	  POP AX
	  IRET    ;中断返回
RECEIVE ENDP


;初始化8250
I8250 PROC
	  MOV DX,2FBH    ;寻址为置1
	  MOV AL,80H
	  OUT DX,AL
	  MOV DX,2F9H	 ;写除数寄存器高8位
	  MOV AL,0
	  OUT DX,AL
	  MOV DX,2F8H	 ;写除数寄存器低8位,波特率为1200
	  MOV AL,60H
	  OUT DX,AL
	  MOV DX,2FBH  	 ;写帧数据格式:8数据为,1停止位,无校验位	 
	  MOV AL,03H
	  OUT DX,AL
	  MOV DX,2F9H 	 ;允许8250内部提出中断	
	  MOV AL,01H
	  OUT DX,AL
	  MOV DX,2FCH
	  MOV AL,00011000B  ;D4=1内环自检,   D3=1开放中断, D4=0正常通信
	  OUT DX,AL
	  RET     ;段内返回
I8250 ENDP



;开放主8259辅串口中断  D3位
I8259 PROC
	  IN AL,21H
	  AND AL,11110111B
	  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    ;将中断屏蔽寄存器的辅串口中断屏蔽字置1,关闭8259辅串口中断
	  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
  • 46
    点赞
  • 198
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值