按照教材,昨天学到了检测按键的程序,也很明确昨天学那个程序难登大雅之堂,因为它没有实现按键在闭合和开关时的电压信号抖动。
如图示,键按下试产生多个抖动的波形,也就是产生了多个101010,而我们实际中只是两个状态只是1,或只是0。所以收集了干扰信号。于是就有今天我学的“去抖动程序”
去抖原理:收到第一个低电平信号(按下的信号)后,开始延迟再次收集信号,再确认是否低电平(一直被按下)这时收集的信息就来自抖动波形图的中间部分,所以只要这个时间段是低电平,按键就肯定被按下了,不会再有抖动。这时就跳到指令检测这个按键引脚什么时候变为高电平(表示释放按键),不断循环检测,直至按键被释放。检测到释放信号后,就有cpl指令修改相应led灯的开关状态。所以这个程序通过 延时和 检测到按键被释放后才控制led灯的亮灭 而实现了去抖的功能。准确地实现按一下就真正等于单片机收集到一个信号而不是多个抖动的信号。
需要提一下的是如果没有 检测到按键被释放后才控制led灯的亮灭 的指令的话(27--33行指令),而只有延时,经实验证明,是无法实现去抖的。因为这样在波形中间时段就已经不断控制led的亮灭,而那么长的波段,led不断闪烁,当按键释放的时候,led是亮还是灭,就听天由命了。。。
无检测到按键被释放后才控制led灯的亮灭 指令程序如下:
ORG 0000H
SJMP START
ORG 0030H
START:
MOV SP,#060H
MOV P0,#0FFH
MOV P2,#0FFH
MAIN:
JNB P0.0,QUEREN
JNB P0.7,QUEREN2
SJMP MAIN
QUEREN:
CALL DELAY
JNB P0.0,SHIFANG
SJMP MAIN
QUEREN2:
CALL DELAY
JNB P0.7,SHIFANG2
SJMP MAIN
SHIFANG:
WAIT: JB P0.0,LED0
SJMP WAIT
SHIFANG2:
WAIT2: JB P0.7,LED7
SJMP WAIT2
LED0:
CPL P2.0
SJMP MAIN
LED7:
CPL P2.7
SJMP MAIN
DELAY:
MOV R0,#25
D1: MOV R1,#100
D2: DJNZ R1,D2
DJNZ R0,D1
RET
END
这个程序虽然有缺陷,但很值得分析 。。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』