|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
转:PC机标准并行接口的原理和应用
在PC机开始流行的几年前,Centronics公司制造出售过一种使用简单并行总线接口的打印机,这种并总线用于将一台计算机的数据传送到一台打印机上,同时它还能检测打印机的状态,一直到打印机空闲时才继续传送其它数据。后来这种形式被很多打印机制造商和外设商所采用,很快就被制定为工业标准。随着不同的接口形式在PC机中被应用,这种并行接口也一直不断的改进。现在的PC电脑都会配备一个25针的并行接口,也称LPT口或打印接口,它现在一般都支持IEEE1284标准中定义的三种并行接口模式,分别为SPP(Standara Parallel Port)标准并行接口,EPP(Enhanced Parallel Port)增强并行接口,ECP (Extended Capabilities Port)扩展功能并行接口。ECP模式除了拥有双向数据传输的支持它还有特扩展的寄存器控制功能,使得传输速度从SPP模式的50K Bit/秒提升到2MB/秒。并行接口通常用于连接打印扫描设备或其它要求并行传输的外部设备。如果我们了解它的工作原理和编程方法,就可以把方便用于电子制作中,用它进行数据传输或实现自动控制。下面将以一个简单实例──简易8位LED数字显示牌,来说明PC机标准并行接口(SPP)的基本工作原理和编程方法。
制作实例
现在电脑已经是很普及的了,一些小型或个体商店也会用到电脑去处理进销存的账目,在一些场合中往往要让客人当场直观地知道要支付的金额或让客人查询商品的售价,这时就需要超市POS系统中的LED报价牌,但它的整个价格很高,我们在这里实验一个用电脑并口直接控制的简易8位LED数字显示牌,以此帮助大家更容易的理解电脑并行接口标准模式的基本工作原理。
先来看看要用到的元器件。请看图一和表一,图中就是部分的元件,它要用的元件确实很少,甚至没有用到一个电阻。为了简化电路和充分利用电脑的接口,这里选用了USB取电,把USB连线的一头剪下,可以看到有红黑绿白,四根不同颜色的线,黑色为地线,红色为+5V,其余为信号线不选用(焊接操作时应小心不要把它接反在电路上,避免损坏USB口和并口可以加整流二极管以防反接)。共阳极双七段LED的引脚定义请看图三左半部,而右半部是测量其好坏的示意图,数字万用表打到测二极量档,这时红表笔有一个正电压(普通万用表则可以使用电阻档,黑表笔有正电压),用红表得笔接触LED阳极V(Vcc),黑表笔分别接触各个笔划,各笔划亮时为好,否则为坏。制作中也可以使用共阴极的七段LED,只要在软件发送数据时取反就行了。因用到二个IC和八个LED如用万用板去制作连线很多,有条件可以自己制板,如你只要了解并口的原理也可以只接一个LED以简化电路。笔者则是使用一块从仪表拆下旧的8位数字LED印刷电路板,最终的实验成品和演示程序请看图五图六。
元 件 | 用 量 | 备 注 | DB25孔式插座 | 1 | 也可以用针式 | 双DB25针式插头连线 | 1 | 用于连接 | 74HC373 | 2 | 74LS373也可 | 20脚IC座 | 2 | 可省 | 双七段LED | 4 | 共阳极(单个的要8个) | USB接线 | 1 | 用于取电,没有USB接口用+5V电源替代 | 万用板 | 1 | 可以自行蚀刻电路 |
表一 元件表
这个电路的原理也是很简单的。先来看看图四的电路图。IC1和IC2为74HC373三态八D锁存器,电路中只用到输出态和锁存态,而没有使用到高阻态的控制,所以芯片上输出控制端(1脚)只要接地就行了。IC1是用来控制七段LED的阳极电压的,IC2是用来控制七段LED的笔划的。具体的控制过程为:第一步:软件置并口16脚为高电平,17脚为低电平,这时IC1为输出态,IC2为锁存态,送选择显示位数据到LPT2-9脚,D0-D7对应8个LED,因这时IC1为输出态故数据输出到IC1的Q0-Q7,IC2不受影响。第二步:置并口16脚为低电平,17脚为高电平,这时IC1的数据被锁存,IC2为输出态,此时送笔划数据到D0-D7,重复第一步时,IC2的数据被锁存。如此时IC1的Q0为高电平,IC2的Q1、Q2为低电平,那么DS1号LED的b和c笔划段被点亮,显示"1"字符。若这时置IC1为输出态,输入数据置IC1的Q1为高电平其它为低电平,"1"字符便会移到第2个LED上显示,只要数据改变的快,人眼看起来就是二个"1"同时显示的。这就是动态显示的基本原理。
要想向计算并口输入或输出数据那么要对它进行编程。那么下面我们来了解一下并口的原理和软件的编写方法。
软件及接口工作原理
先来看看图七和图八,它们是常用的并行接口形式。图七是PC后后面板上的DB25孔式并行接口,现在它通常都会整合在主机板上,要应用PC并口就是从这里取得,而在旧式的机器上则需外加打印卡或多功能卡取得,PC机要扩展多一个这样的接口也需要外加相应的板卡。图八是用于连接PC主机和打印机(或其它外设)的连接线,由一个针式DB25接头和一个Centronics公接头组成。图九是打印机(或其它外设)的Centronics母接头。Centronics是一种36脚弹簧式接口引脚定义看表二。
本文的实例制作里选用了标准的并口模式――SPP模式,它是最简单的模式,它可以提供50K Bits/秒的典型传输速度,其最高的传输速度可达150K Bits/秒。可进行9Bits的并行输入和12Bits的并行输出。通常可选择Nibble(4bits)或Byte(8bits)的方式进行输入数据,还有一种Bi-directional的双向传输方式,这种方式需硬件支持(现在的板载LPT通常在SPP模式下也是可以进行双向传输的)。SPP硬件是由8条数据线,4条控制线和5条状态线所组成,它们分别对应三个不同的寄存器来进行数据的读写操作。表二是并行接口引脚定义表。
并行接口输出的是TTL标准的逻辑电平,输入信号也要符合TTL标准。这种特性可以使接口容易应用在电子设计中。大部分的PC并行接口能吸收和输出12mA左右的电流,如应用时小于或大于这个值,应使用缓冲电路。
针脚(Centronics) | 针脚(D-Type25) | I/O | SPP信号 | 寄存器 | 硬件反转 | 1 | 1 | 输入/输出 | nStrobe选通 | 控制 | 是 | 2 | 2 | 输出/* | Data0数据位0 | 数据 |
| 3 | 3 | 输出/* | Data1数据位1 | 数据 |
| 4 | 4 | 输出/* | Data2数据位2 | 数据 |
| 5 | 5 | 输出/* | Data3数据位3 | 数据 |
| 6 | 6 | 输出/* | Data4数据位4 | 数据 |
| 7 | 7 | 输出/* | Data5数据位5 | 数据 |
| 8 | 8 | 输出/* | Data6数据位6 | 数据 |
| 9 | 9 | 输出/* | Data7数据位7 | 数据 |
| 10 | 10 | 输入 | nAck确认 | 状态 |
| 11 | 11 | 输入 | Busy忙 | 状态 | 是 | 12 | 12 | 输入 | Pager-Out | 状态 |
|
|
|
| Pager-End缺纸 |
|
| 13 | 13 | 输入 | Select选择 | 状态 |
| 14 | 14 | 输入/输出 | nAuto-Linefeed | 控制 | 是 |
|
|
| 自动换行 |
|
| 32 | 15 | 输入 | nError/nFault | 状态 |
|
|
|
| 错误 |
|
| 31 | 16 | 输入/输出 | nInitialize初始化 | 控制 |
| 36 | 17 | 输入/输出 | nSelect-Printer | 控制 | 是 |
|
|
| nSelect-In选择输入 |
|
| 19-30 | 18-25 | Gnd | Ground信号地 |
|
|
表2 D型25针和36针Centronics的针脚定义 表注:没有在表中列出的Centronics引脚定义有:15保留(悬空),16逻辑地,17机壳地,18保留(悬空),33地,34保留(悬空),35 +5V。表中"I/O"栏中的"*"表示如果并行接口支持双向传输则该引脚可以输入数据,表中"SPP信号"栏中,信号名称前的"n"表示该信号是低电平有效的。例如"nError"表示如果打印机出错则这个针脚将为低电平,正常为高电平(这里的信号是指定于打印机的,其它的外设可能有不同的定义)。表中的"硬件反转"栏所表示的意思是,输入的信号先被并行接口硬件反相再送到相应的寄存器。例如"Busy",外部设备输入一个逻辑信号1(TTL+5V逻辑电平),信号被反相送入状态寄存器,这时读状态寄存器Bit7(最后一位)为0,如输入信号为0,Bit7的值则为1。 现在整合在主板上的并行接口通常可以选择使用3BCh,378h和278h这三个基地址,它们几乎都支持SPP,ECP和EPP模式,你可以在BIOS设置为并行接口选择基地址(地址值为16进制数加"h"表示)。3BCh这个地址在早期的并口打印机适配器上是不支持EPP和ECP模式的。在实例程序中使用了直接检测端口的方法来检测并行接口基地址分配,其方法是向基地址写一个非FFh的值,再读出该基地址的值,如果读出的是写入的值而不是FFh,表明地址是可用的。这种方法在DOS或Win9x系统是很容易实现的,在WinNT或Win2000下可用第三方写端口控件或自行编写有Ring0特权的程序。下面一段检测基地址的汇编修改一下可以镶入到C,VC++,Delphi,C++Builder中(只能在Win9X或Dos下正常运行,若用软件也可以使其在win2k或xp下运行,具体可以参看本文范例中的说明 )。
mov dx,Address //Address为基地址(如为控制、状态地址时向指定口地址读写数据)
mov al,Data //Data为要向基地输出非FFh的数据
out dx,al //向基地址写数据
in al,dx //读基地址数据
mov Result,al //向主程序返回读出的数据,再用主程序比较Data和Result的值,若相同则该基地址可用
那么如何对端口读写数据呢?在实例制作中程序又是如何控制并行接口引脚电平的呢?
SPP标准并行接口模式有三个寄存器,分别为数据寄存器,状态寄存器和控制寄存器(通常称为数据端口,状态端口,控制端口)。在本文的实例中用到数据寄存器和控制寄存器,下面来看看它们的具体操作方法。
数据寄存器:
数据寄存器所占用的地址是并行接口的基地址,连接于接口的2-9针,如果你的并行接口不支持双向传输,则它只能输出数据。当你向寄存器写一个八位二进制数时,这个二进制数的每一位的值分别对应设置该接口2-9针的电平状态,当数据为1时,引脚就被设定为高电平,数据为0时引脚则为低电平。也就是说我们要想使引脚2,引脚4和引脚9为高电平时,就要向数据寄存器写二进制10000101(十进制为133,十六进制为85),可以用下面一段程序:
mov dx,Address //Address为数据寄存器地址(LPT基地址)
mov al,85H //数据
out dx,al //向数据寄存器写数据
在使用EPP或ECP模式下是,数据寄存器是支持双向传输的,这样它可以用来接收输入的电平状态,要注意的是在读入数据前时最好先把数据寄存器置为高电平(可以只单独设置要读取的数据位),然后可以用以下的语句去读取数据:
mov dx,Address //Address为基地址(如为控制、状态地址时向指定口地址读写数据)
in al,dx //读基地址数据
mov Result,al //向主程序返回读出的数据
以上的读写程序同样适用于下面介绍的控制寄存器和状态寄存器,只要把Address的值改为相应的寄存器地址就可以了。这里所说的读就是从寄存器返回一个值,这个值就是所对应的引脚逻辑电平值,写就是向寄存器发送一个值,这个值将会反映到相对应的引脚上,引时引脚逻辑电平的高低变化。知道这些我们就可以明白如何控制实例电路显示数字了。如要在最右边的第一位显示"8",先要得知"8"在共阳极七段LED中的编码,因是共阳极的所以要显示"8"就要要求abcdefg极为低电平,在这个电路编码就为10000000(十进制为128),也就是说要IC2的Q0-Q7的电平为这个值。同时还要求VCC为高电平也就是IC1的Q0端为高电平。要满足这个要求先要向LPT控制寄存器写12,这时LPT16脚为高电平,17脚为低电平,IC1为输出态,IC2为锁存,送1到数据寄存器,此时IC1的Q0为高电平,向控制寄存器写0,IC1为锁存,IC2为输出态,是写128到数据寄存器,这时IC2输出脚电平符合要求,LED显示"8"。具体的编程方法请看所附例程。
地址 | I/O | 数据位 | 引脚 | SPP信号 | 数据位为1时引脚电平状态 | 基地址 | 输出
(如果并口支持双向
传输则也可输入数据) | Bit0 | 2 | Data0 | H (H为高电平,L为低电平) | Bit1 | 3 | Data1 | H | Bit2 | 4 | Data2 | H | Bit3 | 5 | Data3 | H | Bit4 | 6 | Data4 | H | Bit5 | 7 | Data5 | H | Bit6 | 8 | Data6 | H | Bit7 | 9 | Data7 | H |
表3 数据寄存器的相关参数 状态寄存器:
状态寄存器占用的地址是基地址加一,与接口的10,11,12,13,15针相连,这个寄存器是只读寄存器,在用于打印机驱动时用来取得打印机的当前状态,如出错、选中、缺纸等等。该寄存器中包含一个IRQ中断寄存器(由Ack相反后形成),当有中断发生这个数据位为"0"。在读入数据时要注意的是Bit7(引脚11)在输入+5VTTL电平时,数据值为"0",有反转的特性。
地址 | I/O | 数据位 | 引脚 | SPP信号 | 数据位为1时引脚电平状态 | 基地址+1 | 输入 | Bit0 | / | 保留 | / | Bit1 | / | 保留 | / | Bit2 | / | IRQ (Not) | / | Bit3 | 15 | Error | H | Bit4 | 13 | Select In | H | Bit5 | 12 | Paper Out | H | Bit6 | 10 | Ack | H | Bit7 | 11 | Busy | L |
表4 状态寄存器的相关参数 控制寄存器
控制寄存器占用的地址是基地址加二,与接口的1,14,16,17针相连,寄存器可读写。其中Bit0,Bit1,Bit3有反转的特性。通常用于打印机控制时,这个端口只用发送控制数据,如初始化机印机、自动换行等。这个端口还有高阻特性,在应用时可以根据要求加电阻,以使电平足够高或足够低。Bit4为IRQ应用,当向Bit4写入"1"时,将使ACK(引脚10)信号反相后成为中断请求IRQ信号,通常为IRQ5或IRQ7。在本文中的实例里,用到LPT16,17引脚去控制IC1和IC2的控制端,无论是使用那一个寄存器在程序的编写过程中一定要注意引脚电平和数据位的相互关系,否则就得不到想要的电平或数据。
地址 | I/O | 数据位 | 引脚 | SPP信号 | 数据位为1时引脚电平状态 | 基地址+2 | 输入/输出 | Bit0 | 1 | Strobe | L | Bit1 | 14 | Auto Linefeed | L | Bit2 | 16 | Initialize Printer (Reset) | H | Bit3 | 17 | Select Printer | L | Bit4 | / | Enable IRQ Via Ack Line | / | Bit5 | / | Enable bi-directional Port | / | Bit6 | / | / | / | Bit7 | / | / | / |
表5 控制寄存器的相关参数 握手信号:
使用标准PC并行接口的打印机会用到Centronics标准的握手信号。时序图见图十。首先数据加到数据寄存器,然后检查Busy(引脚11)是否为高,为高打印机处在以下状态之一:正在输入数据、正在打印操作、打印机出错、处在脱机状态,这时打印机不接收数据,Busy为低时,nStrobe(引脚1)输出一最小宽度大于1us的负脉冲,打印机随后接收数据并使Busy变为高,打印机接收完一个字节后回送给并行接口nAck(引脚10)一个宽度大于5us的响应负脉冲,这个信号可以被并行接口硬件反相之后作为IRQ中断信号或做为查询的状态信号,由于该信号的负脉冲较短,一般不会查询它,而是查询Busy。打印机状态回复,准备接收下一个字节。在应用标准并行接口的外部设备中并不一定就会用到这种握手信号,通常它们都有自己相应的握手信号,在我们自己的制作中也可以制定相应的握手信号,在本文的实例中就没有必要用到握手信号。所谓的握手就是PC向设备查询设备的工作状态,PC再根据返回的信号做相应的操作。
现在的板载的并行接口都会支持EPP和ECP模式,由于硬件上数据端口是支持双向传输的,所以在SPP模式下也可在数据端口中输入数据。如果你用的是旧式的并行接口功能卡或你不想用数据端口输入数据,而又要用并行接口采集8Bit的数据时,还可以用以下的两种方法。一种是用控制端口和状态端口的输入功能组成8Bit的数据输入,但要注意输入电平和所对应的数据位的相互关系,可以用软件进行调整控制。另一种方式只用到状态端口做输入,因一次只能读取4Bit也就是半个字节,故又称Nibble Mode。具体电路图请参看图十一。电路中用nStrobe控制74HC157(或74LS157)当前是读取前半个字节还是后半个字节,读取后只要把前后半个字节合并就可。
|
软件实例
关于并口的简单编程在上面已做了介绍,在这里笔者提供实例演示程序源码和笔者在二年多前写的一个应用标准并口的小软件源码(界面图12),Port1.0不但可以控制数据口和控制口电平状态,还可以以方波图直观显示状态口引脚的电平状态,它是用BC++5.0编写的,本文的实例电路也可以借助它来进行测试,用来控制数据寄存器和控制寄存器来显示数字,在随刊光盘中附带如何借助它进行对实例电路的测试。本文的演示程序是用delphi7.0编写,嵌入汇编,中用于win9x系统,编译后可以借助第三方软件运行在win2k或XP系统下,通过它在实例电路中显示输入的数字和PC机的日期时间。笔者提供了源代码程序(随刊光盘),在这不能一一讲解,大家可以看附带的说明或访问笔者的网站www.cdle.net以得到更多相关的文章和程序源码。
|
|
|