单片机小白学步系列二十 IO口原理
流方向相反,称为拉电流接法。对比可以看出,对于51单片机,灌电流接法电流较大,拉电流接法由于受到上拉电阻限制,电流较校
在实际当中灌电流的最大电流也是有限的,因为电子开关S中能通过的电流有限。根据STC官方的芯片手册,对于STC单片机,建议单个IO口灌电流建议不超过20mA,所有IO口灌电流之和不超过55mA,否则容易烧坏IO口。而拉电流大小只有230uA左右。
上拉电阻/下拉电阻/高阻态
拉电流是从上拉电阻流出来的,能否提高拉电流大小呢?答案是可以。我们只需要在单片机外部再添加一个上拉电阻,就可以增大拉电流,并且能成功点亮LED,如下图所示。
图中的电路,相当于R和R0并联了,整个上拉电阻的阻值减小了。但是这样做有个缺陷。在这个电路中,当单片机输出低电平时,S闭合,此时电流从VCC通过上拉电阻和S流入GND。此时虽然LED熄灭了,但是却有较大电流通过上拉电阻而浪费掉。所以上拉电阻过大,会导致驱动力不足,而上拉电阻过小,又会在输出低电平时浪费电能。
上拉电阻的作用是什么呢?对电路了解多一点的人很快能发现,如果没有上拉电阻,IO口就无法输出高电平,也就是下图这样的。开关闭合时能输出低电平,但是开关断开时,P1.0就悬空了,什么也没连接。这时IO口的电压就是不确定的了,这种状态无法判断它是低电平还是高电平,叫做高阻态。很巧的是,单片机的P0口确实就没有上拉电阻,而其他三组IO口都有上拉电阻。所以当P0输出高电平,并且没有外接上拉电阻时,就是高阻态,不能正常输出高电平。后面我会通过具体例子来让大家感受一下高阻态。
注:虽然P1.0似乎是同时连接到CPU的IO输入端了,即图中写着“输入”的绿色箭头,但是这部分电路只有在读取管脚输入的时候才会导通,并且是单向的。
上拉电阻的存在,将原本的高阻态转变成了高电平,也因此得名。和上拉电阻相对应的,还有下拉电阻,区别在于下拉电阻另一端不是连接VCC而是接到GND。
IO口的输入
IO口之所以叫IO口(IO=Input/Output),意味着它既可以输出又可以输入。前面讲的都是IO口的输出,下面讲IO口的输入。IO口的输出我们通过LED来介绍,而IO口的输入我们则通过开关来说明。在很多单片机中,IO的输入和输出需要通过电路切换,而对于51单片机来说,输入和输出使用的是同一套电路,也就是上面我们分析的电路。
图中的S0是一个单刀双掷开关,往上切换可以将P1.0接到VCC,往下切换可以接到GND。读取时CPU会通过特定电路获取图中橙色导线上的电平。我们想要实现的效果是,让CPU读取P1.0端口的电平,从而获得开关S0的状态。
当S断开时,CPU通过获取P1.0上的电平可以知道外部开关S0的状态,从而执行相应的操作。
而S闭合时,S0往下切换,P1.0确实是低电平。而S保持闭合且S0往上切换时,VCC通过S0和S直接接到GND就短路了。此时电子开关S通过大量电流,可能会烧坏单片机。于是我们添加了电阻R0。S仍然保持闭合,S0往上切换。此时P1.0仍然是低电平,于是CPU无法判断外部开关S0的状态,如下图。
总结起来就是在读取IO口电平时,应先设置输出高电平(即断开S),再读取数据。这个规则适用于所有IO口。
类似的,还可以读取单刀单掷开关(或按键开关)的状态,读取前先设置输出高电平,电路图如下。
上面这种电路需要依赖上拉电阻才能工作。P0口由于没有上拉电阻,需要在外部添加一个上拉电阻(因为如果没有上拉电阻,并且S和S0都断开时,IO口变成高阻态,读取的电平结果不确定,于是无法正确判断S0的开关状态)。
双向IO口/准双向IO口
标准双向IO口的特点有两条:
1、在输出模式下,可以输出高低电平;
2、在输入模式下,如果没有接外部电路,应呈现高阻态。
对于51单片机的P1、P2、P3口,由于有内部上拉电阻,输入模式下不可能出现高阻态,所以称之为准双向IO口。而P0口作为IO口工作时,如果不加上拉电阻就无法输出高电平;而加了上拉电阻,输入时又不会出现高阻态,所以也是准双向IO口。
备注1:51单片机的P0口如果工作在第二功能状态下,则是双向IO口。初学时具体原理不需要研究的很透彻,下面一段对此进行分析,仅供有兴趣的读者参考。
对照官方的完整IO口结构图,P0口内部有上下两个晶体管。当P0口工作在IO口模式下,上面那个晶体管断开,可以直接忽略,前面的等效电路就没有考虑上面那个晶体管。而当P0口工作在第二功能状态下,两个晶体管都可以工作。如果上面的晶体管断开,下面的导通,就输出低电平;反之上面的导通下面的断开,就输出高电平并且不需要上拉电阻;如果两个晶体管都断开,则可以作为输入,并且在
单片机IO口原 相关文章:
- 单片机小白学步(20) IO口原理(11-19)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)