班级: 学号: 姓名: 日期:
开 始 开 始 保护原寄存器内容 保护原寄存器内容 显示接收信息 显示提示信读状态寄存器,接收有错? Y 发送器为空? N Y 有键入? N 接收到数据? 读键盘输入 输入缓冲器处读数发送并显示 显示接收内容 Y 是esc? 是esc键? N 是enter? N 恢复原寄存器内容 Y N N 是enter? Y 换 行 返回 恢复原寄存器内容 返回 图3-22 接受程序 图3-21 发送程序 第 - 5 - 页 共 13 页
班级: 学号: 姓名: 日期:
课 程 设 计 说 明 书
6.程序代码 源程序: DISP MACRO VAR ;定义宏,完成字符串的输出 MOV AH,9 MOV DX,OFFSET VAR INT 21H ENDM DATA SEGMENT TEXT DB 'THE QUICK BROWN FOX JUMPS OVER LAZY DOG', 0DH, 0AH LLL EQU $-TEXT ;电文长度->LLL ERROR DB 'COM BAD !', 0DH, 0AH, '$' N EQU 24 DUP(' ') MESG1 DB 0DH,0AH DB N,' MENU ',0DH,0AH DB N,' -----------------------------',0DH,0AH DB N,'| | ',0DH,0AH DB N,'| 1.COM2 INTERNAL LOOP | ',0DH,0AH DB N,'| 2.SHUANG JI | ',0DH,0AH DB N,'| 3.EXIT | ',0DH,0AH DB N,'| |',0DH,0AH DB N,' -----------------------------',0DH,0AH DB N,' CHOICE(1,2,3):$ ',0DH,0AH MESG2 DB 0DH,0AH DB N,' MENU ',0DH,0AH DB N, '------------------------------',0DH,0AH DB N,'| |',0DH,0AH DB N,'| 1.SENT |',0DH,0AH DB N,'| 2.RECIEVE |',0DH,0AH DB N,'| |',0DH,0AH DB N,' ------------------------------ ',0DH,0AH DB N,' CHOICE(1,2):$ ',0DH,0AH MESG3 DB 0DH,0AH,'PLEASE INPUT THE MESSEGE:',0DH,0AH,'$' MESG4 DB 0DH,0AH,'THE MESSAGE YOU INPUT ARE:',0DH,0AH,\DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LAST: 第 - 6 - 页 共 13 页
班级: 学号: 姓名: 日期:
DISP MESG1 ;显示操作信息,选择是内环自检还是双机通信 MOV AH,01H INT 21H ;等待键入一个字符,有回显,响应Ctrl_C CMP AL,'1' JE NEXT1 ;如果输入1,转测辅串口内环自检 CMP AL,'2' JE NEXT2 ;如果输入2,转双机通信 CMP AL,'3' JNE LAST JMP EXIT ;测试结束,退出 ;PC机辅串口的内环自检 NEXT1: CALL I8250 ;辅串口初始化 AGAIN: MOV CX, LLL ;电文长度→CX MOV BX, OFFSET TEXT ;BX指向TEXT的首地址 SCANT: MOV AH, 01H INT 16H ;查询键盘缓冲区 JNZ EXIT ;有键入,转退出 MOV DX, 2FDH IN AL,DX ;从DX指向的端口中读一个字节到AL TEST AL,20H ;检查发送保持寄存器是否空闲 JZ SCANT ;若不空闲,转SCANT输入检查 MOV DX, 2F8H ;发送保持寄存器辅串口地址->DX MOV AL, [BX] OUT DX,AL ;将字符送辅串口数据寄存器 MOV SI, 0 SCANR: MOV DX, 2FDH IN AL, DX ;读取通信线状态字 TEST AL,00011110B ;检查有无错误标志 JNZ DISPERR ;有错,显示出错信息 TEST AL,01H ;无错,检查接收数据是否准备好 JNZ RECEIVE ;准备好,转接收程序 DEC SI JNZ SCANR JMP DISPERR RECEIVE: MOV DX, 2F8H ;接收缓冲器辅串口地址->DX IN AL,DX ;接收一个数据 MOV AH, 2 MOV DL, AL INT 21H ;送屏幕显示一个字符 第 - 7 - 页 共 13 页
班级: 学号: 姓名: 日期:
INC BX LOOP SCANT ;一个电文长度计数 JMP AGAIN ;重复内环自检 DISPERR: DISP ERROR ;显示出错信息 EXIT: MOV AH, 4CH INT 21H ;返回DOS I8250 PROC MOV AX, 00C7H ;波特率4800,无校验传输,2个停止位,一桢字符有8个数据位,即为11000111B MOV DX,1 ;对辅串口进行初始化 INT 14H MOV DX, 2FCH ;MODEM控制寄存器辅串口地址->DX MOV AL, 00010000B ;D4=1,8250工作在内部自环方式 OUT DX,AL RET I8250 ENDP ;双机通信 NEXT2: DISP MESG2 ;显示操作信息,发送还是接收信息 MOV AH,1 INT 21H ;等待键入一个字符,有回显,响应Ctrl_C CMP AL,'1' JE SENDM ;当输入为1时,转发送信息 CMP AL,'2' JE RECEM ;当接受为2时,转接收信息 JMP NEXT2 SENDM: ;发送信息 MAIN: ;对8250主串口进行初始化。通信速率选用4800波特,无校验传输,一桢字符有8个数据位,2个停止位 MOV AL,80H MOV DX,3FBH OUT DX,AL ;80H->通信线控制寄存器,使寻址位为1 MOV DX,3F9H MOV AL,0 OUT DX,AL ;除数高8位->除数寄存器高8位 MOV DX,3F8H MOV AL,18H OUT DX,AL ;除数低8位->除数寄存器低8位 MOV AL,00000111B ;把命令字写入通信线控制寄存器 MOV DX,3FBH OUT DX,AL MOV DX,3F9H 第 - 8 - 页 共 13 页
班级: 学号: 姓名: 日期:
MOV AL,0 OUT DX,AL ;查询方式,置中断允许命令字为0 WAIT0: MOV AH,0BH INT 21H ;查询有无键盘输入,响应Ctrl_C CMP AL,0 ;AL=0时无输入,AL=0FFH时有输入 JE WAIT0 ;当无输入时,返回等待 MOV AH,0 INT 16H ;读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待 PUSH AX MOV AH,02H MOV DL,AL INT 21H ;DOS功能调用,显示一个字符,DL=待显示的ASCII码 POP AX CALL SENTCHAR JMP WAIT0 ;传输字符 ;从本机向对方发送字符串,同时在两个屏幕上都显示 ;按回车键,则双方都换行,按ESC键,双方都退出。 SENTCHAR PROC NEAR PUSH AX PUSH DS MOV AX,DATA MOV DS,AX PUSH BX PUSH CX PUSH DX DISP MESG3 ;显示提示信息 STATUE: ;读取通信线路状态,查询工作 MOV DX,3FDH IN AL,DX ;读通信线状态字 TEST AL,20H ;检测发送保持寄存器是否为空 JNZ KBOARD ;已空,转发送程序 KBOARD: MOV AH,0BH INT 21H ;查询有无键盘输入,响应Ctrl_C CMP AL,0 JZ KBOARD ;无字符输入,循环等待 MOV AH,0 ;有字符输入则读取字符 INT 16H ;读取键入的一个字符,无回显,响应Ctrl_C MOV DX,3F8H OUT DX,AL ;将字符写入到发送保持寄存器 CMP AL,1BH ;ESC的ASCII码为0011011B JZ DONE1 ;输入为ESC键,则退出程序返回DOS,同时对方也返回DOS 第 - 9 - 页 共 13 页