1、课 程 设 计课程名称 计算机接口与通信 题目名称 双机串行通信的实现 一. 课程设计的内容设计一套系统,要求能在两台计算机之间以中断方式和查询方式实现串行通信,数据可以采用 ASCII 字符方式和二进制方式传送。二. 相关技术1.使用芯片:Intel 8250 可编程异步通信接口、可编程中断控制器 8259A。2.编程环境:WINXP 操作系统。3.编程工具:MASM 5.0。4.Intel 8250 可编程异步通信接口:工作方式:异步串行通信每一个数据的传送是独立的,各数据的传送在时间上相互隔开,并且没有特定的时间联系。异步串行通信格式 (起始位 + 数据位 + 校验位 + 停止位)825
2、0 的初始化编程,主要步骤是:(1)确定波特率设置除数锁存器的分频值。为了能对除数锁存器写入,要先使通信线路控制寄存器的最高位为 1。 (2)设置通信的数据格式:通过对通信线路控制寄存器编程实现,而且要使它的最高位为 0,以便接下来对接收和发送缓冲器以及中断允许寄存器进行操作。 (3)如果使用中断,则设置中断允许寄存器的状态。若不使用中断,这个寄存器可设置成 0。 (4)设置调制解调器控制寄存器:通常,这个寄存器设定的值为 03H,使 8250 输出 DTR 和 RTS 这两个调制解调器控制信号。如果系统中不使用这两个信号,这样的设置也不会带来问题。如果使用中断,OUT2 位应设置为“1” ,
3、这样 8250 产生的中断信号可以通过系统总线送给 8259 中断控制器。三. 方案设计概要: 本程序采用 ASCII 字符方式传送数据.其中以查询方式或中断方式发送数据,以查询方式接收数据.查询方式发送数据:查询 8250 的发送保持寄存器是否为空,是就从数据缓冲区取一个数据发送到发送保持寄存器,然后数据传送到另一台的计算机的COM1 接口,另一台的机器就循环查询 8250 的接收保持寄存器是否接收保持寄存器接收数据就绪,就绪就输出一个数据,否则循环继续查询。中断方式发送数据:首先初始化 8250 接口,设置中断允许寄存器、调制解调器的控制寄存器、以及 8259 中断寄存器的屏蔽寄存器 IM
4、R(即开放 IR4) ,然后写中断向量表,编写中断服务子程序。当 8250 的发送保持寄存器为空时就产生一个中断请求,cpu 处理这个请求就从数据缓冲区取一个数据发送到发送保持寄存器,然后发送保持寄存器发送这个数据到与之相连的另一台机器的接收寄存器里,当接收寄存器的数据被读出时,发送寄存器就变为空,继续产生中断的请求,如此循环直到数据缓存区为空。注意,当一次中断完成时,要记得发送结束命令字给 8259 中断寄存器,否则,下一次的中断不会被响应。四. 实现与测试(1)实现.MODEL SMALL.386.STACK.DATAN EQU 18 DUP( )MESSAGE DB Serial com
5、munication via COM1,baud rate is 9800, no parity,1 stop bit,character length is 8 bit.,0AH,0DH,0AH,0DHDB Press ESC to Exit.,0AH,0DH,0AH,0DH,0AH,0DHDB N, MENU ,0DH,0AHDB N, *,0DH,0AHDB N,* * ,0DH,0AHDB N,* 1.Through interrupted transmission. * ,0DH,0AH DB N,* 2.Through query transmission. * ,0DH,0AHD
6、B N,* 3.RECEIVE * ,0DH,0AHDB N,* *,0DH,0AHDB N,*,0DH,0AHDB Chose the way:,$MESSAGE2 DB Please press any key to back MENU,$RECE DB Receive:,0AH,0DH,$SEND DB Send:,0AH,0DH,$SENDDATA DB 200 DUP(?)FLAG DB 0 ;-.CODEMAIN PROC FARSTART:;INITTIALING COM1MOV DX,3FBHMOV AL,80HOUT DX,AL;使通信线路寄存器最高位置1MOV AL,0MO
7、V DX,3F9HOUT DX,AL;设置波特率高位MOV AL,0CHMOV DX,3F8HOUT DX,AL;设置波特率低位MOV DX,3FBHMOV AL,03HOUT DX,AL;设置数据格式为8位/字符,1个停止位,无奇偶效验MOV DX,3FCHMOV AL,08HOUT DX,AL;设置调制解调器控制寄存器,RTS,DTR无效;CHOSE THE WAYDIS:MOV AX,DATAMOV DS,AXMOV AH,09MOV DX,OFFSET MESSAGEINT21HAGAIN:MOV AH,07H ;选择传送数据方式INT 21HMOV AH,02H ;CMP AL,31
8、H ;输入是否1JE CLEAR ;是,跳转到CLEARCMP AL,32H ;输入是否2JE CLEAR ;是,跳转到CLEARCMP AL,33HJE THREECMP AL,1BHJE EXITJMP AGAIN ;不是输入1或2或ESC 键,不响应要求THREE:CALL CURSORMOV DX,OFFSET RECE ;输出字符串RECEIVEMOV AH,09HINT 21H SEND1:MOV DX,3FDH ;DX指向通信线路状态寄存器IN AL,DX ;读入通信线路状态TEST AL,01H ;测试接收数据是否就绪JZ SEND1 CALL RECEIVE ;就绪,读出数据
9、CMP AL,0DH JNE SEND1MOV DX,OFFSET MESSAGE2 ;输出字符串MESSAGE2MOV AH,09HINT 21H MOV AH,07HINT 21HCALL CURSORJMP DIS CLEAR:PUSH AXCALL CURSORMOV DX,OFFSET SEND ;输出字符串SENDMOV AH,09HINT 21H POP AX CMP AL,31HJE INTERRUPTCMP AL,32HJE STATUESTATUE:MOV FLAG ,1MOV AH,02H ;置光标在1行0列MOV BH,0MOV DH,1MOV DL,0 INT 10H
10、CALL INPUT ;调用输入数据子程序SEND2:MOV DX,3FDH ;DX指向通信线路状态寄存器IN AL,DX ;读入通信线路状态TEST AL,20H ;测试发送保持寄存器是否为空JZ SEND2 ;不为空, 继续查询MOV DX,3F8H ;DX指向发送保持寄存器MOV AL,SI ;从数据存储区取一个字符OUT DX,AL ;发送INC SI ;数据存储区地址向前移一位CMP AL,0DH ;是否回 车键 JE STATUE ;是,说明数据传输结束,返回执行下一次数据传送JMP SEND2 ;否, 继续查询发送数据JMP STATUE INTERRUPT:MOV FLAG,1
11、PUSH DS ;保存当前数据段的段地址MOV AX,0 MOV DS,AX ;DS指向 0段MOV AX,OFFSET INTERRUPTION ;设置中断向量表MOV DS:30H,AX ;存入至中断向量表MOV DS:32H,CS POP DS ;存入中断服务程序的段值IN AL,21H ;读入8259的屏蔽寄存器AND AL,11101111B ;开放IRQ4,即COM1的中断请求OUT 21H,AL ;数据送至8259 屏蔽寄存器LOCATE:MOV AH,2 ;to locate cursor(置光标在 1行0列)MOV BH,0MOV DH,1MOV DL,0INT 10H CA
12、LL INPUT ;调用数据输入函数MOV DX,3F9H ;dx指向适配器的中断允许寄存器MOV AL,02H ;允许发送保持寄存器空中断OUT DX,AL ;数据送至中断允许寄存器STI ;开中断JMP LOCATE ;返回继续输入数据MOV DX,3F9H ;DX指向适配器的中断允许寄存器MOV DL,0 ;不允许任何中断OUT DX,AL ;数据送至中断允许寄存器IN AL,21H ;读 入8259的屏蔽寄存器OR AL,00010000B ;关闭IRQ4的中断请求OUT 21H,AL ;数据送至8259屏蔽寄存器INTERRUPTION PROC NEAR ;中断服务子程序 MOV
13、AL,DS:SI ;读入缓冲区的数据INC SI ;地址加1MOV DX,3F8H ;输出数据到发送保持寄存器OUT DX,ALMOV BL,ALMOV AL,20H ;发送结束命令EOI,恢复服 务 寄存器OUT 20H,ALSTIMOV AL,BLCMP AL,0DHJNE RMOV DX,3F9HMOV AL,0OUT DX,ALR: IRETINTERRUPTION ENDPCLEAN PROC NEARMOV AL,0 ;初始化窗口MOV BH,7MOV CH,1MOV CL,0MOV DH,0BHMOV DL,79MOV AH,6INT 10H;to locate cursor(置
14、光标位置,位于0行0列)MOV AH,2MOV BH,0MOV DH,0MOV DL,0INT 10HRETCLEAN ENDPINPUT PROC NEAR MOV SI,OFFSET SENDDATA REP1:MOV AH,01H ;从键盘输入数据并回显INT21H CMP AL,1BH ;是否键入ESC键JE EXIT ;是,退去程序MOV SI,AL ;否则,把输入的数据存放到一个缓冲区INC SI ;缓冲区地址自增1CMP AL,0DH ;是否回 车键JNE REP1 ;否,继续输入数据MOV SI,OFFSET SENDDATA ;SI寄存器重新返回数据存储区的首地址CALL C
15、LEAN RETINPUT ENDPCURSOR PROC NEARMOV AL,0 MOV AH,06HMOV BH,07HMOV CH,0MOV CL,0MOV DH,24MOV DL,79INT 10HMOV AH,2 ;置光标在0行0列MOV DX,0 MOV BH,0INT 10H RET CURSOR ENDPRECEIVE PROC NEAR ;接收数据子程序CHECK:MOV DX,3FDH ;通信线路状态寄存器IN AL,DX ;读入线路状态TEST AL,01H ;测试是否已接收到数据JZ CHECK ;为0,表示数据 还没有传送过 来MOV DX,3F8H ;dx指向接收数据寄存器IN AL,DX ;读入数据到ALAND AL,7FH ;取字符的ASCII码MOV DL,AL ;输出数据MOV AH,2INT21HCMP AL,0DHJNE REMOV AH,02HMOV DL,0AHINT 21HMOV DL,0DHINT 21HRE: RET ;返回调用程序RECEIVE ENDP EXIT: