双机并口双工通信的设计与实现
2017-04-26汤浩霖
汤浩霖
摘要:并行数据传输是以计算机字长为单位的,适合微机与外部设备或微机与微机之间高速、近距离的通信。并行接口芯片8255A具有通用性强且使用灵活的特点,CPU可通过该芯片直接与外设相连接。该文从硬件设计与软件设计两方面进行了详细的阐述,主要利用并行接口芯片8255A设计了两台微机之间的双工通信接口电路,同时设计了双机的通信程序,实现了双机通过并口的双工通信。
关键词:双机并口通信;双工;8255A
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)06-0069-03
Abstract: The parallel data transmission is based on the computer word as a unit, suitable for high speed and short distance communication between the computer and the external device or computer with computer.The parallel interface chip 8255A has the characteristics of high universality and flexibility, and CPU can be connected directly with the peripheral devices. This paper gives a detailed exposition from two aspects of hardware design and software design, the main use of the parallel interface chip 8255A duplex communication interface circuit between two computer design, while the design of machine communication procedures, realizes the double duplex communication through parallel port.
Key words: dual parallel communication; duplex; 8255A
隨着时代的发展与科技的进步,微型计算机的使用日益普及,愈来愈多的人使用微机来工作或者学习。在我们的日常工作或学习之中,计算机设备间的信息交换是必不可缺的。计算机系统的信息交换方式有并行数据传输方式和串行数据传输方式这两种。其中,并行数据传输通常是以计算机的字长(常见有8位、16位或32位)为传输单位的,在一次传输过程中传输的数据长度为一个字长,因为多位数据一起传输,所以并行具有传输速度快的优点。8255A是与因特尔公司的微处理器配套的通用可编程并行接口芯片,因8255A具有通用性强、使用灵活的特点,具有广泛的应用。本文主要利用并行接口芯片8255A设计了两台微机之间的双工通信接口电路,并在接口电路的基础之上,设计了双机的通信程序,实现了双机通过并口的双工通信。
1 双机通信基本设计功能
使用两台微机通过两片并行接口芯片8255A进行双机通讯。将需要进行通信的两台微机分别规定为甲机与乙机。在进行通信时,甲机在键盘上输入信息后发送给乙机,乙机接收甲机发来的信息并将其显示在屏幕上,相同的,乙机也可以输入信息后发送给甲机,甲机接收乙机发来的信息后将其显示在屏幕上。甲机在发送状态下,可输入事先选定的控制字符切换到接收状态,乙机接收到甲机发来的控制字符后,转为发送状态;当乙机在发送状态时,也可输入控制字符切换到接收状态,甲机接收到乙机发来的控制字符后,转为发送状态;以此来实现双机收发的转换,完成半双工模式下的双机通讯。当按下ESC键时,结束通讯退出程序。
2 并行接口芯片8255A功能介绍
并行接口芯片8255A是一种常用的芯片,本文主要围绕该芯片进行接口电路设计,下面简单介绍该芯片的基本功能以及工作方式:
1)8255A接口芯片是具有40个引脚的双列直插式组件,有3个8位并行输入输入端口,可编程设置每个端口是输入还是输出。
2)8255A接口芯片可以适应CPU与输入输出接口之间多种数据传送方式的要求。例如无条件传送、查询方式传送、中断方式传送。和不同的传送方式相对应,芯片有方式0、方式1和方式2三种工作方式。在工作方式1和方式2下,8255A的C口比较特殊,它的部分信号线被用作专门的联络应答信号。
3)8255A接口芯片共有以下三种工作方式:
①方式0:基本输入输出方式。在方式0下不使用联络信号与中断,A口和B口都可作为输入或输出口,C口分成高四位与低四位,两个部分也都可分别作为为输入或输出口。在方式0下,每个口输出有锁存,输入只有缓冲,无锁存。方式0常用于与外设无条件地传送数据或外设数据的接收。
②方式1:选通输入输出方式。在方式1下,C口的某些位被占用,用作控制或状态信号线。当A口工作于方式1且用作输出口时,C口的PC7线用作输出缓冲器满信号OBF,PC6线用作外设收到数据后的响应信号ACK,PC3线用作中断请求输出信号INTR。当B口工作于方式1且用作输出口时,C口的PC1线用作输出缓冲器满OBF信号,PC2线用作外设收到数据后的响应信号ACK,PC0线用作中断请求输出信号INTR。
③方式2:双向选通传送方式。方式2是A口特有的工作方式。在该方式下,A口既可以发送数据,也可以接收数据。C口的5条信号线用作控制和状态信号线。
3 硬件设计
对于“并口双机通讯”,我们很自然地想到使用两台微机通过两片并行接口芯片8255A的连接来完成。当甲机发送乙机接收时,两机采用端口A的8根数据线来传输数据,甲机一侧的8255端口A采用方式1工作,乙机一侧的8255端口A采用方式0工作。当乙机发送甲机接收时,两机采用端口B的8根数据线来传输数据,乙机一侧的8255端口B采用方式1工作,甲机一侧的8255端口B采用方式0工作。
在通讯中,接口电路不仅需要数据端口,还需要状态端口。端口A在方式1输出时,用PC7和PC6分别固定作为联络线OBF和ACK,此时乙机8255的A口是方式0输入工作,我们选用引脚PC4和PC3作为联络线。虽然两侧的8255都设置了C口的某些引脚作为联络线,但是有本质上的差别。甲机的A口工作在方式1,其联络线是固定的不可替换的,而乙机的A口工作在方式0,其联络线是不固定的可选择的。当乙机8255的端口B在方式1输出时,用PC2和PC1作为联络线OBF和ACK,此时甲机8255的B口是方式0输入工作,我们选用引脚PC4和PC2作为联络线。
C口各联络信号的功能如下:
OBF—输出缓冲器满信号,低电平有效。当信号有效时,表示CPU已把数据输出给A口,数据等待被取走。它由输出信号WR的上升沿置成有效,由ACK的有效信号恢复为高电平。
ACK—响应信号,低电平有效。这是接收方的8255A给出的应答信号,通知发送方8255A端口的数据已经被接收。
INTR—中断请求信号,高电平有效。当接收方接收数据后,发送方的8255A输出此信号向CPU提出中断请求,要求CPU继续提供数据。当ACK为高,OBF为高,INTE为高(允许中断)时,使其有效,而写信号WR的下降沿使其复位。
INTE—中断允许位,由PC6的置位/复位信号控制。
4 程序设计
4.1 程序设计思路
在两台微机某一次通信的过程中,可以把一台微机视为发送方,而另一台微机视为接收方,在这次通信结束后,可以进行发送方与接收方的切换,使得刚才接收数据的微机可以发送数据,刚才发送数据的微机可以接收数据,实现双机的半双工通信。
发送方基本工作过程:8255A的初始化并把相应的控制位置位,读取从键盘输入的数据;将读入的第一个数据经8255的A口发送给接收端;检测接收端是否已接收数据,若未接收则循环检测;若已接收则按前面的方式继续发送数据。当发送端输入切换收发状态的控制字符时,发送端发送这个字符后进入接收状态。当发送端发送ESC键时,双方一起退出运行状态。
接收方基本工作過程:8255A的初始化并把相应的控制位置位;检测发送端是否有数据发送过来,若没有数据则循环检测,若有数据则向发送方发送已接收数据的信号,然后把相关的控制位置1,通过8255的A口读入数据并在显示器上显示出来;此时如果接收端接收到发送端发送的切换收发状态的控制字符,则进入发送状态。如果接收端接收到发送端的结束字符,则也相应地退出。
4.2 初始化程序
本次设计中8255片选地址为288H~28BH
1)甲机初始化8255:A口方式1输出、B口方式0输入
mov dx,28BH
mov al,0AAH
out dx,al
2)乙机初始化8255:A口方式0输入、B口方式1输出
mov dx,28Bh
mov al,9CH
out dx,al
4.3 C口联络信号控制
对于C口上作为联络线的引脚电平,必须在程序中按照时序予以准确的设置,对接收到的信号进行正确的分析,判断接收端与发送端的状态,在程序中安排正确的跳转。若对于C口引脚信号没有清楚的理解认识,是无法顺利完成双机的通讯。在本次设计中,这是非常重要的一点。
下面以甲机为例说明:
1)在开始发送前,对ACK信号(引脚PC6)置1:
mov dx,28BH
mov al,0dh
out dx,al
2)在开始接收前,对ACK信号(引脚PC5)置1:
mov dx,28bh
mov al,05h
out dx,al
3)检查接收端是否准备好:
mov dx,28Ah
in al,dx
and al,40h ;检查对方发来的信息PC3→PC6是否为0
jnz send ;若接收端准备好接收,则至转发送段
4)检查是否有要接收的数据:
mov dx,28Ah
in al,dx
and al,10h ;检查PC4
jnz Lr ;若PC4=1重复检查
(5)接收到数据后发送回答信号:
mov dx,28Bh ;发送回答信号ACK
mov al,00000100b ;PC5置0
out dx,al
nop
nop
mov al,00000101b ;PC5置1
out dx,al
此处使用nop是为了延时,使所产生的有效ACK信号(低电平)延续。
4.4 发送与接收字符
1)从键盘读取要发送的字符:
mov ah,0bh ;本机是否有任意键按下
int 21h
cmp al,0
je l ;若无键按下,则等待
mov ah,01 ;若有按键,回显至屏幕
int 21h
mov bl,al ;将按键字符保存至bl
send:mov dx,288h ;发送按键字符
mov al,bl
out dx,al
2)从数据端口读取字符,并显示在屏幕上:
mov dx,288h ;A口输入
in al,dx
mov dl,al
mov ah,02h ;显示1个字符
int 21h
4.5 收发状态转换
当甲机为发送方,乙机为接收方,双方需要进行收发的转换时:
1)甲机发送“!”字符,由发送变为接收:
mov dx,288h ;发送按键字符
mov al,bl
out dx,al
cmp al,21h ;字符是否是转换方式字符
jz receive ;若是则进入接收
2)在转换时一定要加延时,此处加入一个较大的延时来保证转换成功;同时需要往A口写入一个其他的字符码,否则之后的转换乙机会出现问题:
receive:
ddelay:mov cx,65535
lopp: loop lopp
mov dx,288h
mov al,0
out dx,al
3)乙机收到控制字符,由接收变为发送:
mov dx,288h ;A口输入
in al,dx
cmp al,1bh ;若是ESC键?则退出
jz over
cmp al,21H ;是否转发送
jz ssee
5 调试结果
在完成软硬件的设计后,开始进行调试工作。分別在两台微机上同时运行通信程序,开始时先设甲机为发送端,乙机为接收端。此时,甲机屏幕上显示“ Please input char: ”,提示用户键入信息;乙机屏幕上显示:”Now receiving ,please wait... ”,提示正在等待接收信息。在甲机键盘上输入字符,被键入的字符会同时显示在乙机的屏幕上。若甲机发送完毕,则键入预先设置的状态切换字符 ”!” ,甲乙两机切换发送接收状态。此时乙机屏幕上显示:“ Now input char: ”,甲机屏幕上显示:”Now receiving char... ”。在乙机键盘上输入字符,字符可同时显示在甲机的屏幕上。若向乙机输入预先设置的切换状态字符 ”@” ,则两机再次切换收发状态。按下ECS则退出程序,结束通讯。
运行结果符合预期,通过简单的人机交互,实现了双机通信的功能,达到了满意的效果。
参考文献:
[1] 郭兰英, 赵祥模. 微机原理与接口技术[M]. 2版. 北京:清华大学出版社, 2006.
[2] 钱晓捷, 陈涛. 16/32位微机原理与接口技术[M]. 北京:机械工业出版社, 2005.
[3] 陈益飞, 周锋. 微机原理与接口技术[M]. 北京:国防工业出版社, 2013.