三、源程序及注释
1、PC机RS-232串口自发自收 源程序:
DATA SEGMENT
CHL DB 0AH,0DH,'$' ;换行字符串 DATA ENDS
STACK1 SEGMENT STACK DW 100 DUP(0) STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV DX,3FBH ; MOV AL,80H ;DLAB=1 OUT DX,AL
MOV AX,0CH ;N=12 BAUD=9600bps
MOV DX,3F8H ;低位 OUT DX,AL MOV AL,AH INC DX
OUT DX,AL
MOV AL,03H ;八位数据,1停止,无校验 MOV DX,3FBH ;线路控制REG
OUT DX,AL
MOV AL,0 ;屏蔽全部中断 MOV DX,3F9H
OUT DX,AL
WAIT1: MOV DX,3FDH ;读线路状态寄存器
IN AL,DX
TEST AL,1EH ;判断是否有错 JNZ ERROR
TEST AL,01H ;判断是否收到 JNZ RECEIVE
TEST AL,20H ;判断发送端是否空 JZ WAIT1
19
MOV DL,0FFH ;六号功能调用读入待发送数据 MOV AH,06H INT 21H JZ WAIT1
MOV DX,3F8H ;写发送REG
OUT DX,AL PUSH AX MOV DL,AL MOV AH,02H INT 21H JMP WAIT1
;返回 WAIT1
CHAR: PUSH AX MOV DL,AL ;显示接收
MOV AH,02H INT 21H
MOV DX,OFFSET CHL;输出字符串换行 MOV AH,09H
INT 21H
POP AX JMP WAIT1
ERROR: MOV DX,3FDH IN AL,DX MOV DL,'?' ;对于错误显示'?\
MOV AH,02H INT 21H
JMP WAIT1
RECEIVE:MOV DX,3F8H
IN AL,DX ;读数据接收寄存器 CMP AL,'!' ;判断是否结束 JNE CHAR
MOV AH,4CH INT 21H CODE ENDS END START
2、两台PC机间RS-232串口通信 发送源程序: CODE SEGMENT
ASSUME CS:CODE
20
START: MOV AL,80H ;8250初始化,设DLAB=1 MOV DX,3FBH OUT DX,AL
MOV AX,30H
MOV DX,3F8H
OUT DX,AL ;写入除数低字节 MOV AL,AH INC DX
OUT DX,AL ;写入除数高字节
MOV AL,0AH ;7位数据,1位停止,奇校验 MOV DX,3FBH
OUT DX,AL ;写入线路控制寄存器
MOV AL,03H
MOV DX,3FCH
OUT DX,AL ;写入Modem控制寄存器
MOV AL,0 MOV DX,3F9H
OUT DX,AL ;写中断允许寄存器,屏蔽所有中断
WAIT1: MOV DX,3FDH ;读线路状态寄存器 IN AL,DX
TEST AL,1EH ;出错否 JNZ ERROR
TEST AL,01H ;接收数据就绪否 JNZ SEND ;发送
TEST AL,20H ;发送寄存器空否,不空,返回等待 JZ WAIT1
SEND: MOV AH,1
INT 21H ;读键盘 CMP AL,21H ;是'!'?
JZ EXIT
;是,返回操作系统
MOV DX,3F8H ;不是,则发送 OUT DX,AL
JMP WAIT1 ;返回等待
ERROR: MOV DX,3FDH ;出错则清除线路状态寄存器
21
IN AL,DX
MOV DL,'?' ;显示'?' MOV AH,02H INT 21H JMP WAIT1
EXIT: MOV AH,4CH INT 21H CODE ENDS END START
接收源程序: CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,80H MOV DX,3FBH OUT DX,AL
MOV AX,30H MOV DX,3F8H
OUT DX,AL MOV AL,AH INC DX
MOV DX,3F9H
OUT DX,AL
MOV AL,0AH MOV DX,3FBH
OUT DX,AL
MOV AL,03H MOV DX,3FCH
OUT DX,AL
MOV AL,0 MOV DX,3F9H
OUT DX,AL
WAIT1: MOV DX,3FDH IN AL,DX
TEST AL,1EH JNZ ERROR
;8250初始化 ;写除数 ;写入除数低字节 ;写入除数高字节 ;写入线路控制寄存器
;写入Modem控制寄存器 ;写中断允许寄存器,屏蔽所有中断 ;读线路状态寄存器 ;出错否 22
TEST AL,01H ;接收数据就绪否
JNZ RECEIVE ;转接收
TEST AL,20H ;发送寄存器空否,不空,返回等待 JZ WAIT1
JMP WAIT1 ;均返回等待
RECEIVE: MOV DX,3F8H ;读接收数据 IN AL,DX
AND AL,01111111B ;保留位数据 CMP AL,21H ;是'!'? JNZ CHAR
MOV AH,4CH ;返回操作系统 INT 21H
CHAR: PUSH AX
MOV DL,AL
MOV AH,2 ;显示接受字符 INT 21H
POP AX
JMP WAIT1 ;返回等待
ERROR: MOV DX,3FDH ;出错则清除线路状态寄存器 IN AL,DX
MOV DL,'?' ;显示'?' MOV AH,02H INT 21H JMP WAIT1 CODE ENDS
END START
四、总结
本次实验要编写三段程序。但是这三段程序的内容结构是大致相同的。在分析程序时也没有很大的困难。以串口自发自收为例,主要是按照顺序写控制字,然后在屏幕上显示。
23