昨天,在读STC12C5A60S2的数据手册时,突然注意到数据手册专门提出,要读取IO口输入的数据,必须先拉高IO口,并等待4个机器周期才能保证读取到正确的数据。
于是,我之前与学长的一个分歧又被我重新注意到。(这里
注意:以下讨论的IO口都是准双向口(双向口就没有这么麻烦了,直接读就行)。
我一直认为,读取IO口电平状态时,自身必须先输出一个高电平,否则在读取外部输入的高电平时,可能误读为低电平。而学长认为,根据实践经验,没有必要这么操作,就算IO口自身输出的是低电平,也能正常读取外部的高电平。
为此,我之前也做过实验,事实的确如学长所说一样。而今天,我有充分了那个实验,结果跟上次一样。
运行这个程序,把VCC接到各个TE口,各个O口都分别从高电平变为了低电平。

运行这个程序,把VCC接到各个TE口,各个O口都分别从高电平变为了低电平。

于是,我十分不解,比较,STC公司官方的数据手册出错的概念不大。我找到写那套51教程的宋老师,这个问题终于有了答案:
我的实验和学长的实际使用经验一样,都是直接将电源VCC接到了单片机的IO口,此时,即使单片机输出了一个低电平,但其的内部下拉电阻不足以将VCC拉到低电平,所以单片机能正常读取到外部的高电平,系统正常工作。而如果是上拉电阻或者一个输出能力不够强的外部器件输出的高电平,并且此时IO口被置低(输出低电平)就极有可能被单片机内部的下拉电阻拉到低电平。这样,系统读到的低电平与实际输入的高电平不符,则导致通信错误。所以,为了保险起见,无论如何,都将需要读取外部信号的硬件置高是一个稳妥的选择。
就这样,这次的分歧算是有了一个结果,在这个过程中,我也学会了不少东西,而且要不是这次,我也不会去看89C52的数据手册。。所以嘛,运气还算不错。。
就这样吧。

知识共享许可协议
关于51单片机读取IO口输入是否需要先拉高的问题终于有了答案 由 何相龙 创作,采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
在Wordpress站上浏览本文



Published

11 January 2015

Categories

单片机 技术之路

Tags