购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.1 I/O接口

P89V51上有四个 8位I/O接口,每个都有不同特色的驱动/输入电路。所有的端口都与标准的8051双向功能为特色的驱动/输入电路相同。每个口都包含一个锁存器,即专用(特殊)寄存器P0~ P3,输出驱动器和输入缓冲器。以后除非特别注明,我们把 4个端口(引脚)和相应的专用寄存器,输出驱动器和输入缓冲器表示为P0~ P3。

在有外部存储器时,P0和P2口作为访问外部存储器的地址总线和数据总线,P2口给出 16位地址总线的高 8位,P0口给出地址总线的低 8位,P0口分时作为数据总线。P3口中的P3.6和P3.7则分别作为控制总线中的数据写 和读 控制信号。控制总线中的程序(代码)读和锁存信号则有专门的引脚 和ALE提供。

4.1.1 P0口

如图 4-1所示为P0口中一位口线的结构,其中包括一个输出锁存器、两个三态缓冲器、一个由一对场效应管(FET)组成的输出驱动电路和一个输出控制电路。输出驱动电路由输出控制电路控制。输出控制电路包括一个与门、一个反相器和一个多路切换开关(MUX)。

P0口有两种工作状态:作为地址/数据总线和作为通用输入/输出(I/O)接口。P0的工作状态由CPU通过MUX来控制。

当MUX处于图 4-1所示的位置时,P0口作为通用输入/输出(I/O)接口,此时P0口的输出级中的上拉FET处于截止状态,因此输出级是漏极开路的开漏电路。当CPU向P0口写数据时,数据由内部总线写到P0口锁存器,P0口锁存器的输出 经过MUX驱动输出电路,而输出电路正好是反相输出,所以P0口引脚上出现的数据正好是内部总线的数据。由于P0口是开漏输出,驱动TTL电路时可以驱动 8个LS TTL电路的输入端。但在驱动NMOS电路时一定要加上拉电阻。

图 4-1 P0口中一位口线的结构

(1)P0口作为普通I/O接口使用时,输入数据有两条途径输入到CPU

① CPU通过图 4-1中下方的缓冲器直接读P0口引脚的数据。完成直接P0口引脚数据读操作的指令有MOV A,P0;MOV C,P0.n等。

②通过上方的缓冲器把P0口的锁存器的输出(Q)经过内部总线读到CPU中。这样设计的目的是为了实现“读—改—写”一类指令。这类指令的目的是在I/O接口原有的输出状态的基础上进行某种逻辑电平的修改,其操作的特点:先把锁存器的数据读入,然后根据具体指令的要求作相应地修改,再把修改后的数据写回锁存器并驱动口线。如CPL P0.n;ANL P0,A等指令就属于“读—改—写”指令。这些指令用于P1、P2和P3口时也是同样操作的。这一类指令有ANL、XAL、CPL、DEC、DJNZ、INC、JBC,布尔操作指令MOV PX.Y,C;CPL PX.Y;CLR PX.Y和SETB PX.Y。

与“读—改—写”有关的两点注意事项如下:

●“读—改—写”指令的操作特点可以避免错读口线的可能。如用口线驱动一枚三极管的基极时,假设先用“1”(高)电平驱动,然后要用反相的电平去驱动,如果不是读锁存器而是读口线,虽然已用高电平驱动口线,但口线已被三极管的基极拉到低电平,因而并没有读到单片机给出的状态,此时读锁存器就不会有此问题。

●口线作为输入时,必须先向口线写“1”。如果前面已向端口写“0”或读入过“0”电平,此时输出级FET是导通的,引脚始终被钳位在低电平上,CPU永远只能读到“0”电平,除非外部电路具有极强的驱动能力,把口线强行拉到高电平。由于此时输出级FET工作在开漏状态,在从口线输入信号前先写“1”电平,并不会对外部电路造成什么影响。如果外部电路驱动口线高电平,两者都是高电平,不会有任何影响;如果外部电路驱动口线低电平,而P0口的驱动电路虽然输出高电平,但其持续时间很短,不到 1μs,又是驱动能力很弱的开漏输出,在下一条指令执行前就被外部电路拉到低电平,甚至在写“1”电平时口线就压根儿没有上到高电平去。综上所述,在从口线输入信号前先写“1”电平是不会对外部电路造成任何影响的。

这两点对于P1~ P3同样适用。

(2)P0口作为地址/数据总线时也可分为两种情况

①从P0口输出低 8位地址和数据。这时CPU给出工作信号使MUX切换到上端,内部的地址/数据总线通过反相器驱动输出级FET,同时控制信号打开与门使驱动级上端的FET也受内部的地址/数据总线的驱动,不难得到,引脚上的状态与内部的地址/数据总线完全相同。

