并行接口.docx
- 文档编号:23416088
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:23
- 大小:253.19KB
并行接口.docx
《并行接口.docx》由会员分享,可在线阅读,更多相关《并行接口.docx(23页珍藏版)》请在冰豆网上搜索。
并行接口
转:
PC机标准并行接口的原理和应用
在PC机开始流行的几年前,Centronics公司制造出售过一种使用简单并行总线接口的打印机,这种并总线用于将一台计算机的数据传送到一台打印机上,同时它还能检测打印机的状态,一直到打印机空闲时才继续传送其它数据。
后来这种形式被很多打印机制造商和外设商所采用,很快就被制定为工业标准。
随着不同的接口形式在PC机中被应用,这种并行接口也一直不断的改进。
现在的PC电脑都会配备一个25针的并行接口,也称LPT口或打印接口,它现在一般都支持IEEE1284标准中定义的三种并行接口模式,分别为SPP(StandaraParallelPort)标准并行接口,EPP(EnhancedParallelPort)增强并行接口,ECP (ExtendedCapabilitiesPort)扩展功能并行接口。
ECP模式除了拥有双向数据传输的支持它还有特扩展的寄存器控制功能,使得传输速度从SPP模式的50KBit/秒提升到2MB/秒。
并行接口通常用于连接打印扫描设备或其它要求并行传输的外部设备。
如果我们了解它的工作原理和编程方法,就可以把方便用于电子制作中,用它进行数据传输或实现自动控制。
下面将以一个简单实例──简易8位LED数字显示牌,来说明PC机标准并行接口(SPP)的基本工作原理和编程方法。
制作实例
现在电脑已经是很普及的了,一些小型或个体商店也会用到电脑去处理进销存的账目,在一些场合中往往要让客人当场直观地知道要支付的金额或让客人查询商品的售价,这时就需要超市POS系统中的LED报价牌,但它的整个价格很高,我们在这里实验一个用电脑并口直接控制的简易8位LED数字显示牌,以此帮助大家更容易的理解电脑并行接口标准模式的基本工作原理。
图1:
元件
先来看看要用到的元器件。
请看图一和表一,图中就是部分的元件,它要用的元件确实很少,甚至没有用到一个电阻。
为了简化电路和充分利用电脑的接口,这里选用了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"同时显示的。
这就是动态显示的基本原理。
要想向计算并口输入或输出数据那么要对它进行编程。
那么下面我们来了解一下并口的原理和软件的编写方法。
图2:
USB接线用于取电
图3:
共阳极双七段LED的引脚定义和测量方法
图4:
电路图(点击放大)
图5:
制作成功的样品
图6:
演示程序
软件及接口工作原理
先来看看图七和图八,它们是常用的并行接口形式。
图七是PC后后面板上的DB25孔式并行接口,现在它通常都会整合在主机板上,要应用PC并口就是从这里取得,而在旧式的机器上则需外加打印卡或多功能卡取得,PC机要扩展多一个这样的接口也需要外加相应的板卡。
图八是用于连接PC主机和打印机(或其它外设)的连接线,由一个针式DB25接头和一个Centronics公接头组成。
图九是打印机(或其它外设)的Centronics母接头。
Centronics是一种36脚弹簧式接口引脚定义看表二。
图7:
PC后面板上的DB25并行接口
图8:
打印机连接线
图9:
打印机上的Centronics并行接口
本文的实例制作里选用了标准的并口模式――SPP模式,它是最简单的模式,它可以提供50KBits/秒的典型传输速度,其最高的传输速度可达150KBits/秒。
可进行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下运行,具体可以参看本文范例中的说明 )。
movdx,Address//Address为基地址(如为控制、状态地址时向指定口地址读写数据)
moval,Data//Data为要向基地输出非FFh的数据
outdx,al//向基地址写数据
inal,dx//读基地址数据
movResult,al//向主程序返回读出的数据,再用主程序比较Data和Result的值,若相同则该基地址可用
那么如何对端口读写数据呢?
在实例制作中程序又是如何控制并行接口引脚电平的呢?
SPP标准并行接口模式有三个寄存器,分别为数据寄存器,状态寄存器和控制寄存器(通常称为数据端口,状态端口,控制端口)。
在本文的实例中用到数据寄存器和控制寄存器,下面来看看它们的具体操作方法。
数据寄存器:
数据寄存器所占用的地址是并行接口的基地址,连接于接口的2-9针,如果你的并行接口不支持双向传输,则它只能输出数据。
当你向寄存器写一个八位二进制数时,这个二进制数的每一位的值分别对应设置该接口2-9针的电平状态,当数据为1时,引脚就被设定为高电平,数据为0时引脚则为低电平。
也就是说我们要想使引脚2,引脚4和引脚9为高电平时,就要向数据寄存器写二进制10000101(十进制为133,十六进制为85),可以用下面一段程序:
movdx,Address//Address为数据寄存器地址(LPT基地址)
moval,85H//数据
outdx,al//向数据寄存器写数据
在使用EPP或ECP模式下是,数据寄存器是支持双向传输的,这样它可以用来接收输入的电平状态,要注意的是在读入数据前时最好先把数据寄存器置为高电平(可以只单独设置要读取的数据位),然后可以用以下的语句去读取数据:
movdx,Address//Address为基地址(如为控制、状态地址时向指定口地址读写数据)
inal,dx//读基地址数据
movResult,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
SelectIn
H
Bit5
12
PaperOut
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
AutoLinefeed
L
Bit2
16
InitializePrinter(Reset)
H
Bit3
17
SelectPrinter
L
Bit4
/
EnableIRQViaAckLine
/
Bit5
/
Enablebi-directionalPort
/
Bit6
/
/
/
Bit7
/
/
/
表5 控制寄存器的相关参数
握手信号:
使用标准PC并行接口的打印机会用到Centronics标准的握手信号。
时序图见图十。
首先数据加到数据寄存器,然后检查Busy(引脚11)是否为高,为高打印机处在以下状态之一:
正在输入数据、正在打印操作、打印机出错、处在脱机状态,这时打印机不接收数据,Busy为低时,nStrobe(引脚1)输出一最小宽度大于1us的负脉冲,打印机随后接收数据并使Busy变为高,打印机接收完一个字节后回送给并行接口nAck(引脚10)一个宽度大于5us的响应负脉冲,这个信号可以被并行接口硬件反相之后作为IRQ中断信号或做为查询的状态信号,由于该信号的负脉冲较短,一般不会查询它,而是查询Busy。
打印机状态回复,准备接收下一个字节。
在应用标准并行接口的外部设备中并不一定就会用到这种握手信号,通常它们都有自己相应的握手信号,在我们自己的制作中也可以制定相应的握手信号,在本文的实例中就没有必要用到握手信号。
所谓的握手就是PC向设备查询设备的工作状态,PC再根据返回的信号做相应的操作。
图10:
握手信号时序
现在的板载的并行接口都会支持EPP和ECP模式,由于硬件上数据端口是支持双向传输的,所以在SPP模式下也可在数据端口中输入数据。
如果你用的是旧式的并行接口功能卡或你不想用数据端口输入数据,而又要用并行接口采集8Bit的数据时,还可以用以下的两种方法。
一种是用控制端口和状态端口的输入功能组成8Bit的数据输入,但要注意输入电平和所对应的数据位的相互关系,可以用软件进行调整控制。
另一种方式只用到状态端口做输入,因一次只能读取4Bit也就是半个字节,故又称NibbleMode。
具体电路图请参看图十一。
电路中用nStrobe控制74HC157(或74LS157)当前是读取前半个字节还是后半个字节,读取后只要把前后半个字节合并就可。
图11:
握手信号时序
软件实例
关于并口的简单编程在上面已做了介绍,在这里笔者提供实例演示程序源码和笔者在二年多前写的一个应用标准并口的小软件源码(界面图12),Port1.0不但可以控制数据口和控制口电平状态,还可以以方波图直观显示状态口引脚的电平状态,它是用BC++5.0编写的,本文的实例电路也可以借助它来进行测试,用来控制数据寄存器和控制寄存器来显示数字,在随刊光盘中附带如何借助它进行对实例电路的测试。
本文的演示程序是用delphi7.0编写,嵌入汇编,中用于win9x系统,编译后可以借助第三方软件运行在win2k或XP系统下,通过它在实例电路中显示输入的数字和PC机的日期时间。
笔者提供了源代码程序(随刊光盘),在这不能一一讲解,大家可以看附带的说明或访问笔者的网站以得到更多相关的文章和程序源码。
图12:
Port1.0并口小软件
图1:
电脑侧打印口示意图 (原文件名:
200832573749798.jpg)
并口彩图 (原文件名:
Ppdb25.png)
软件对应引脚 (原文件名:
Softwarepinout.png)
(原文件名:
1222.gif)
表中名称前有斜杠的表示低电平有效,寄存器位代表该引脚在8位寄存器中对应的位置。
打印口有3个端口:
数据端口、状态端口和控制端口,对应的3个寄存器地址分别为:
378H、379H和37AH。
其中378H可以写,部分电脑通过配置控制寄存器的第5位为1时可以读,部分电脑则不能读,只能写。
37AH可读可写,而379H为只读端口。
并口用作电脑打印机接口时,打印口各引脚的定义:
1. 选通, PC->Printer
2-9. 数据(D0-D7)
10 . 应答(ACK), Printer->PC
11. 忙(BUSY), Printer->PC
12. 无纸(PE), Printer->PC
13. 联机(SLCT), Printer->PC
14. 自动换行(AUTO FD), PC->Printer
15. 错误(ERROR), Printer->PC
16. 初始化(INIT), PC->Printer
17. 选择输出(SELECT IN) PC->Printer
18-25. 地(GND)
编程
PublicDeclareFunctionInpLib"inpout32.dll"_
Alias"Inp32"(ByValPortAddressAsInteger)AsInteger
PublicDeclareSubOutLib"inpout32.dll"_
Alias"Out32"(ByValPortAddressAsInteger,ByValValueAsInteger)' <====out()函数在这里
至于这个:
原帖由a5566255于2008-11-2721:
13发表
...
OutVal("&H378"),Val
(1)是把全部都置为高么?
OUT是汇编的用法吧,VB有这样的方法吗?
还是用来控制并口的?
怎么读取呢?
我先说明一下:
1、Out&H378,1不是全部置为高,而是把最低位置为高
2、Out&H378,0是把全部位置为低
3、Out不是汇编的用法(格式很象),VB也没有这样的方法,而且它确实是用来控制并口的。
它是在“inpout32.dll”中定义的,引用方法见本楼前半部分。
读取用的是它旁边的那个函数Inp()。
下面我详细解释一下,有点罗嗦,高手请飘过。
。
。
首先看输出函数Out():
格式:
Out(addr,data)
它有两个参数,第一个是“地址”。
这里的&H378表示16进制的378,是计算机并行口的“数据”地址,通过这个地址对并口收发数据。
除此之外,还有“状态”地址&H379和“控制”地址&H37A,用来执行打开或关闭端口等操作。
第二个参数是“数据”。
计算机的“并口”数据线宽度是1字节,也就是8位数据接口。
之所以叫“并口”或“或行接口”,就是因为它有8条“并在一起”的数据线,因此一次可以“同时”传送8位2进制数(1个字节)。
由于这个原因,第二个参数“数据”就不能超过1字节所能表示的范围,即只能是十进制0~255(表示二进制00000000~11111111)之间的一个数。
2进制这里本不想多讲了,但为解释LZ的问题,还有必要简单说一下。
详细内容请参阅相关资料。
10进制的计数规则是满10进1,第一位能表示的范围是0~9,超过9就需要向更高位进一位,变成10,高位加1,低位清0。
从低到高看,其每一位能表示的范围是:
个位(第1位)0~9,个位上每加减1表示的增量都
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并行 接口
![提示](https://static.bdocx.com/images/bang_tan.gif)