C51的说明书上说:”Because Ports 1, 2, and 3 have fixed internal pullups, they are sometimes called quasi-bidirectional ports. When configured as inputs, they pull high and source current (IIL) when externally pulled low.??Port 0, on the other hand, is considered truly bidirectional, because it floats when configured as an input. "
翻译是:因为P1、2、3有固定的内部上拉电阻,所以有时称它们为准双向口。当用做输入时被拉高,低则要靠外部电路拉低。而P0则是真双向口,因为作为输入时它是悬浮的(因为没有上拉电阻)。 不是很清晰易懂.
我很纳闷,这么重要的一个问题,为什么教科书、老师都没有好好的讲清楚,包括我自己经历的也是这样.我也是一直被这个问题捆饶了很久 .我说说我的看法:
像上面说的一样,"准"就是"基本上"的意思.
其实重点在P0口.
P0口是双向指的是它被用作地址/数据端口时,只有在这个时候,P0口才处于两个开关管推挽状态,当两个开关管都关闭时,才会出现高阻状态. 当P0口用于一般I/O口时,内部接Vcc的那个开关管是与引脚(端口)脱离联系的,这个时候,只有拉地的那个开关管起作用,P0口作为输出,是必须外接上拉电阻的,不然就无法输出高电平;如果P0口作为输入,则必须先对端口写1,使拉地的开关管断开,这个时候,如果不接上拉电阻,则是高阻状态,就是一个双向口,如果接上拉电阻,则本身输出高电平,对输入信号的逻辑无影响(注意是对逻辑无影响,对实际参数有无影响我不确定,但是我认为是有的). 双向与准双向,根本原则是双向包含了高阻这个状态,而不在于是否需要先写1或者不写,P1~P3口因为有内部上拉电阻,因此无论如何不是双向;P0口内部无上拉电阻,在处于数据/地址功能时,自动完成3态的转换,是双向,处于一般I/O口时,如果不接外部上拉,而且先向端口写了1,那么就处于高阻状态,此时,它也是一个人为的双向口,这与它处于地址/数据功能时的自动双向有区别,以及与P1~P3处于输入时输出锁存器为1是有区别的。 单片机的P0~P3端口进行输入时为什么要设置为1? 给锁存器写1,那么锁存器的反向端就输出0,那么和它相接的MOS管也就在截状态,也就是呈高阻态,这样P0口上数据就会从读引脚的三态缓冲器上正确的输入,如果不写1,那么锁存器上次锁存的可能为0,那么反向端有可能出现1,这样和反向端相接的MOS管就倒通,也就是直接拉到地,那么不管你P0口上输入什么信号都会拉成低电平,输入就错了. 为什么我输入没设置1,还是正确的呢? 一般情况下,单片机复位后P0-P3端口默认值为1,如果仅作为输入,中途不改变,无需我们先设置1. 双向口与准双向口的区别主要是:准双向口I/O口操作时做数据输入时需要对其置1, 是扯淡!!!!
|