微机实验:串口通信
程序员文章站
2024-02-02 15:42:34
...
实验要求:
完成硬件测试环境;编写程序对微机系统的串行口进行自发自收外环测试,从键盘键入发送数据,屏幕显示接收数据。发送要求采用查询方式,接收采用中断方式。当接收方收到“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
下一篇: 汇编语言实验10.3