很多传统单片机教材及相关书籍,对于按键的检测和消抖,都是先判断按键是否按下,如果按下了,则阻塞延时几十毫秒,以跳过抖动时间,之后在判断一次按键是否按下,如果按下,则把按键按下变量置位。工作了才发现这种阻塞延时消抖的方法很拙劣,在这段延时的时间内,其他任务是没有办法扫描的,因此也有了很多隐患在里面,为了改善这种弊端,大多按键检测都是利用定时器消抖,并把按键扫描放到定时中断中扫描。
1、单片机的按键开关抖动的产生原因,抖动的特点和如何消除抖动用延时函数可以消抖,也有用硬件消抖的。抖动产生因为机械固有的物理特性,在瞬间接触的时候会有力学的回弹,造成28毫秒内信号不稳定。解决办法:软件延时去抖(其实是一种忽略)和硬件去抖软件判断:开关闭合延时是否还是闭合?如果是就判定打开,软件解决可以降低成本,但是有时候硬件劣化超出延时的范围会造成故障。硬件解决:专用的去抖芯片或者自己组装一个双稳态消抖电路,就是两个与非门构成的RS触发器。
这是由于机械触点断开/闭合时会有抖动,信号如图示会在HIGH和LOW之间抖动。这种抖动对人来说是感觉不到的,但对单片机来说,则是完全可以感应到的。当按钮被按下时,你所期待的效果应该是:…,而事与愿违,单片机读到的信号可能会是:…,这中间连续的1和0过渡处,短暂的几个随机交错出现的01就是我们不期望产生的抖动,虽然我们只按了一下按钮,可能会被电路误读成按了好几下按钮,而给人的感觉就是有时候按钮会不灵。
2、单片机按键如何消抖先判断按键所在的端口是否为低,不为低直接返回,否则延时20ms,再判断,如果为低,证明键已按下,此时去执行按键的功能程序,最后加上while(key0);不等到按键送来,可以提高反应速度。一般按键按下时,往往会出现所按的按键在闭合和断开位置之间跳几下才稳定在闭合状态这就是按键抖动。抖动持续时间不一,一般不会大于10MS。
程序可以这样:JBKEY1,$;等待按键按下,这只是个例子,用了$。机械消抖和软件消抖,if(key0)如果按键按下for(i0;i<100;i ):利用延时消除抖动if(key0)再次判断按键,如果还是按下状态(要执行的语句)则执行相关语句这是常用的软件消抖方法。