②从P0口输入数据。口线上的数据通过下方的缓冲器输入到内部总线。

最后要指出的是:不论P0口是用做通用I/O接口线还是作为地址/数据总线,并不需要用专门的指令去设置。当单片机执行到具体的指令时会自动地产生控制信号使MUX切换到相应的位置,如执行MOVX指令时MUX自动切换到上方。不论是作为输入还是作为输出,单片机在执行到具体的指令时会自动地选择途径和执行相应的操作。仅仅作为通用I/O口线输入时,应向口线先写入“1”。这些同样适用于P1~ P3口。

4.1.2 P1口

如图 4-2所示为P1口中一位口线的结构,其中包括一个输出锁存器、两个三态缓冲器、一个由一枚场效应管(FET)和内部上拉电阻组成的输出驱动电路。与P0口不同的是,P1口没有输出控制电路,但有特殊的内部上拉电阻。内部上拉电阻由两部分组成:固定部分和附加部分,它们都是由作为电阻的场效应管构成的,如图 4-3所示。因而P1口是“准”双向口,而P0口是“真正”的双向口,这是由于P0作为输入时,输出级的两枚场效应管都处于截止状态,其引脚是“悬浮”的,而P1口(P2和P3也是一样的)有内部上拉电阻,在作为输入时,虽然输出级的场效应管也处于截止状态,但有内部固定的上拉电阻使得管脚不会处于“悬浮”状态,而是具有微弱驱动能力(或对于外部驱动电路来说有一定的负载)。

图 4-2 P1口中一位口线的结构

由图 4-3可知,上面 3枚FET是P型沟道增强型管(pFET),下面一枚是N型沟道增强型管(nFET)。应该说明的是,当“1”电平加在nFET栅极时,nFET管导通;而当“1”电平加在pFET栅极时,pFET管截止。

如果起始状态端口的数据为“0”,这时锁存器的输出 为“1”,nFET管导通,pFET1管和pFET2管截止,而pFET3管的栅极得到的是 两次反相后的信号,所以pFET3管也截止。此时如果CPU向端口写数据“1”,则 为“0”,nFET管截止,pFET2管导通,而由于延时线的作用,或门保持两个振荡周期的“0”电平,从而使pFET1管导通两个振荡周期。pFET2管驱动能力较弱,但pFET1管比pFET2管的驱动能力要强得多,因而很快使端口引脚电平从低电平到 2V以上,而端口引脚反过来又通过反相器驱动pFET3管导通,进一步加速把端口的引脚电平提高到“1”电平,同时反相器和pFET3管构成双稳态电路,把引脚电平稳定在高电平。pFET1管在两个振荡周期的导通后将回到截止状态。综上所述:pFET2管和pFET3管构成上拉电阻的固定部分(图 4-3中虚线框以外部分),其中pFET3管起主要作用,pFET2管起次要作用。而pFET1管是内部上拉电阻的附加部分(包括图 4-3中虚线框以里部分),在端口由“0”电平改写为“1”电平时起加速作用。

P1~ P3口作为输入端口时,也要先向端口写入“1”。由于pFET2管和pFET3管的上拉作用,对外部的输入电路而言会产生一个不大的源电流。下面分两种情况讨论外部输入电路驱动端口的两种较特殊的情况。

图 4-3 P89V51的P1~ P3口内部上拉电阻的组成

●外部电路驱动端口由“1”电平到“0”电平。由于pFET2管和pFET3管的微弱上拉作用,外部输入电路最多只需对端口驱动 5μA的电流就能使端口引脚电平拉到 2V以上,而这时pFET3管开始进入截止状态和由于pFET3管和反相器构成的双稳态电路的正反馈作用,加速端口进入低电平。

●如果端口引脚已处于低电平,而CPU也没有向端口写“1”,此时如果仅仅依靠pFET2管的微弱上拉作用(这时仅仅pFET2管是导通的),而且外部电路也没有驱动端口的话(如作为按键输入且按键此时已断开),将需要很长的时间才能使端口自行回到高电平。在引脚上的电平回到 2V以上时,由于pFET3管开始导通,它和反相器构成的双稳态电路的正反馈作用才会加速端口回到高电平。

