如果你决定从事单片机这门技术,那就一定要坚持学习下去,不能半途而废,当你坚持学习一段时间后你会发现自己慢慢会喜欢这些玩意,对这些东西有了浓厚的兴趣和感情,那你离成功就不远了。在本章中我们首先来了解单片机 IO 的一些细节内容,然后在此基础上再学习两种常用设备的使用方法——步进电机和蜂鸣器。
我们提到了单片机 IO 口的其中一种“准双向 IO”的内部结构,实际上我们的单片机 IO 口还有另外三种状态,分别是开漏、推挽、高阻态,我们通过图 9-1 来分析下另外这三种状态。

图 9-1  单片机 IO 结构示意图


前边我们简单介绍“准双向 IO”的时候,我们是用三极管来说明的,出于严谨的态度,我们这里按照实际情况用 MOS 管画图示意。实际上三极管是靠电流导通的,而 MOS 管是靠电压导通的,具体缘由和它们的内部构造有关系,在这里我们暂且不必关心,如果今后有必要了解可以直接查找模拟电子书或者百度相关资料进行细致学习。在单片机 IO 口状态这一块内容上,我们可以把 MOS 管当三极管来理解。在图 9-1 中,T1 相当于一个 PNP 三极管,T2 相当于一个 NPN 三极管。

其中准双向 IO 口原理已经讲过了,开漏输出和准双向 IO 的唯一区别,就是开漏输出把内部的上拉电阻去掉了。开漏输出如果要输出高电平时,T2 关断,IO 电平要靠外部的上拉电阻才能拉成高电平,如果没有外部上拉电阻 IO 电平就是一个不确定态。标准 51 单片机的P0 口默认就是开漏输出,如果要用的时候外部需要加上拉电阻。而强推挽输出就是有比较强的驱动能力,如图 9-1 中第三张小图,当内部输出一个高电平时,通过 MOS 管直接输出电流,没有电阻的限流,电流输出能力也比较大;如果内部输出一个低电平,那反向电流也可以很大,强推挽的一个特点就是驱动能力强。

单片机 IO 还有一种状态叫高阻态。通常我们用来做输入引脚的时候,可以将 IO 口设置成高阻态,高阻态引脚本身如果悬空,用万用表测量的时候可能是高可能是低,它的状态完全取决于外部输入信号的电平,高阻态引脚对 GND 的等效电阻很大(理论上相当于无穷大,但实际上总是有限值而非无穷大),所以称之为高阻。

这就是单片机的 IO 口的四种状态,在我们 51 单片机的学习过程中,主要应用的是准双向 IO 口,随着我们学习的深入,其它状态也会有接触,在这里介绍给大家学习一下。

单片机上下拉电阻
前边似乎我们很多次提到了上拉电阻,下拉电阻,具体到底什么样的电阻算是上下拉电阻,上下拉电阻都有何作用呢?

上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻也起到一个限流作用,下拉就是下拉到低电平。

比如我们的 IO 设置为开漏输出高电平或者是高阻态时,默认的电平就是不确定的,外部经一个电阻接到 VCC,也就是上拉电阻,那么相应的引脚就是高电平;经一个电阻到 GND,也就是下拉电阻,那么相应的引脚就是一个低电平。

上拉电阻应用很多,都可以起到什么作用呢?我们现在主要先了解最常用的以下 4 点:

  • OC 门要输出高电平,必须外部加上拉电阻才能正常使用,其实 OC 门就相当于单片机 IO 的开漏输出,其原理可参照图 9-1 中的开漏电路。
  • 加大普通 IO 口的驱动能力。标准 51 单片机的内部 IO 口的上拉电阻,一般都是在几十 K 欧,比如 STC89C52 内部是 20K 的上拉电阻,所以最大输出电流是 250uA,因此外部加个上拉电阻,可以形成和内部上拉电阻的并联结构,增大高电平时电流的输出能力。
  • 在电平转换电路中,比如我们前边讲的 5V 转 12V 的电路中,上拉电阻其实起到的是限流电阻的作用,可以回顾一下图 3-8。
  • 单片机中未使用的引脚,比如总线引脚,引脚悬空时,容易受到电磁干扰而处于紊乱状态,虽然不会对程序造成什么影响,但通常会增加单片机的功耗,加上一个对 VCC 的上拉电阻或者一个对 GND 的下拉电阻后,可以有效的抵抗电磁干扰。

那么我们在进行电路设计的时候,又该如何选择合适的上下拉电阻的阻值呢?

  • 从降低功耗的方面考虑应当足够大,因为电阻越大,电流越小。
  • 从确保足够的引脚驱动能力考虑应当足够小,电阻小了,电流才能大。
  • 在开漏输出时,过大的上拉电阻会导致信号上升沿变缓。我们来解释一下:实际电平的变化都是需要时间的,虽然很小,但永远都达不到零,而开漏输出时上拉电阻的大小就直接影响了这个上升过程所需要的时间,如图 9-2 所示。想一下,如果电阻很大,而信号频率又很快的话,最终将导致信号还没等上升到高电平就又变为低了,于是信号就无法正确传送了。

图 9-2  上拉电阻阻值对波形的影响


综合考虑各种情况,我们常用的上下拉电阻值大多选取在 1K 到 10K 之间,具体到底多大通常要根据实际需求来选,通常情况下在标准范围内就可以了,不一定是一个固定的值。