微机实验:串口通信

实验要求:

完成硬件测试环境;编写程序对微机系统的串行口进行自发自收外环测试,从键盘键入发送数据,屏幕显示接收数据。发送要求采用查询方式,接收采用中断方式。当接收方收到“esc”时结束程序。

实际上自发自收与全双工的无联络线通信的区别是:

1、自发自收:MODEM控制寄存器的D4=1(8250工作在内环),D0=0/1,D1=0/1,D2=0/1,因为D0和D1是用来控制联络线的,自发自收没有使用到串口,因此联络信号置0置1无影响,PC机没有使用到D2,因此D2不用管。同时,实质上自发自收并没有用到串口,只是8250芯片的内部的发送移位寄存器的输出被回送到接收移位寄存器的输入),因此写程序的时候初始化

2、全双工无联络线:MODEM控制寄存器的D4=0(8250工作在正常通信模式),D0=0/1,D1=0/1,D2=0/1。(同样的,短距离点对点通信采用无联络线,无须查询联络线,因此D0,D1可取0或1)

由于接收采用中断模式,中断允许寄存器中 D0=1,开放接收中断,同时MODEM控制寄存器的D3=1,使得8250能够送出中断请求;

思路:

发送时,先查询发送保持寄存器是否为空,若为空,则查询键盘缓冲区,若键盘缓冲区不为空,则读取键盘缓冲区的内容送至发送保持寄存器发送;

接收时:采用中断服务子程序处理,这里使用的是辅串口,因此需要置换0BH向量。

代码如下:

.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
	 JZ SCANT
	 MOV AH,1		;查询键盘缓冲区
	 INT 16H
	 JZ SCANT
	 MOV AH,0			;读取键盘缓冲区的内容 ASCII->AL
	 INT 16H
	 AND AL,7FH
	 MOV DX,2F8H 
	 OUT DX,AL
	
	 JMP SCANT     
	 ;CMP AL,1BH     ;判断是否是"esc","esc"对应的ASCII是1BH
	 ;JNE SCANT      ;若题目要求发送方输入“esc”结束程序运行,则将这两行代码注释去掉,然后注释上面的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,1BH   ;判断是否是'esc'
	  JE NEXT
	  MOV AH,2	   ;不是"esc",显示字符在屏幕上
	  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





你可能感兴趣的:(微机&汇编,微机,汇编)