Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25648
  • 博文数量: 7
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-10 22:42
文章分类

全部博文(7)

文章存档

2011年(1)

2010年(2)

2008年(4)

我的朋友
最近访客

分类:

2010-03-26 15:02:24

51单片机的并行口有P0、P1、P2和P3,由于P0口是地址/数据总线口,P2口是高8位地址线,P3口具有第二功能,这样,真正可以作为双向I/O口应用的就只有P1口了。这在大多数应用中是不够的,因此,大部分MCS-51单片机应用系统设计都不可避免的需要对P0口进行扩展。
      由于MCS-51单片机的外部RAM和I/O口是统一编址的,因此,可以把单片机外部64K字节RAM空间的一部分作为扩展外围I/O口的地址空间。这样,单片机就可以像访问外部RAM存储器单元那样访问外部的P0口接口芯片,以对P0口进行读/写操作。用于P0口扩展的专用芯片很多。如8255可编程并行P0口扩展芯片、8155可编程并行P0口扩展芯片等。本文重点介绍采用具有三态缓冲的74HC244芯片和输出带锁存的74HC377芯片对P0口进行的并行扩展的具体方法。

    1 输入接口的扩展

      MCS-51单片机的数据总线是一种公用总线,不能被独占使用,这就要求接在上面的芯片必须具备“三态”功能,因此扩展输入接口实际上就是要找一个能够用于控制且具备三态输出的芯片。以便在输入设备被选通时,它能使输入设备的数据线和单片机的数据总线直接接通;而当输入设备没有被选通时,它又能隔离数据源和数据总线(即三态缓冲器为高阻抗状态)。

      1.1 74HC2244芯片的功能

      如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74HC244,由该芯片可构成三态数据缓冲器。74HC244芯片的引脚排列如图1所示。

   

      74HC244芯片内部共有两个四位三态缓冲器,使用时可分别以1C和2G作为它们的选通工作信号。当1C和2G都为低电平时,输出端Y和输入端A状态相同;当1G和2G都为高电平时,输出呈高阻态。

   

      1.2 应用74HC244芯片扩展输入接口

      图2是采用74HC2244芯片进行输入接口扩展的原理电路,图3是读P0口的时序。由图3可以看出,当P2.7和RD同为低电平时,74HC2244才能将输入端的数据送到单片机的P0口。其中,P2.7决定了74HC244的地址,0000H-7FFFH(共32K)地址都可以访问这个单元,这就是用线选法所带来的副作用。通常可选择其中的最高地址作为这个芯片的地址来写程序,如这个芯片的地址是7FFFH。但这仅仅是一种习惯,并不是规定,当然也完全可以用0000H作为这个芯片的地址。当确定了地址之后,其接口的输入操作程序如下:

      MOV DPTR,#7FFFH

      MOVX A,@DPTR

      其中MOVX类指令是MCS-5l单片机专用于对外部RAM进行操作的指令。由于外部I/O与外部RAM是同一接口,所以一般使用这条指令对外部I/O进行操作。一旦执行到MOVX类指令,单片机就会在RD或WR(根据输入还是输出指令)引脚产生一个下降沿,这个下降沿的波形与P2.7相或,则会在或门的输出口也产生一个下降沿,这个下降沿将使74HC244的输出与输入接通,这样,输入设备的数据就可以被MCS-51单片机从总线上读取。

   

      需要说明的是,74HC244是不带锁存的,因此,如果输人设备提供的数据时间比较短,那么就要用带锁存的芯片进行扩展,如74HC373,74HC573等。

    2 输出接口的扩展

      由于单片机的数据总线是为各个芯片服务的,一般不可能为一个输出而一直保持一种状态,因此,输出接口的主要功能是进行数据保持(即数据锁存),也就是说,输出接口的扩展实际上就是扩展锁存器。

      2.1 74HC377芯片的功能

      输出接口扩展通常用74HC377芯片来实现。该芯片是一个带允许端的8D锁存器,其芯片的引脚如图4所示,各相关引脚的功能如下:

      ◇D0~D7为8位数据输入端;

      ◇Q0~Q7为8位数据输出端;

      ◇G为使能控制端;

      ◇CLK为时钟信号,上升沿锁存数据。

      表1所列是该芯片的真值表。

     

      2.2 应用74HC377芯片扩展输出接口

      图5是利用74HC377进行输出接口扩展的电路连接图。图中,74HC377的G端与P2.6口相连,其地址是x0xxxxxxB,如果把“x”全置为1,则为1011 1111 1111 1111B,这样,0BFFFH就是该芯片的地址了。

     

      由于MCS-51的WR是与74HC377的CLK端相连的,当WR信号由低变高时,数据总线上的数据为输出数据,而此时P2.6输出低电平,G有效,因此,数据就被锁存。其相关程序如下:

      MOV DPTR,#0BFFFH

      MOV A,#DATA

      MOVX @DPTR,A

      此外,利用74HC373芯片、74HC573芯片也可以进行P0口的扩展。

      3 接口扩展实例

      在实际的应用系统中,可能需要同时扩展多个I/O口,以满足应用系统的需要。而各个输入、输出扩展I/O芯片应通过74LS138进行“全地址”译码选通,从而分时复用数据总线DB (DataBus)。为了防止过渡干扰对译码选通逻辑造成的影响,单片机系统所用的外围芯片一般均设为双步选通方式,即除了配置译码选通端外,还应配置使能选通端。而74HC244芯片本身没有明显的片选和读/写控制端,设计时通常采用译码和读控制信号来同时控制74HC244的CS,从而有效地抑制输入/输出数据信息的过渡干扰。

      此电路输入口扩展采用2个74HC244。其输入端接键盘或其它数字信号;而输出口扩展则选用2个74HC377,以用于控制数码管、发光二极管、继电器等。其详细电路原理图如图6所示。

     

      其部分代码如下:

   

     

      51单片机的数据/地址/控制总线端口都有一定的负载能力,P0口可驱动8个TTL门电路,P1口、P2口和P3口可驱动4个TTL门电路。负载超过上述规定一般应加驱动器。总线驱动器可以使用TTL型三态缓冲门电路74HC244、74HC245。另外,在扩展口线的同时,还应兼顾配置总线驱动器,注意总线负载平衡的配置。在总线上适当安装上拉电阻可以提高总线信号传输的可靠性。

      此外,一个系统可能由于存在各种干扰及不稳定因素而出现故障,为解决这一问题,设计时也可以从软件设计方面采取一些措施。

    4 结束语

      与其它51单片机P0口扩展相比,本文介绍的输入/输出口的P0并行扩展方法,可以很方便的实现P0口的并行扩展。所设计的接口扩展电路已成功用于实际系统中。实际运行表明,采用该方法扩展的P0口系统能够可靠、稳定的运行。



