常用的去抖动方法有两种,即硬件方法和软件方法,两种方式的去抖效果相近,硬件去抖动的方法很多,主要用触发器或单稳态电路构成消抖电路。另外,由于软件去抖比较方便,不用增加额外的硬件开销,所以一般场合都采用软件去抖。单片机中常用软件去抖动法,软件法其实也很简单,就是在单片机获得端口为低电平的信息后,不是立即认定按键已被按下,而是延时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
把这段程序写入单片机查看结果,与预测相符,这就是独立式按键去抖动的基本方法,不过这个程序在实际应用中并没有多大的意义,因为如果按键数量比较多,程序就会变得很长,因为这里采用了直接寻址的方式,如果把键值放入一个表格中,再通过查表程序来判断到底是哪个按键被按下,然后处理相应的程序就会很简单,读者可尝试实现。
举报/反馈