打印
[疑难问答]

单键启动停止有时不起作用

[复制链接]
2951|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangwo|  楼主 | 2010-2-23 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前辈,好!
      
      前一段时间,做了个小程序,是用一个键控制中断定时的,来实现对一个加热器进行时间加热的。如按下启动暂停键,先进行加热并倒计时;再按下启动暂停键,就立即停止加热;再按下启动暂停键,又开始加热(回到刚才暂停的时间段)再计时;
     程序很简单,但是出现了一个现象,就是暂停启动键按下时,有时会不起作用,但信号显示已经输入到系统中了。把延时时间(就是两次检测按键信号的间隔时间)调整了几次,还是没有解决。
       再这请教各位前辈,该如何解决?
沙发
David_ming| | 2010-2-24 09:16 | 只看该作者
如果IO不紧张,建议按键检测还是开个中断吧

使用特权

评论回复
板凳
suoma| | 2010-2-24 14:18 | 只看该作者
:lol

使用特权

评论回复
地板
huamunv| | 2010-2-27 16:27 | 只看该作者
会不会是给的信号不容易读到?

使用特权

评论回复
5
麻辣鸭脖子| | 2010-3-1 22:36 | 只看该作者
我也打算做个按键程序

使用特权

评论回复
6
huamunv| | 2010-3-12 22:18 | 只看该作者
按键检测还是比较讲究的,极有可能是程序编的不好

使用特权

评论回复
7
linhai2009| | 2010-3-12 23:02 | 只看该作者
没做过,不过感觉做好中断程序很关键

使用特权

评论回复
8
laslison| | 2010-3-13 11:12 | 只看该作者
给你个按键程序看看
     按键K1控制LED指示灯实验:本程序通过实验板上的按键K1控制P1.0上的LED亮灭。程序功能如下:当K1按下开关时指示灯亮,再次按下时指示灯灭。

   轻触按键K1控制指示灯的实验例程(没有软件消抖动处理)   

      ORG     0000H
      AJMP    START       ;跳转到初始化程序

      ORG     0033H
START:MOV     SP,#60H     ;SP初始化
      MOV     P3,#0FFH    ;端口初始化

MAIN: JB      P3.2,MAIN   ;检测按键K1有没有按下
      CPL     P1.0        ;执行按键命令,改变P1.0指示灯状态
      JNB     P3.2,$      ;等待按键K1释放
      AJMP    MAIN        ;返回重新检测按键

      END

使用特权

评论回复
9
laslison| | 2010-3-13 11:12 | 只看该作者
由于本实验程序中没有进行软件消抖动延时处理,我们把程序烧写到单片机上运行时,多次按压K1控制LED的亮灭,发控制不太稳定,大约按十次,LED发光二极管的输出状态有2到3次是错误的。

    这就是因为没有软件去抖动的原因,在按键的前沿抖动或后沿抖动期间,抖动脉冲均有可能被程序检测而错误执行,此时相当于按键被按压和松开了N次,LED的输出状态也已经改变了N次,故松开按键后LED的状态是一个随机结果。

使用特权

评论回复
10
laslison| | 2010-3-13 11:13 | 只看该作者
改进的按键K1控制LED指示灯实验:本程序通过实验板上的按键K1控制P1.0上的LED亮灭。程序功能如下:当K1按下开关时指示灯亮,再次按下时指示灯灭。

    改进的轻触按键K1控制指示灯的实验例程(经过软件消抖动处理)   

      ORG     0000H
      AJMP    START       ;跳转到初始化程序

      ORG     0033H
START:MOV     SP,#60H     ;SP初始化
      MOV     P3,#0FFH    ;端口初始化

MAIN: JB      P3.2,MAIN   ;检测按键K1有没有按下
      ACALL   YS20ms      ;消前沿抖动延时,实现软件去抖动
      JB      P3.2,MAIN   ;再次检测按键,如果为高电平,则是抖动
      CPL     P1.0        ;执行按键命令,改变P1.0指示灯状态
      JNB     P3.2,$      ;等待按键K1释放
      AJMP    MAIN        ;返回重新检测按键

YS20ms:
      MOV     R7,#40      ;延时20ms子程序
YS1:  MOV     R6,#229
      DJNZ    R6,$
      DJNZ    R7,YS1
      RET

      END

使用特权

评论回复
11
laslison| | 2010-3-13 11:13 | 只看该作者
由于本实验程序中对按键的前沿抖动进行20ms的软件消抖动延时处理,我们把程序烧写到单片机上运行,多次按压K1控制LED的亮灭,发控制就很稳定了,不会出现控制错误的现象。

    通过本实验,可以看出软件去抖动延时还是很重要的,消抖动延时时间一般在5~20ms之间,实际应用时候根据实验取得最佳延时。

    本程序没有对按键松开时的后沿抖动进行消抖动,如果在要求很严格的系统中,建议增加后沿消抖动延时处理,这样可以确保按钮不会产生误动作。

使用特权

评论回复
12
麻辣鸭脖子| | 2010-3-13 21:39 | 只看该作者
一下解释了这么多啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

806

帖子

2

粉丝