m0单片机io口_自学单片机第十八篇:信号的输入检测

通过前段时间的学习,我们基本上已经掌握了关于单片机的端口控制,可以通过控制端口的电位变化来实现一些功能。有时间也可以练习一些复杂的变化,来熟悉自己的所学知识。

输出是说的差不多了,那么接下来的一段时间,就要开始叨叨输入的哪些事情了。

如果说输出是向世界发出声音,那么输入就是聆听世界的声音,婴儿刚出生的一声啼哭,就是通过向外界输出自己的力量,来证明自己的降生,慢慢到了婴儿时期,就会通过聆听周围的声音,观察周围人的动作,来学习这个世界的生存技能。我们学习单片机也是一样,先展示自己的力量,然后再去感受周围的力量,这个过程需要漫长的磨砺,不断的练习和付出。

单片机的输入和输出是使用的同一个引脚,所以我们之前说51的引脚为IO口,意思是既可以作为IN输入端口,也可以作为OUT输出端口,所以简写为IO端口,属于复用端口,有利于节省空间。我们先来看下输入端口的结构,大致了解下。

22c6643296c48fd877b8c2bf8dbedc89.png

这个是P1的端口结构,我们暂且不用理会左边那一大堆东西,只看右边这一部分,首先看到的是一个上拉电阻,然后是我们的针脚,接着是一个三极管(实际上是一个场效应管,我们简单理解就好),还有一路单独引出来了,这部分电路看似简单,但却承担着内部与外界的所有数据交换,可谓地位之重。我通过模拟器来简单实现端口的控制,直观的了解下端口是如何读取输入的数据的。

856e3c1e46dc6e5bd263642d2e37987d.png

电路尽可能的与原理图一致,我们分为了电源部分、输入输出部分、端口部分、和外部电路,首先我们来说下当输出部分输出高电位时,电路的状态。

注:接下来的解释,需要用到三极管的部分知识,这个需要高中以上的物理知识,如果不理解,我们可以在留言中讨论。我尽量通俗的说,如果真的听不懂,也不影响接下来的学习。

195a69f7ccd5c7210ec1e757c1f6f08d.png

从图中可以看出,当三极管基极(也就是左边横着那个电极),电位为5V高电位,那么三极管就处于截止状态,相当于上下电路是断开的,好比我打差号的部分断开,所以下方的输入电路就读取到了一个高电位,这个高电位是通过上拉电阻送过来的,如果此时外电路接的有小灯泡,那么小灯泡就会点亮了。

b6fa7d1d7294b0a6bbc19d6419b914e7.png

当我们让单片机输出0时,三极管的基极(图中b)就会处于低电位,于是三极管导通,图中的a和c就导通了,相当于通过导线直接相连在了一起,所以a点就也是0V低电位了,外部电路也是0V低电位,输入读取电路f也是0V低电位。

通过控制基极的电位,我们就可以让外电路出现与控制器相同的高低电位状态,同时驱动能力也有了很大的提升。但是由于内电路的导线很细,所以驱动功率也是很小的,不要尝试大功率设备,会烧坏芯片内部电路的。我们了解了输出的控制。那么,如果此时我在IO口上接一个SW1开关,人为的给引脚设置高低电位,情况又会是什么样呢?

14402dd1ba47a65c2fb440060e71b180.png

当我们把SW1设置为0V低电位时,我们会发现,电路状态从接近0V降到了完全的0V,这主要是因为在三极管中存在电阻,而外接的电路不存在电阻,所以电压被拉低到了完全的0V。我们通过时间调整,看下实际情况下当内部电路输出0时,外电路切换高低电位对IO口的电位影响。

aa050232ab11a3b74dcdd16a39b28a7d.png

我们反复的切换外电路的状态,发现输入电路f读取的a点的状态如上图波形,当SW1切换到5V高电位,此时a点电位是494mV,完全达不到3V高电位的最低电压,所以控制器输入电路读取到的电位就是0.494V,认为输入的是低电位,当SW1切换到0V低电位时,此时a点电位是0V,低于低电位1V的标准,所以控制器输入电路就读取到0V,认为输入的是低电位,通过这个实验,我们发现,不论外电路如何变化,内电路都是读取的低电位,这还怎么知道我输入的是低电位还是高电位,怎么知道我的按键什么时间按下了?

所以我们把控制器的输出从0改为1再试一下,我们还是对SW1进行反复的切换,观察a点的电位和输入电路的波形变化。

4d9b1e55c4f63f686044c2b462a4bdef.png

此时可以直观的看出,上方的波形已经从几毫伏的变化,变成了现在的0到5V,当SW1切换到5V高电位,由于三极管截止了,所以a点就是5V高电位,f读取到的就是5V高于3V,于是控制器认为输入的是一个高电位,当SW1切换到0V低电位,还是因为三极管截止的原因,a点相当于通过SW1直接与负极相连,所以a点就是0V低电位,f读取到的就是0V低于1V,于是控制器就认为输入的是一个低电位,这样外部的信号与控制器读取的信号就一致了。

所以,我们就有一个要求,在你需要读取外部信号时,除了程序中需要做出读取的相应操作,你的需要读取的引脚在控制器中要先输出一个高电位,也就是置1.不然你就读不到东西。

有人会说了,在前边当控制器输出0时,你如果把SW1连接5V的电阻取消,那么控制器不就可以读取到5V的高电位了吗?实际情况并不这么理想,

f3748ecf6678c33b9ec5483ce23719e2.png

我们可以看到,此时芯片的IO口电流已经达到了3A,这对芯片来说就是毁灭的灾难。所以是不允许这么做的,如果你这么做了芯片依然坚持了过来,感到幸运吧。不是每次都有这么好运的。在IO口外接电路时,我们是不允许直接毫无控制直连正负极的,计算好自己的功耗和电流,然后匹配相应的电阻才是最佳的选择。

好了通过以上的解释,我们知道了IO口需要读取外部信息时,是需要内部对IO口提前置1的。下篇我们就尝试读取P1口的信号来看看。

你觉得一个IO口,单片机最大可以带动多大的电流?欢迎留言讨论。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值