原创 关于51单片机的上拉问题

2008-6-24 10:28 3178 5 5 分类: MCU/ 嵌入式

关于51单片机P0口的结构及上拉问题
 


1.P0作为地址数据总线时,T1和T2是一起工作的,构成推挽结构。高电平时,T1打开,T2截止;低电平时,T1截止,T2打开。这种情况下不用外接上拉电阻.而且,当T1打开,T2截止,输出高电平的时候,因为内部电源直接通过T1输出到P0口线上,因此驱动能力(电流)可以很大,这就是为什么教科书上说可以"驱动8个TTL负载"的原因.


2.P0作为一般端口时,T1就永远的截止,T2根据输出数据0导通和1截止,导通时拉地,当然是输出低电平;截止时,PO口就没有输出了,(注意,这种情况就是所谓的高阻浮空状态),如果加上外部上拉电阻,输出就变成了高电平1.


3.其他端口P1、P2、P3,在内部直接将P1口中的T1换成了上拉电阻,所以不用外接,但内部上拉电阻太大,电流太小,有时因为电流不够,也会再并一个上拉电阻。


4.在某个时刻,P0口上输出的是作为总线的地址数据信号还是作为普通I/O口的电平信号,是依靠多路开关MUX来切换的.而MUX的切换,又是根据单片机指令来区分的.当指令为外部存储器/IO口读/写时,比如 MOVX A,@DPTR ,MUX是切换到地址/数据总线上;而当普通MOV传送指令操作P0口时,MUX是切换到内部总线上的.


PS:


Because Ports 1, 2, and 3 have fixed internal pullups, they are sometimes called “quasi- bidirectional” ports.
因为端口1、2、3有固定的内部上拉,所以有时候他们被称为"准双向"口.


Port 0, on the other hand, is considered “true” bidirectional, because when configured as an input it floats. 
端口0,从另外一方面来说,就被认为是"真正的"双向,因为当它被设置为输入的时候是浮空(高阻态)的.


       51单片机P0口的作为I/O的问题,其实看了51的P1口的电路就很容易理解了,主要是一个锁存器和推拉结构,在此作些说明。


       当用作输出,所有口线的状态都与SFR锁存位的设置有密切的联系。
       P0口为低除外。当P0口的一个位写入0时,这个位被拉低。但是对P0口的其中一个位写入1时,这个位呈现高阻,也就是未能连机,不能使用。要想获得1输出,你必须在P0口外加上拉电阻。一般驱动LED的上拉电阻为470Ω,外接逻辑电路的上拉电阻为4.7K。       补充:一些口线被作为简单的高电平输入也与SFR锁存位有关。因为P1、P2、P3有内部上拉电阻,可以随意被拉高,拉低。而P0口作为高电平输入时,也会呈现高阻态。
       P0口和P2口的输入缓冲被用来作存取外部存贮用,P0口用作外部存贮器的低位字节的位址,并与数据读写多工。输出第一位元址,当位置线是16位时,P2口用作高8位的位址线,因此当对外面存贮时,P0口、P2口没法当作I/O口线。
       P1口具有内部上拉电阻,当端口用作输入时,必须通过指令将端口的位锁存器置1,以关闭输出驱动场效应管,这时P1口的引脚由内部上拉电阻拉为高电平,所以向P1写入1,工作正常。
       P0则不同,它没有内部上拉电阻,在驱动场效应管的上方有一个提升场效应管,它只是在对外存储器进行读写操作,用作地址/数据时才起作用,当向位锁存器写入1,使驱动场效应管截止,则引脚浮空,所以写入1而未获得。


P0口上拉电阻的阻值:


1、如果是驱动led,那么用1K左右的就行了。如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大;如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超过3K以上时,亮度就很弱了,但是对于超高亮度的LED,有时候电阻为10K时觉得亮度还能够用。我通常就用1k的。


2、对于驱动光耦合器,如果是高电位有效,即耦合器输入端接端口和地之间,那么和LED的情况是一样的;如果是低电位有效,即耦合器输入端接端口和VCC之间,那么除了要串接一个1——4.7k之间的电阻以外,同时上拉电阻的阻值就可以用的特别大,用100k——500K之间的都行,当然用10K的也可以,但是考虑到省电问题,没有必要用那么小的。


3、对于驱动晶体管,又分为PNP和NPN管两种情况:对于NPN,毫无疑问NPN管是高电平有效的,因此上拉电阻的阻值用2K——20K之间的,具体的大小还要看晶体管的集电极接的是什么负载,对于LED类负载,由于发管电流很小,因此上拉电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此上拉电阻的阻值最好不要大于4.7K,有时候甚至用2K的。对于PNP管,毫无疑问PNP管是低电平有效的,因此上拉电阻的阻值用100K以上的就行了,且管子的基极必须串接一个1——10K的电阻,阻值的大小要看管子集电极的负载是什么,对于LED类负载,由于发光电流很小,因此基极串接的电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此基极电阻的阻值最好不要大于4.7K。


3、对于驱动TTL集成电路,上拉电阻的阻值要用1——10K之间的,有时候电阻太大的话是拉不起来的,因此用的阻值较小。但是对于CMOS集成电路,上拉电阻的阻值就可以用的很大,一般不小于20K,我通常用100K的,实际上对于CMOS电路,上拉电阻的阻值用1M的也是可以的,但是要注意上拉电阻的阻值太大的时候,容易产生干扰,尤其是线路板的线条很长的时候,这种干扰更严重,这种情况下上拉电阻不宜过大,一般要小于100K,有时候甚至小于10K。


根据以上分析,上拉电阻的阻值的选取是有很多讲究的,不能乱用,具体情况比较复杂,如果你是个莱鸟,那么你尽量用小一些的,这样牺牲一些电源功耗。不过最好请教一下有关人员。

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条