P0是个漏极开路接口,让它工作在灌电流状态下驱动LED是没有问题的.即:VCC>限流电阻>LED>P0.


灌电流:IO口为低电平的时候,电流从IO口外面"灌"进单片机相反的就是 "拉电流" IO口为高电平的时候,电流从单片机流出去给负载供电。

P0口有两种工作方式:总线式和io口式。简单的说就是:把p0用来作地址数据复用线(movx movc之类的指令)就是总线,这时p0口是推挽式输出,就是pmos,nmos都来驱动输出,所以这个时候不论输1(高电平)还是输0(低电平),驱动都比较强的(内阻小,输出电流大),你们没人见过51访问外ram的硬件中P0口接上拉电阻的吧!
第二种就是io方式,就是将它当作普通的io来用,这时它与其他的三个不同的是,它内部没有上拉电阻(也就是其他的三个口内部都有上拉),属于开漏输出(od),所以它的输出是低电平(0)和高阻态(z)两种状态,你只需从此管脚接个发光管和限流电阻到电源就可以了,此时管脚就相当于一个开关,闭合到地或断开,这应该算最简单,而且功耗低的一种接法了.
当然,你也可以利用高电平来驱动,就是外面接个上拉电阻了,这种方法不好,功耗大,自己想一下就知道原因了。尤其是接的负载比较重,同时驱动几个发光管,必须要减小上拉电阻以提供足够的驱动电流,但是,小的上拉电阻导致负载不工作时 的电流大,甚至关不断负载(发光管不能熄灭)。
其它口内部接了上拉电阻,是伪双向口的需要。


51单片机P0口上拉电阻的深入研究如果是驱动led,那么用1K左右的就行了。如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大;如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超过3K以上时,亮度就很弱了,但是对于超高亮度的LED,有时候电阻为10K时觉得亮度还能够用。通常就用1k的。对于驱动光耦合器,如果是高电位有效,即耦合器输入端接端口和地之间,那么和LED的情况是一样的;如果是低电位有效,即耦合器输入端接端口和VCC之间,那么除了要串接一个1——4.7k之间的电阻以外,同时上拉电阻的阻值就可以用的特别大,用100k——500K之间的都行,当然用10K的也可以,但是考虑到省电问题,没有必要用那么小的。对于驱动晶体管,又分为PNP和NPN管两种情况:对于NPN,毫无疑问NPN管是高电平有效的,因此上拉电阻的阻值用2K——20K之间的,具体的大小还要看晶体管的集电极接的是什么负载,对于LED类负载,由于发管电流很小,因此上拉电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此上拉电阻的阻值最好不要大于4.7K,有时候甚至用2K的。对于PNP管,毫无疑问PNP管是低电平有效的,因此上拉电阻的阻值用100K以上的就行了,且管子的基极必须串接一个1——10K的电阻,阻值的大小要看管子集电极的负载是什么,对于LED类负载,由于发光电流很小,因此基极串接的电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此基极电阻的阻值最好不要大于4.7K。对于驱动TTL集成电路,上拉电阻的阻值要用1——10K之间的,有时候电阻太大的话是拉不起来的,因此用的阻值较小。但是对于CMOS集成电路,上拉电阻的阻值就可以用的很大,一般不小于20K,我通常用100K的,实际上对于CMOS电路,上拉电阻的阻值用1M的也是可以的,但是要注意上拉电阻的阻值太大的时候,容易产生干扰,尤其是线路板的线条很长的时候,这种干扰更严重,这种情况下上拉电阻不宜过大,一般要小于100K,有时候甚至小于10K。根据以上分析,上拉电阻的阻值的选取是有很多讲究的,不能乱用。
阅读(4044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~