详解单片机的按键检测与控制
按键在单片机控制系统中起到人机交互的作用,通过按键可以输入数据、命令和各种参数,按键侧键测处理是单片机系统设计和开发中一个重要的内容,关系到整个系统的交互性能和稳定性。按键处理形式在单片机系统中有两种形式:直接按键和矩阵编码键盘,下面分别对这两种按键检测电路的特点及编程思路和方法进行分析和介绍。
按键抖动问题产生的原因及解决方法
按键的抖动问题是指按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象(由按键的机械特性造成,不可避免)。图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”。
在上面键扫描程序基础上增加的源程序如下:
键盘去抖动原则和方法
常用的去抖动方法有两种,即硬件方法和软件方法,两种方式的去抖效果相近,硬件去抖动的方法很多,主要用触发器或单稳态电路构成消抖电路。另外,由于软件去抖比较方便,不用增加额外的硬件开销,所以一般场合都采用软件去抖。单片机中常用软件去抖动法,软件法其实也很简单,就是在单片机获得端口为低电平的信息后,不是立即认定按键已被按下,而是延时10ms或更长一些时间后再次检测该端口,如果仍为低,说明此键的确被按下了,这实际上是避开了按键按下时的抖动时间,而在检测到按键释放后端口为高电平时,再延时50ms,消除后沿的抖动,然后再对按键进行处理,不过一般情况下,通常不对按键释放的后沿进行处理,实践证明也能满足日常的要求。如图8-3所示为按键抖动现象和硬件去抖动电路。
图8-3 按键抖动现象和硬件去抖动电路
下面通过一个实验来验证一下,实验程序如下:
ORG 0000H ;
AJMP START ;
ORG 0030H ;
START:MOV SP,5FH ;
MOV P1,#0FFH ;
MOV P3,#0FFH ;
L1:JNB P3.4,L2 ;按下按键开关取反一次P1.0 灯亮,再按一次灯灭
JNB P3.5,L3 ;按下按键开关取反一次P1.1 灯亮,再按一次灯灭
LJMP L1 ;
L2:CPL P1.0 ;
LJMP L1 ;
L3:CPL P1.1 ;
LJMP L1 ;
END
把这个程序下载到单片机会发现,当按下相应的按键时,并不是像想象中的按一下灯亮再按一下就灯灭,而是有时灵有时不灵,为什么会这样呢?原来当按了一次按键,可是单片机却早已执行了好多次,如果执行的次数是奇数,那么结果相符;如果执行的次数是偶数,结果相反。为了使CPU能正确地读出端口的状态,对每一次按键只作一次响应就必须考虑如何去除按键的抖动。下面把前面的程序进行修改,实现按键的去抖动:
ORG 0000H;
AJMP START;
ORG 0030H;
START:MOV SP,#5FH;
MOV P1,#0FFH;
MOV P3,#0FFH;
L1:JB P3.4,L2;P3.4为1时不做处理,转P3.5 否则说明有键按下
LCALL D10mS;调用延时程序去除抖动
JB P3.4,L1;P3.4为0,说明此键确实被按下了
CPL P1.0;取反P1.0
L3:JNB P3.4,L3;直到P3.4释放后转去判断第二个键
L2:JB P3.5,L1;P3.5为1,返回继续处理P3.4,否则说明有键按下
LCALL D10mS;调用延时程序去除抖动
JB P3.5,L2;P3.5为0,说明此键确实被按下了
CPL P1.1;取反P1.1
L4:JNB P3.5,L4;直到P3.5释放为止
LJMP L1;返回
D10mS:MOV R7,#50;延时的时间一般为5~20ms
D1:MOV R6,#100;
D2:DJNZ R6,D2;
DJNZ R7,D1;
RET;
END
把这段程序写入单片机查看结果,与预测相符,这就是独立式按键去抖动的基本方法,不过这个程序在实际应用中并没有多大的意义,因为如果按键数量比较多,程序就会变得很长,因为这里采用了直接寻址的方式,如果把键值放入一个表格中,再通过查表程序来判断到底是哪个按键被按下,然后处理相应的程序就会很简单,读者可尝试实现。
相关问答
单片机 的程序中,为什么 按键 要去 抖动 ?人手在按下按键的时候,由于抖动和按键触点的原因会产生多个上升沿和下降沿,导致单片机误认为按键受到了多次操作,所以要进行去抖处理,软件的处理方法一般是加...
单片机 的 按键 开关 抖动 的产生原因,抖动的特点和如何消除抖动 ...开关按钮,但信号的传导并不是单纯的由1断开/闭合时会有抖动,信号如图示会在HIGH和LOW之间抖动。这种抖动对人来说是感觉不到的,但对单片机来说,则是...
单片机按键 怎么消抖-ZOL问答按键消除抖动用硬件的方法是单稳态电路,或者采用专用芯片,而单片机本身是智能芯片,用软件消除抖动是最佳选择,这样性价比高,可靠性也高,多用一个器件就多一份成...
单片机按键 去抖啥意思?单片机按键去抖,就是单片机的按键在正常操作中在按压过程时不能一下完全接通,就是按压抖动,单片机在接收这种信息时会判断错误,所有要去掉这种抖动因...
在做 单片机 按钮控制流水灯,我想达到按一下自己循环,再按一下...#include"reg52.h"#defineuintunsignedint#defineucharunsignedcharsbitK1=P3^2;//独立...
单片机 用的无线遥控器按一下相当桉几下怎么像 按键 一样消抖?按键前,后都会有抖动,所以前后都要加延时效果会好一些,还有一种可能是芯片速度快,导致多次识别按键,你可以在识别一次后加一个标志位按键前,后都会有抖动,所...
51 单片机 中 抖动 的原因是什么?单片机中的抖动是由于外部信号的干扰和单片机内部的时钟震荡不稳定所引起的。在信号输入或输出的过程中,由于信号本身的波动和传输过程中的电磁干扰,会导致信...
单片机 复位电路问题 - 43ID216rR 的回答 - 懂得我认为绛红的蓝同学说的不太好。电容确实可以起到按键去除抖动的作用,但是这里的电容还有一个更重要的作用就是上电复位,因为考虑到芯片刚刚上电时...
单片机 控制强电设备时,如何防止干扰?像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动
请问 单片机 的 按键 信号输入为什么都有加一个电容?是延迟作用...按键下去的时候会产生抖动,如果你单片机程序没有规避的话,加一个电容是很好的选择,在你采集信号的时候会保证不出错。电阻加电容并联在按键两端,是硬件消抖其...