×
嵌入式 > 嵌入式开发 > 详情

关于单片机按键的抖动与消抖

发布时间:2020-09-03 发布时间:
|
单片机的程序中,如果涉及到按键,一般都会看到几行注释着“消抖”的代码。
比如下面这一段:

if((KeyV|0xc3)==0xff){//无键按下
return 0;
}
mDelay(10);//延时,去键抖
KeyV=P3;
if((KeyV|0xc3)==0xff){//无键按下
return 0;
}

关于其作用与目的,有如下解释:
按键在按下时会产生电平的变化,通常是由高电平变为低电平,而且这一过程也不是瞬间完成的,按键按下之后,电平会有一段不稳定变化的时间。一般情况下,我们的程序读取这个电平变化并做相关的动作。但由于机械按键的局限性,当系统受到外力而产生抖动或其它动作时,也可能使系统内部产生电平变化(通常这种变化持续的时间非常短),这种现象称之为按键的“抖动”。
这种“抖动”显然不是我们期望出现的,一旦程序中没有针对它进行特殊处理,这种隐患很可能导致系统执行我们不希望出现的动作。进而可能酿成一场悲剧。避免按键“抖动”的操作就称之为“消抖”。
目前,单片机的消抖主要分为软件消抖和硬件消抖。
其中,软件消抖增加软件资源,但不增加硬件成本;硬件消抖反之。
现在普遍采用的是软件消抖的方式。

软件消抖具体的操作思路是:
当监听到按键被按下时,不立刻执行相关的操作,而进行一定时间的延时(通常是50ms),之后再次检测按键是否被按下,如果此时按键仍然被按下,则判定按键确实被按下了(因为不论是异常情况导致的抖动还是正常情况下按键被按下产生的电平变化都会在这一段时间内过去,紧接着的电平将会是稳定的),然后进行按键被按下之后所需要的操作,否则判定按键未被按下,继续监听按键状态。
实际上,以上所说的软件消抖的方法在真正的软件中应用的不多,只是在练习的时候使用。真正的应用上,会在可能产生抖动的那一段时间内等间隔多次监听按键状态(电流状态),等到数次(可以是连续5次)电流平稳了才确定按键被按下。按键被放开时采取同样操作。这样才不会产生误差,例如在延时的时候出现按键按下并放卡的情况会被漏过。

硬件消抖的思路则是采用相关手段去除最初产生的那不稳定的电平变化,只输出后面稳定的电平。
具体的实现方法有以下两种:

法1:
用10K的上拉电阻与按键串联,然后按键并联一个去抖电容用以消除按键的机械抖动。电容的计算方法如下:电容的容值是根据机械按键的触点抖动频率而定,一般机械按键的抖动频率为100Hz左右,当按键闭合抖动时接触时间在毫秒级,根据电容放电的时间t=0.7×√RCR=10K,C选0.1μF,电容的充放电时间约20ms,大于抖动时间,可将抖动滤除掉。通常电容C选取0.01μF~1μF.

法2:
在键数较少时可用硬件方法消除按键抖动。下图所示的RS触发器为常用的硬件去抖。


图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当按键按下时,输出为0.此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机汇编语言 如何实现点亮熄灭二极管