51单片机软件方式按键消抖

编写消抖程序,我的思路是这样子的:使用定时器0延时10ms
程序在初始化之后,执行的就是判断p1.0引脚电平状态的指令,如果p1,0是低电平,那么就启动定时器0,开始计时,那么此时主程序应该干什么呢?是原地等待还是继续检测p1.0的状态呢?
定时时间到之后,在中断服务程序中检测p1.0的状态,如果是低电平,则说明按键按下了,就执行相应的子程序,执行完子程序之后呢?程序是否返回了中断服务程序的位置,继续执行呢?
如果是高电平的话,就退出中断服务程序,那么退出之后怎么办?如何才能继续执行检测p1.0状态的指令?
以上就是我的思路以及相应的疑问,请给出解释;

原地等待10MS的话,会耽误你的程序运行。如果你程序本身不在乎,那就为所谓。但是,单片机都是死循环程序。你完全可以利用程序本身一次循环的时间,来模糊计算延时。
例如,程序本身循环一次要1MS,那么计数10次,就是10MS,就行了追问

实际上当我采用空循环进行延时的时候,是可以写出按键消抖的程序的,但是当我使用定时器进行定时的时候,就产生了很多的疑问,就如问题中所说的那样,这是我要解决的问题;

追答

新手的问题,建议你画出逻辑图。别空想

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-06
老师一般这样教.假设没有按键按下时是低电平,有按键按下是高电平.当程序读取到IO口为高电平时,延时一段时间,再一次读取IO口电平,如果还是高电平,则认为是有效按键,进入按键处理程序.

此时一般还有一个处理,即如果按键不松开,则不会再次处理.追问

实际上当我采用空循环进行延时的时候,是可以写出按键消抖的程序的,但是当我使用定时器进行定时的时候,就产生了很多的疑问,就如问题中所说的那样,这是我要解决的问题;

第2个回答  推荐于2017-11-26
编写消抖程序,我的思路是这样子的:使用定时器0延时10ms
程序在初始化之后,执行的就是判断p1.0引脚电平状态的指令,如果p1,0是低电平,那么就启动定时器0,开始计时,那么此时主程序应该干什么呢?
是原地等待还是继续检测p1.0的状态呢?
--P1.0,可以不检测了,因为已经启动了定时器。
--可以检测其它接口。
--如:串口、AD转换接口、温度检测、烟雾报警接口、红外输入接口...

--也可以输出,动态数码管显示...

定时时间到之后,在中断服务程序中检测p1.0的状态,如果是低电平,则说明按键按下了,就执行相应的子程序,执行完子程序之后呢?程序是否返回了中断服务程序的位置,继续执行呢?
--回到发生中断的地方。

如果是高电平的话,就退出中断服务程序,那么退出之后怎么办?
--回到发生中断的地方。
--没有了定时,应该继续执行检测p1.0状态。追问

看一下我在下面的追问中贴出的程序,在MAIN中,检测到p1.0是低电平的时候,启动定时器,然后就进入了原地等待的指令;
定时时间到了之后,如果p1.0为低电平,就执行相应的程序,如果是高电平,就退出中断了,但是退出之后,执行的依然是原地等待命令,我希望是继续检测p1.0的状态;
使用定时器延时的时候,这个程序就存在这个问题,但是如果使用空循环延时的话,就能够写出来了,希望能针对我的程序给出几点建议;

追答

检测到p1.0是低电平的时候,启动定时器,然后就进入了原地等待的指令;
----

老等那行?
还得循环的检测。
前面已经说了:

--P1.0,可以不检测了,因为已经启动了定时器。
--可以检测其它接口。
--如:串口、AD转换接口、温度检测、烟雾报警接口、红外输入接口...

上面说的,已经包括检测定时器是否停止。
当定时中断结束后,应有令 TR0 为零的语句。

当 TR0 为零后,就继续检测 P1.0。

本回答被提问者采纳
第3个回答  2013-11-06
你对自己设计的框架都不是非常清晰啊……
开始计时,那么主程序应该干嘛——这不是你自己要设计的内容嘛,我们怎么会知道你主程序里面要干嘛呢?

我建议你把设计的功能说清楚,要实现什么说明白一些,这样大家就好给你思路了。
或者你把你的程序弄上来,大家帮你看看你的程序有什么样的缺陷。

按照正常中断来说,退出中断后肯定是会继续往下执行任务的,这个不用怀疑,除非你的系统跑飞了,或者存在别的BUG。追问

说的也是;
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP DELAY

MAIN:
SETB EA
SETB ET0
MOV TMOD,#00H
MOV TH0,#00H
MOV TL0,#00H
JB P1.0,$
SETB TR0
LJMP $
DELAY:
CLR TR0
MOV TH0,#00H
MOV TL0,#00H
JNB P1.0,LED
RETI
LED:
CPL P2.0
END
字数限制 追问中?

相似回答