
软件去抖可利用延时程序进行去抖。由于抖动时间很短,当有按键按下并检测到按下时,对程序进行一小段延时,跳过前沿抖动,再进行一次按键按下检测,若检测到按下则说明确实有按键按下,这也避免了前沿抖动。对于后沿抖动,在检测到确实有按键按下时延时一小段延时,再去检测按键是否被抬起,检测到抬起则一次按键的检测完毕。
使用这个到板子里面:
#include <reg52.h>
sbit ADDR0 = P1^0
sbit ADDR1 = P1^1
sbit ADDR2 = P1^2
sbit ADDR3 = P1^3
sbit ENLED = P1^4
sbit KEY1 = P2^4
sbit KEY2 = P2^5
sbit KEY3 = P2^6
sbit KEY4 = P2^7
unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}
void delay()
void main(){
bit keybuf = 1//按键值暂存,临时保存按键的扫描值
bit backup = 1//按键值备份,保存前一次的扫描值
unsigned char cnt = 0//按键计数,记录按键按下的次数
ENLED = 0 //选择数码管 DS1 进行显示
ADDR3 = 1
ADDR2 = 0
ADDR1 = 0
ADDR0 = 0
P2 = 0xF7 //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[cnt] //显示按键次数初值
while (1){
keybuf = KEY4 //把当前扫描值暂存
if (keybuf != backup){ //当前值与前次值不相等说明此时按键有动作
delay() //延时大约 10ms
if (keybuf == KEY4){ //判断扫描值有没有发生改变,即按键抖动
if (backup == 0){ //如果前次值为 0,则说明当前是d起动作
cnt++ //按键次数+1
//只用 1 个数码管显示,所以加到 10 就清零重新开始
if (cnt >= 10){
cnt = 0
}
P0 = LedChar[cnt]//计数值显示到数码管上
}
backup = keybuf//更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约 10ms */
void delay(){
unsigned int i = 1000
while (i--)
}
在按键上增加电容去除干扰,在按键上串一个电阻也可以解决静电或者是其他干扰对按键造成的干扰。
软件去抖动也是一种非常常见的去抖动的方法,就是对按键进行多次的检测,每次检测都被按下,才认为按键被按下。软件去抖动要采用多次采集的方法,中间的间隔可以使用延时或者使用分时的思想来进行去抖动,一般的软件去抖中都是用分时思想去抖动。
扩展资料:
注意事项:
按键稳定闭合时间长短是由 *** 作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内。
为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。
利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度,所以实际中使用的并不多。
参考资料来源:百度百科-按键消抖
参考资料来源:百度百科-单片机
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)