51手记之标准51---I/O口
有4组8位I/O口:P0、P1、P2、P3
P0为双向三态输入输出口,P1、P2、P3为准双向口,P0的驱动能力是单个其余口的两倍!
外扩数据RAM时,P0口可作数据/地址总线,P2口作地址总线的高8位
51的基础是8031,8031的I/O口只有P1口!
双向三态I/O口:口线内无固定上拉电阻,由两个MOS管串接,既可开漏输出,又可处于高阻的“浮空”状态,故称为双向三态I/O口。
P0口是双向指的是它被用作地址/数据端口时,只有在这个时候,P0口才处于两个开关管推挽状态,当两个开关管都关闭时,才会出现高阻状态.当P0口用于一般I/O口时,内部接Vcc的那个开关管是与引脚(端口)脱离联系的,这个时候,只有拉地的那个开关管其作用,P0口作为输出,是必须外接上拉电阻的,不然就无法输出高电平;
如果P0口作为输入,则必须先对端口写1,使拉地的开关管断开,这个时候,如果不接上拉电阻,则是高阻状态,就是一个双向口,如果接上拉电阻,则本身输出高电平,对输入信号的逻辑无影响(注意是对逻辑无影响,对实际参数有无影响我不确定,但是我认为是有的).
准双向I/O口:各口线在片内均有固定的上拉电阻,当这三个准双向I/O口作输入口使用时,要向该口先写1,另外准双向I/O口无高阻的“浮空”状态。
双向与准双向,根本原则是双向包含了高阻这个状态,而不在于是否需要先写1或者不写,P1~P3口因为有内部上拉电阻,因此无论如何不是双向;P0口内部无上拉电阻,在处于数据/地址功能时,自动完成3态的转换,是双向,处于一般I/O口时,如果不接外部上拉,而且先向端口写了1,那么就处于高阻状态,此时,它也是一个人为的双向口,这与它处于地址/数据功能时的自动双向有区别,以及与P1~P3处于输入时输出锁存器为1是有区别的跟I2C总线上那种漏极开路或者集电极开路结构差不多. 通过上拉电阻(或者下拉电阻)来提供一种电平的驱动.
当作为输入使用时,就将开关断开,这样就只剩下上拉(或者下拉)电阻,因而阻抗比较高,
可以由其它设备驱动该IO口。准双向口在做为输入使用时,实际上还是一种输出状态.
只是该输出状态的内阻比较大而已. 而真正的双向IO口,有方向控制寄存器,作为输入
使用时输出部分被断开.
双向口与准双向口的区别为双向口有高阻态,输入为真正的外部信号,准双向口内部有上拉,故高电平为内部给出不是真正的外部信号!软件做处理时都要先向口写“1”!