51单片机 求解:使用定时器消除按键抖动,下面是我的源程序,实际操作时按一次相当于按多次,不知原因。

#include <reg52.h>
#include <intrins.h>

#define Time 922 //约1ms
sbit key1=P3^5;
int allow_key1=0,t0_cut=0;

void Initialize();
void exe_key1();

void main()
{
Initialize();
P1=0xf0;
while(1)
{
if(key1==0)
{
TR0=1;
}
if(allow_key1==1)
{
exe_key1();
allow_key1=0;
}

}
}

void Timer0() interrupt 1
{
TR0=0; //暂时关闭定时器
TH0=(65536-Time)/256;
TL0=(65536-Time)%256;
t0_cut++;
if(t0_cut==10)
{
allow_key1=1;
t0_cut=0;
}

}

void Initialize()
{
EA=1;
TH0=(65536-Time)/256;
TL0=(65536-Time)%256;
TMOD=0x01;
ET0=1;
}
void exe_key1()
{
if(key1==0)
{
while(!key1)
{
P1=_crol_(P1,1);
}
}
}

我之前用状态机的方法点用一个定时器(即使定时器用于按键检测还可用作其它用途)写了个不用延时的函数,现在都不知道放哪了,用状态机的方法能很好解决按键这个问题追问

不太懂状态机,能解释下不,谢谢

追答

按键未按下时为状态1,按键按下为状态2,按键松开为状态3,定义一个变量变量的数值0,1,2分别对应状态1,2,3当变量的值为2(状态3)读取键值,又转到状态1如此循环下去

追问

我发现哪里出问题了,我的程序出了小错误,在while(!key1)这里加个分号就可以了。

多谢前辈,以后试试你这种方法。

追答

温馨提示:内容为网友见解,仅供参考
无其他回答

单片机按键延时,使用定时计数器消除按键延时,求操作流程
1 按键处理的操作流程:当发现有键按下时, 为了消除按键的抖动 需要软件延时5~10ms 经过延时后 再读入按键的状态 如果按键有效 则进入相应的按键处理程序 否则(按键无效)可以视为干扰。2 一般都是采用软件延时(即调用一个延时子程序 延时5ms )不要使用定时计数器来延时 ...

51单片机实验(关于定时器计数器)
JB FKEY,MENU1 ; 键未按下则转修改(M)键扫描 INC R6 ; F键按键次数加1 MOV A,R6 ; 移入按键次数 RL A ; 指针放大 MOV DPTR,#FUNTAB JMP @A+DPTR ; 根据按键次数跳转到相应的程序段FUNTAB: AJMP WAITFK AJMP SETLOW AJMP SETHI AJMP ENDMEN NOP NOP AJMP ENDMEN;STWKMD: ; 工作模式设定,不需...

下面51单片机C语言程序怎么改成按钮按一下才执行,再按一下就停止,如此...
如果用户按下键不放会有问题,最好改为用户按下键再弹起为一次输入。

51单片机按键控制按下K1四个led灯循环亮,再按一下全灭,c程序怎么写
在四个灯循环点亮的状态下,每点亮一个灯需要延时,如果调用延时子程序,按键就显示不灵敏了,所以,采用定时器中断的方式控制延时,就不影响按键了。include<reg51.h> include<intrins.h> 仿真图效果。

请问51单片机定时器延时的调用是怎么调用的我有点不明白,谢谢
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器\/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有...

80C51单片机怎么用按键选择两个不同的程序?
1. 首先,您需要连接一个按键到80C51单片机的输入引脚上。假设按键连接到P1口的某个引脚(例如P1.0)。2. 设置P1口的引脚为输入模式,以接收按键的状态。您可以使用P1口的寄存器(例如P1CON)来设置引脚的工作模式。3. 在主程序中,使用一个循环来读取按键的状态。您可以使用P1口的寄存器(例如P1)...

怎样用51单片机实现累加计时和倒计时,并用六个共阴极数码管显示出来。用...
没有定时器的不过有数字钟的你可以参考下 其中可有有用的摘要本题给出基于单片机的数字中的设计,设计由单片机作为核心控制器,通过频率计数实现计时功能,将实时时间经由单片机输出到显示设备——数码管上显示出来,并通过键盘来实现启动、停止、复位和调整时间的功能。关键词: 单片机、数字钟、AT89S52、LED 1 引言在单片...

...高手能帮忙把下面按键扫描程序改成用定时器对按键进行定时扫描啊,我...
楼主的那个程序我看不太懂:不过根据你的大概意思更改了一下程序,希望对你有帮助!下面是我的程序代码:\/ 文件名 : 矩阵键盘.c 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示 当前的按键值。\/ include<reg51.h> include<intrins.h> define uint unsigned int defi...

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、...

在编写单片机程序时,例如 DDRA=0xff; 这个0xff是怎么确定的呢?
在需要精确计时的场合,需要使用定时器,在之后的课程中将会学到。程序由一个循环组成,在点亮P10 口的LED 之后,延时一段时间,再灭掉LED,又延时一段时间,之后循环到前面。for()循环后面直接一个分号,表示这个循环里面什么事情也不做,就等循环完成指定的次数就退出来。这也是指令循环延时的最常见...

相似回答