自学单片机第十八篇:信号的输入检测
通过前段时间的学习,我们基本上已经掌握了关于单片机的端口控制,可以通过控制端口的电位变化来实现一些功能。有时间也可以练习一些复杂的变化,来熟悉自己的所学知识。
输出是说的差不多了,那么接下来的一段时间,就要开始叨叨输入的哪些事情了。
如果说输出是向世界发出声音,那么输入就是聆听世界的声音,婴儿刚出生的一声啼哭,就是通过向外界输出自己的力量,来证明自己的降生,慢慢到了婴儿时期,就会通过聆听周围的声音,观察周围人的动作,来学习这个世界的生存技能。我们学习单片机也是一样,先展示自己的力量,然后再去感受周围的力量,这个过程需要漫长的磨砺,不断的练习和付出。
单片机的输入和输出是使用的同一个引脚,所以我们之前说51的引脚为IO口,意思是既可以作为IN输入端口,也可以作为OUT输出端口,所以简写为IO端口,属于复用端口,有利于节省空间。我们先来看下输入端口的结构,大致了解下。
这个是P1的端口结构,我们暂且不用理会左边那一大堆东西,只看右边这一部分,首先看到的是一个上拉电阻,然后是我们的针脚,接着是一个三极管(实际上是一个场效应管,我们简单理解就好),还有一路单独引出来了,这部分电路看似简单,但却承担着内部与外界的所有数据交换,可谓地位之重。我通过模拟器来简单实现端口的控制,直观的了解下端口是如何读取输入的数据的。
电路尽可能的与原理图一致,我们分为了电源部分、输入输出部分、端口部分、和外部电路,首先我们来说下当输出部分输出高电位时,电路的状态。
注:接下来的解释,需要用到三极管的部分知识,这个需要高中以上的物理知识,如果不理解,我们可以在留言中讨论。我尽量通俗的说,如果真的听不懂,也不影响接下来的学习。
从图中可以看出,当三极管基极(也就是左边横着那个电极),电位为5V高电位,那么三极管就处于截止状态,相当于上下电路是断开的,好比我打差号的部分断开,所以下方的输入电路就读取到了一个高电位,这个高电位是通过上拉电阻送过来的,如果此时外电路接的有小灯泡,那么小灯泡就会点亮了。
当我们让单片机输出0时,三极管的基极(图中b)就会处于低电位,于是三极管导通,图中的a和c就导通了,相当于通过导线直接相连在了一起,所以a点就也是0V低电位了,外部电路也是0V低电位,输入读取电路f也是0V低电位。
通过控制基极的电位,我们就可以让外电路出现与控制器相同的高低电位状态,同时驱动能力也有了很大的提升。但是由于内电路的导线很细,所以驱动功率也是很小的,不要尝试大功率设备,会烧坏芯片内部电路的。我们了解了输出的控制。那么,如果此时我在IO口上接一个SW1开关,人为的给引脚设置高低电位,情况又会是什么样呢?
当我们把SW1设置为0V低电位时,我们会发现,电路状态从接近0V降到了完全的0V,这主要是因为在三极管中存在电阻,而外接的电路不存在电阻,所以电压被拉低到了完全的0V。我们通过时间调整,看下实际情况下当内部电路输出0时,外电路切换高低电位对IO口的电位影响。
我们反复的切换外电路的状态,发现输入电路f读取的a点的状态如上图波形,当SW1切换到5V高电位,此时a点电位是494mV,完全达不到3V高电位的最低电压,所以控制器输入电路读取到的电位就是0.494V,认为输入的是低电位,当SW1切换到0V低电位时,此时a点电位是0V,低于低电位1V的标准,所以控制器输入电路就读取到0V,认为输入的是低电位,通过这个实验,我们发现,不论外电路如何变化,内电路都是读取的低电位,这还怎么知道我输入的是低电位还是高电位,怎么知道我的按键什么时间按下了?
所以我们把控制器的输出从0改为1再试一下,我们还是对SW1进行反复的切换,观察a点的电位和输入电路的波形变化。
此时可以直观的看出,上方的波形已经从几毫伏的变化,变成了现在的0到5V,当SW1切换到5V高电位,由于三极管截止了,所以a点就是5V高电位,f读取到的就是5V高于3V,于是控制器认为输入的是一个高电位,当SW1切换到0V低电位,还是因为三极管截止的原因,a点相当于通过SW1直接与负极相连,所以a点就是0V低电位,f读取到的就是0V低于1V,于是控制器就认为输入的是一个低电位,这样外部的信号与控制器读取的信号就一致了。
所以,我们就有一个要求,在你需要读取外部信号时,除了程序中需要做出读取的相应操作,你的需要读取的引脚在控制器中要先输出一个高电位,也就是置1.不然你就读不到东西。
有人会说了,在前边当控制器输出0时,你如果把SW1连接5V的电阻取消,那么控制器不就可以读取到5V的高电位了吗?实际情况并不这么理想,
我们可以看到,此时芯片的IO口电流已经达到了3A,这对芯片来说就是毁灭的灾难。所以是不允许这么做的,如果你这么做了芯片依然坚持了过来,感到幸运吧。不是每次都有这么好运的。在IO口外接电路时,我们是不允许直接毫无控制直连正负极的,计算好自己的功耗和电流,然后匹配相应的电阻才是最佳的选择。
好了通过以上的解释,我们知道了IO口需要读取外部信息时,是需要内部对IO口提前置1的。下篇我们就尝试读取P1口的信号来看看。
你觉得一个IO口,单片机最大可以带动多大的电流?欢迎留言讨论。
详解单片机的按键检测与控制
按键在单片机控制系统中起到人机交互的作用,通过按键可以输入数据、命令和各种参数,按键侧键测处理是单片机系统设计和开发中一个重要的内容,关系到整个系统的交互性能和稳定性。按键处理形式在单片机系统中有两种形式:直接按键和矩阵编码键盘,下面分别对这两种按键检测电路的特点及编程思路和方法进行分析和介绍。
按键抖动问题产生的原因及解决方法
按键的抖动问题是指按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象(由按键的机械特性造成,不可避免)。图8-1所示为一次按键的抖动过程,在按键的前沿和后沿都会有5~10ms的抖动。
图8-1 按键抖动示意图
对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式消除抖动。
去除抖动可以采用硬件方式和软件方式。硬件方式一般是在按键与单片机的输入通道上安装硬件去抖电路(如RS触发器)。软件方式的实现方法是:当查询到电路中有按键按下时,先不进行处理,而是先执行10~20ms的延时程序,延时程序结束后,再次查询按键状态,若此时按键仍为按下状态,则视为按键被按下。
按键检测电路及应用
1. 独立式按键
独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态,CPU可直接读取该I/O线的高/低电平状态。这种按键硬件、软件结构简单,判键速度快,使用方便,但占用I/O口线较多,适用于按键数量较少的系统中。
独立连接式键盘连接如图8-2所示。当没有键被按下时,所有的数据输入线均为高电平;当任意一个按键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键被按下。
图8-2 独立式键盘接口设计
【例8-1】 利用单片机的P1.0~P1.34个I/O口检测4个按键的触发信息,以实现不同功能的控制。
硬件电路参见图8-2所示,C51参考程序如下:
2. 矩阵式按键
在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式。例如下例中的16个按键,被排列成了如图8-3所示的4X4矩阵方式。该矩阵式键盘由4根行线和4根列线组成,每个行线和列线的交叉点是一个按键。
【例8-2】 将矩阵式键盘的按键值通过数码管显示出来。
电路连接如图8-3所示(电源和震荡电路未标出)。
图8-3 矩阵式键盘按键显示电路图
如何判断被按下的键值呢?
分析如下:
根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:
a)首先判断是否有按键被按下
本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。
b)按键消抖
当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。
c)按键识别
当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。
C51程序如下:
矩阵式键盘与I/O接口应用
【例8-3】 四位数字密码锁
四位数字密码锁功能:通过键盘输入密码,当输入密码与内置密码相同时,继电器动作,表示密码锁解开。为了简化功能,该密码锁只使用12个键(即4x3键盘),其中S1~S9为1~9数字键,S10为0数字键,S11为“*”键作为确认键使用,而S12为“#”键作为复位键,键盘接口电路如图8-4所示,键值布局如表8-1所示。
图8-4 行列式键盘电路连接图
表8-1 键盘布局表
单片机上电时,数码管显示“0000”,此时输入数字,数码管将显示按键值,数字逐个向左递增,四次输入完毕,四个数码管显示输入的数,此时按“*”号按键将启动比较,若输入数字与内设密码相同,继电器动作。如不同,则系统复位等待重新输入密码。当按“#”号键,系统复位,数码管显示“0000”。
在上面键扫描程序基础上增加的源程序如下:
相关问答
怎么用 单片机检测 脉冲 输入 个数?可以使用单片机的计数器功能来检测脉冲输入个数。具体步骤如下:1.将计数器输入引脚与脉冲信号输入引脚连接。2.将计数器清零,并开启计数器。3.每次脉冲信号...
单片机输入 1或0时输入的是什么-ZOL问答明白你的意思了,你的意思是I/O输入检测的是电压,那么要输入高电平时直接接上5V就可以了,要输入低电平时直接接上GND就可以了,为什么要上、下拉;是这样的,I/O作...
单片机 测量电流方法?单片机测量电流的方法主要有两种,分别是电压降法和霍尔效应法。1.电压降法:将一个恒定的电阻接在待测电路中,测量通过该电阻的电压,并利用欧姆定律计算电流...
单片机 温度报警器实验步骤?温度报警器就是需要温度传感器不停地对监控的对象进行检测,例如pt100温度传感器,pt100传感器是不同温度下,阻值会不同,在同一温度下,阻值是相同的。根据这个...
52 单片机 怎么测试io口有输出?向端口写1,这样有输入时读取的数据才正确。向端口写1,这样有输入时读取的数据才正确。
单片机 的 输入 和输出的都是什么?单片机的输入和输出的是因为它的输出结构类似于推挽结构,它是一种由两个三极管(或者其他管等)分别受到一个信号的控制,这信号的互补的,就是说只有一个三极管...
如何用 单片机 测量电压,要用到什么材料?1、先将输入的电压衰减一定的倍数,即衰减到0-5V范围内。衰减电路采用RC衰减器,即RC并联后再串联。选择合适的R、C参数。2、设置电压跟随电路。这个电路只要是...
如何用 单片机 测量电池电量的問題-ZOL问答采用电阻分压电路(两个电阻,串联,一段接输入,另一端接地,中间送ADC),将电池电压分到一个合理的范围内,送给单片机内部的ADC去转换,程序处理上,将转换好的ADC乘上...
单片机 按键 输入 到输出怎么实现?单片机按键输入到输出可以通过编程实现。首先需要配置IO口为输入模式,然后在主循环中不断读取按键状态,如果检测到按键按下,就将IO口配置为输出模式,并输出相...
单片机输入 信号如何避免干扰?1、将单片机控制板用金属罩封起来(网状金属罩机可以)2、交流输入线如口端加磁环3、加电源滤波器增加抗干扰性。4、信号线的屏蔽层加电感接地或电源。1、将...