单片机定时器中断实现按键去抖动问题?

51单片机在用外部中断0控制LED灯亮灭时,可能没去抖动吧,一运行LED灯就在闪烁,用空循环延迟去抖太浪费CPU了不好,所以我用定时器0中断编写了个较简陋的程序实现按键去... 51单片机在用外部中断0控制LED灯亮灭时,可能没去抖动吧,一运行LED灯就在闪烁,用空循环延迟去抖太浪费CPU了不好,所以我用定时器0中断编写了个较简陋的程序实现按键去抖动功能(程序逻辑可能没那么严谨)。程序的问题是:按键第一次按下后没有反应,但之后再次按下按键就正常工作了,能控制LED灯的亮灭,下面是我的程序和电路图,希望有大神可以给予指导。
#include<reg52.h>
#define uchar unsigned char
#define uchar unsigned char
uchar key_num;
bit key_statue; //按键标识
uchar ms;
sbit key=P3^2;
sbit led=P1^0;
void main(void)
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
EX0=1;
TR0=1;
IT0=1;
PT0=1;
EA=1;
key_statue=key_num=0;
led=1;
while(1);
}

void t0() interrupt 1 //1ms 用于按键去抖动。
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ms++;
if(key==0)key_num++;
if(ms==15) //15秒刷新一次
{
if(key_num>10) //15秒钟如果低电平持续时间大于10秒就认为按键按下,而不是抖动
key_statue=1; //按键标识位置1
ms=0;
key_num=0;
}
}

void int0() interrupt 0 //外中断0,设定工作模式
{
if(key_statue==1)
{
key_statue=0;
led=~led;
}
}
仔细看好问题,用定时中断实现按键去抖动,用硬件解决的就算了。
展开
 我来答
沿路独自哼唱
2012-10-30
知道答主
回答量:7
采纳率:0%
帮助的人:2.8万
展开全部
因为key_statue原来等于0,,按键刚按下时,进入外部中断,不满足条件,LED不会改变,当再次按下,定时器使按键标识置1,灯变化,注意程序时序问题。
buliao12
2011-12-16 · 超过15用户采纳过TA的回答
知道答主
回答量:74
采纳率:75%
帮助的人:28.6万
展开全部
有四年经验的高手,小弟不惨和哦,哈哈
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wolf_lhy
推荐于2017-11-24 · TA获得超过6609个赞
知道大有可为答主
回答量:1090
采纳率:66%
帮助的人:556万
展开全部
if(key_statue==1)
{
key_statue=0;
led=~led;
}

你把这段代码写到主循环中,不能放到外中断中,这样就正常了,另外,把定时器的中断改成我给你的样子,要是不正常你找我!

void t0() interrupt 1 //1ms 用于按键去抖动。
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;

if(key == 0)
{
   key_num++;
  if(key_num>=15)
  {
   key_num = 15;
   key_statue=1;
  }
}
else
    {
       key_num = 0;
    }

}
更多追问追答
追问
我现在就是因为外部中断控制LED灯有问题所以加个去抖程序,还有你改的更本没去抖功能好么
追答
void t0() interrupt 1		//1ms  用于按键去抖动。
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;

if(key == 0)
{
   key_num++;
  if(key_num>=15)
  {
   key_num = 15;
   key_statue=1;
  }
}
else
    {
       key_num = 0;
key_statue=0;//-----加上这个
    }

}

//-----把下面这个写到主循环中,没必要写到外中断中,增加一个全局变量Old_Key_Status
if(key_statue != Old_Key_Status)
{
Old_Key_Status = key_statue;
if( key_statue == 1) led=~led;
}
我做了四年单片机了,刚才确实犯了个小错误
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式