6481|17

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教 单片机上使用开关,有抖动的问题 [复制链接]

我现在定义了,如果P2.4是低电平则执行一个操作,使一个变量的值+1,现在我在P2.4口上接了个开关,就是那种按下去接着弹起来的按钮开关,现在按下去则P2.4是低电平,但是我发现这样有一些问题,按一次变量的值乱蹦,因为执行了很多次吧。
于是我加了一个延迟
JB P2.4,NEXT
LCALL DELAY
JB P2.4,ADD
是高电平的话,执行下面操作,检测到低电平则先延迟,再判断如果是高电平则跳到ADD去变量+1,我发现这样写有好转,但还不是特别的稳定可靠,还是会出现没有+1的情况。
请问,我应该怎么写才好呢?
入门不久,请多多指点啊!

最新回复

一个小的瓷片电容1分钱不到,花那么多精力去调软件就为了节约这点成本。。。 而且,稍微动手实践过的人都知道,簧片按键不橡胶按键,不论你怎么调软件,怎么延时,都很难达到理想的效果,不是抖动厉害,就是极不灵敏,很不稳定,有时按着不放,说不定也会来几个高脉冲,刚好就被检测到了  详情 回复 发表于 2009-12-10 09:42
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
曾有一个讨论这个话题的帖子,仔细找找 看
给个简单的参考
bit flag=0;
void Time0 Interrupt 0(定时器X)
{
    if(1==P2^4)flag=0;
   if(0==P2^4)
   {
      if(flag==1)
      {
          你的变量+1;
          flag=0;
      }
      else
      {
          flag=1;
       }
      P2^4=1;
   }
}
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
硬件上加个电容滤波.
软件上就用楼上说的用定时器去检测,但需要再做点改进就是flag的值可以多计算几次,如果10ms响应一次中断则计算flag >= 50的时候去将变量+1
按照楼下的程序给个简单的例子,当然还其他的情况没考虑。比如处理长按等情况。
bit flag=0;
void Time0 Interrupt 0(定时器X) 10ms
{
  if(P2^4 == 0)
  {
      flag++;
      if(flag>=50)  //按下大于500ms
      {
          你的变量+1;
          flag=0;
      }

  }
  else
  {
   flag = 0;
  }
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
问题很简单。 上面的都说了。

我就友情帮顶下。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
最有效的办法就是在开关上并个小电容,再加上延时检测,基本上就没抖动了。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
这就是按键去抖动 加延时 时间你可以自己去测试  
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
开关上并个小电容,再加上延时检测,不错
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
开关接斯密特触发器!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 4 楼 haierpro 的回复:
最有效的办法就是在开关上并个小电容,再加上延时检测,基本上就没抖动了。


顶这个!
软件只能是辅助,最根本的还是硬件改进
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
   JB P2.4,NEXT
   LCALL DELAY
   JB P2.4,OUT//在此判断按键是否按下,若还是高电平,则为干扰,跳出按键判断程序;低电平则确定有
键按下   
   JNB P2.4,ADD


还有那个延时至少是5ms,这样应该是没有问题了。

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 veron_04 的回复:
引用 4 楼 haierpro 的回复:
最有效的办法就是在开关上并个小电容,再加上延时检测,基本上就没抖动了。


顶这个!
软件只能是辅助,最根本的还是硬件改进

赞同,不过硬件是增加成本,还是采用软件消抖延时才能达到成本最低.
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 
在开关上并个小电容
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
判断为低,变量+1
然后一定时间内不再扫描(比如0.5秒,根据你的业务需要调整,比如我们判断按键速度不会超过每秒1次)
然后判断是否为高电平,为高说明已经释放,同样一定时间内不再扫描去抖动
然后就可以进入下一循环了
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

14
 
如果要用软件的话,可以每5ms检测一下状态,如果本次和上次相同,则计数加1,否则清零,计数达到10次(50ms)认为一次有效按键,可以根据计数做长短键判断!
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

15
 
软件不增加成本
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

16
 
延时去抖动应该就没有问题了
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

17
 
延时就没有问题了。
先判断是否按下,是则延时,不是则继续扫描,延时(10MS)以后判断按键是否还在按下状态,不是则为干扰,是则却为按下执行按键程序即可。若要在按键抬起后执行程序则,则在确定其按下后判断是否抬起,若无抬起则等待,若其执行。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
一个小的瓷片电容1分钱不到,花那么多精力去调软件就为了节约这点成本。。。
而且,稍微动手实践过的人都知道,簧片按键不橡胶按键,不论你怎么调软件,怎么延时,都很难达到理想的效果,不是抖动厉害,就是极不灵敏,很不稳定,有时按着不放,说不定也会来几个高脉冲,刚好就被检测到了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表