51单片机IO口总结
之所以把P0口和P2口放在一起,是因为其硬件结构上都包含一个多路开关,用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用。对于没有内部ROM的单片机(8031)或单片机内部存储器无法满足程序大小需求,多路开关就与上面接通,作为单片机与扩展存储器通信的地址/数据总线使用。
它们之间的不同也显而易见,P0口引脚前2个mosfet(金属氧化物半导体场效应管)构成了一个推挽结构,而P2口前mosfet则为普通开关作用,且包含上拉电阻。
推挽结构:在输出“地址/数据”信息时,V1、V2管是交替导通的,负载能力很强,可以直接与外设存储器相连,无须增加总线驱动器。
从结构上决定了它们的用途:假设扩展了存储器,则P0口作为地址/数据总线口,P2口作为高8位地址线。P0口作为IO输出口时,漏极开路输出,类似于OC门,当驱动上接电流负载时,需要外接上拉电阻。,所以不推荐使用。而PP2端口的多路开关总是在进行切换,分时地输出从内部总线来的数据和从地址信号线上来的地址。因此P2端口是动态的I/O端口,不能输出静态的数据,也不推荐作为IO口使用。推荐P0,P2保留作为扩展存储器,而非IO口使用。
另外,什么时候是IO口,什么时候是地址/数据口并非取决于硬件,而取决于当前的状态。
这才叫IO口,具有输出锁存的静态口,不必细说。
P3端口和Pl端口的结构相似,区别仅在于P3端口的各端口线有两种功能选择.
使P3端品各线处于第二功能的条件是:
1、串行I/O处于运行状态(RXD,TXD);
2、打开了处部中断(INT0,INT1);
3、定时器/计数器处于外部计数状态(T0,T1)
4、执行读写外部RAM的指令(RD,WR)
而作为IO口使用时与P1完全相同。
在更多的场合是根据应用的需要,把几条端口线设置为第二功能,而另外几条端口线处于第一功能运行状态。在这种情况下,不宜对P3端口作字节操作,需采用位操作的形式。
至于读引脚和读端口,一般教科书都会强调,读端口的指令为端口内容取反这样的“读-修改-写”指令。而读引脚之前,先置1,然后用Mov A,Px之类的指令即可。没有只读端口的指令,因为端口内容是不会因为引脚的变化而变化,始终保持为为上次输出值。只读不改没有意义。
那么可能会有疑问,在P0作为地址/数据总线使用时,并没有使其置1?
以访问外部程序存储器为例,P0口输出低8位地址信息后,将变为数据总线,以便读指令码(输入)。在取指令期间,“控制”信号为“0”,V1管截止,多路开关也跟着转向锁存器反向输出端Q非;CPU自动将0FFH写入P0口锁存器,使V2管截止,在读引脚信号控制下,通过读引脚三态门电路将指令码读到内部总线,这个过程和I/O读引脚过程是一样的。
评论