为什么单片机P0口输入不需置位1?

我看到一片文章里写的
http://wenku.baidu.com/view/5f9099c5aa00b52acfc7ca64.html
‘P0端口由于输出有三态功能,输入前,端口线已处于高阻态,无需先写入l后再作读操作。’
不太明白。从图中看出P0要是不置位的话,T2就会导通了。输入信号不都变成0了吗?

另外,读锁存器,是不是先会将引脚信号通过D锁存后,再关闭引脚,然后再读锁存器啊。
如果不是的话,那图中进入总线的输入信号从 何而来呢?

  P0作输入时不需要上拉电阻,但要先置1。
  因为P0口作一般I/O口时上拉场效应管一直截止,所以如果不置1,下拉场效应管会导通,永远只能读到0。
  因此在输入前置1,使下拉场效应管截止,端口会处于高阻浮空状态,才可以正确读入数据。
  至于输出时,输出0是正常的,输出1时由于端口处于浮空状态不能正确输出1,因此才需要接上拉电阻。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-07
P0端口由于输出有三态功能,输入前,端口线已处于高阻态,无需先写入l后再作读操作。
---------------

首先,《P0端口由于输出有三态功能,》这句话,就是错误的。

作为 IO 口使用时,P0,只有输出0 和高阻态,两种,并不能输出1,谈不上三态。

《P0端口由于输出有三态功能,》这句话,用在总线方式,还可以;
但是,总线方式,就和《先写入1再读》毫无关系了。

---------------

第二,《输入前,端口线已处于高阻态》这句话,只是作者自己的臆想而已。

输入前,如果输出了0,显然就不是高阻态。
===========================
另外,读锁存器,是不是先会将引脚信号通过D锁存后,再关闭引脚,然后再读锁存器啊。
如果不是的话,那图中进入总线的输入信号从 何而来呢?

读锁存器,就是读先前曾经输出的内容,和引脚无关。

读锁存器,用的是一些特殊的指令,即称为《读_改_写》的指令。
比如:ANL P0, #0FH。

这条指令,自动打开图中上边的三态门,信号由 D 经过三态门,流动到内部总线(如粗红线所示);
再和 0FH 相与之后,再写入锁存器;

最后输出到 P0 引脚。追问

谢谢详细解答~~。另外,有些不解的是:
读锁存器,是 属于'输入'的情况吗?
如果是,那输入的信号只能从下面的”缓冲器“部分进来啊。要不然,读的是以前的信息,跟外部信息 没有关系啊。。

追答

读锁存器,是 属于'输入'的情况吗?
如果是,那输入的信号只能从下面的”缓冲器“部分进来啊。
要不然,读的是以前的信息,跟外部信息 没有关系啊。。
----
前面已经说过了:读锁存器,就是读先前曾经输出的内容,和引脚无关。

《读_改_写》指令,如:ANL P0, #0FH

这里的 P0,并非是马上,去读一下引脚的信号,而是读锁存器,也就是读出以前曾经输出的。

本回答被提问者和网友采纳
第2个回答  2013-11-05
你这个问题,请仔细阅读 这个章节,
2、作为地址/数据复用口使用时的工作原理
是在 地址/数据复用 的情况下 受 (地址/数据)(控制信号)线控制,
这时与 锁存器 输出 信号无关,即多路开关在上面,
(地址/数据)送出 (地址) 或者 (数据)
读 与 写 受 (控制信号)控制,
不知能否 理解。追问

我也觉得,作者不太至于会弄错,可能是 我没有结合上下文。

我看了后面 的。说的也是要CPU向D锁存器写入一个高电平1,然后自然PO口就会是高阻态了。

没有看明白地址/数据部分的内容啊。里面写的应该都没有错。只是我暂时无法理解吧了

追答

其实 多看一下工作原理,会理解的。

第3个回答  2013-11-06
你好!!
1、P0口作为输出的时候,必须要加上拉电阻
2、P0口作为输入的时候,必须要置位为 1
3、通过实验是验证真假的最好办法
第4个回答  2013-11-05
写P0输入不要置位的人是忽悠你的,你很棒,能持怀疑的态度!
P0是个开漏输出的口,输入时如果外面不能提供上拉,则无法检测到高电平.
如果在输入前向P0写了0,那么也会检测不到高电平,因为即使外面有上拉,也被所写的0给拉低了.
另外,你给的这个图似乎不是标准51的P0结构图,应该是某种基于51内核的衍生芯片的图.
相似回答