P89V51中的P1是多功能的。除作为一般的双向I/O端口外,P1.0还作为定时器/计数器 2的外部输入端(用T2表示其引脚);P1.1还作为定时器/计数器 2的外部控制输入端(用T2EX表示其引脚);P1.2作为PCA (Programmable Counter Array,可编程计数器阵列)的外部时钟输入端ECI;P1.3作为PCA模块 0的捕捉/比较外部I/O接口CEX0;P1.4有两个特殊功能:作为SPI(Serial Peripheral Interface,串行外设接口)从机选择端 和PCA模块 1的捕捉/比较外部I/O接口CEX1;P1.5也有两个特殊功能:作为SPI的主机输出/从机输入端MOSI和PCA模块 2的捕捉/比较外部I/O接口CEX2;P1.6也有两个特殊功能:作为SPI的主机输入/从机输出端MISO和PCA模块 3的捕捉/比较外部I/O接口CEX3;P1.7也有两个特殊功能:作为SPI的时钟输入/输出端SPICLK和PCA模块 4的捕捉/比较外部I/O接口CEX4。P1口的特殊功能参见表 4-1。

表 4-1 P1口的特殊功能

4.1.3 P2口

如图 4-4所示为P2口中一位口线的结构,其中包括一个输出锁存器、两个三态缓冲器、一个由一枚场效应管(FET)和内部上拉电阻组成的输出驱动电路,以及比P1口多的输出转换控制部分。当访问外部存储器时,MUX切换到右边,P2口用于输出高 8位地址。而当作为通用I/O接口用时,MUX切换到左边,P2口作为准双向I/O接口。

图 4-4 P2口中一位口线的结构

在访问外部数据存储器时,执行MOVX@Ri指令与执行MOVX@DPTR指令有所不同,如果没有外接程序存储器(XCODE):

①执行MOVX @Ri指令时,由P0口给出低 8位地址,而P2口不会发生改变,如果外部数据存储器的容量少于 256B,P2口还有可能作为普通I/O接口使用。

②执行MOVX @DPTR指令时,由P0口给出低 8位地址,而P2口需要给出高 8位地址且有可能改变,但由于P2口输出地址期间并不需要锁存器锁存“1”,因而锁存器的内容并不会在输出地址的过程中改变,所以P2口引脚在执行MOVX @DPTR指令结束后仍然出现锁存器的内容,因此,P2口中的若干高位口线(视外部存储器大小不同而多少不同)也还有可能作为普通I/O接口使用。

应该指出的是,标准P89V51访问外部数据存储器只有MOVX @Ri指令与MOVX@DPTR两条指令,在许多情况下需要充分利用这两条指令。由于在访问外部数据存储器时P2口直接由CPU控制并根据指令输出P2锁存器给出的高位地址(MOVX @Ri指令),或数据指针寄存器(DPTR)的高位字节寄存器(DPH)给出的高位地址(MOVX @DPTR指令),轮流使用这两条指令并不会产生任何冲突。因此,在需要频繁访问外部数据存储器时轮流使用这两条指令可以避免频繁保护数据指针的麻烦和数据指针瓶颈的限制。

4.1.4 P3口

如图 4-5所示为P3口中一位口线的结构,其中包括一个输出锁存器、三个三态缓冲器、一个由一枚场效应管(FET)和内部上拉电阻组成的输出驱动电路,以及一个起控制作用的与非门。当P3口作为通用I/O接口使用时,第二输出功能为高电平,使与非门打开,从而锁存器可以直接控制输出级驱动电路。

图 4-5 P3口中一位口线的结构

除了作为通用I/O接口使用外,P3口的所有口线都具有第二功能(特殊功能),P3口的特殊功能参见表 4-2。

只有P3口锁存器中相应的位置为1时,其特殊功能才被激活,或可作为输入口用。单片机复位时P3口锁存器中所有的位自动置为 1。应该说明的是,除非某P3口已作为输出口并已写过“0”,否则,不管是从普通I/O接口,还是作为第二功能,都不需要专门去设置。例如,当把P3.1口作为UART的输出口后改作为普通输入口,或反过来,把P3.1口作为普通输入口后改作为UART的输出口,都不需要再进行设置。只有当把P3.1口作为普通输出口并输出“0”电平后,如果要改回作为输入口或作为UART的输出口,则需要对该位口线的锁存器写入“1”,即执行“SETB P3.1”或类似置P3.1为“1”的指令。

表 4-2 P3口的特殊功能

4.1.5 端口的负载能力与接口要求

由于P0口与P1~ P3口的结构不同,所以它们的负载能力和接口要求各不相同。如表 4-3所示,列出了它们之间的差异。

表 4-3 P0~ P3口的接口特性与要求 jN/fPe4Wet6s/+Zv7ynWvnJFI3DFZqbvIGPIWI44GJ3rCB+tkwV/lmaimxZ9L3Xo

点击中间区域
呼出菜单
上一章
目录
下一章
×