当前位置: 代码迷 >> 单片机 >> 51单片机用P3^2口(INT0)接收红外数据中断总是进两次,该如何处理
  详细解决方案

51单片机用P3^2口(INT0)接收红外数据中断总是进两次,该如何处理

热度:85   发布时间:2016-04-28 15:36:54.0
51单片机用P3^2口(INT0)接收红外数据中断总是进两次
如题, 我用P3^2口接收红外数据, 但是每次有信号来的时候, 总是会进中断两次. 不管是怎么处理都一样.

在外部中断0处理里面, 我是这样做的:

void int0() interrupt 0{
 
EX0 = 0;
IT0 = 0;
        MODE = 1;   // 置标志位, 在主函数里面的while(1)里面接收红外数据
IT0 = 1;
EX0 = 1;

}


之所以像上面那样做是因为听过人说, 这样就不会产生两次中断. 可是还是产生了两次中断~~

这是什么原因, 难道是没有去抖 ?  谁知道 去抖 是怎么一回事, 或者有解决进入两次中断的方法 ?
------解决方案--------------------
去抖有两种做法:
1)硬件上,在脉冲输入端加一个很小的阻容滤波,滤去尖毛刺;
2)软件做,见下;
     你的情况。可能收到的红外脉冲本身就有多个,自然就会多次进入中断(2次或以上)。此时,硬件滤波就无法做了。
    软件做法是,设置一个定时器中断。在进入红外脉冲中断后,禁止外中断(ET0=0)。同时启动定时器计数,t0时间过了之后,清外中断悬挂IE0=0,再开外中断ET0=1。这样在t0时间之内不会有两次外中断发生,达到去抖效果。
------解决方案--------------------
硬件上可以加小电容,软件上可以用定时器捕抓方式,中断处理要快只设标记和记录数据,在主函数里面的while(1)里面处理红外数据。
------解决方案--------------------
已经进入中断了,我们需要禁止瞬时发生的第2次中断,所以要ET0=0; 再次允许外中断之前,为了避免这期间已经有悬挂着的外中断,所以让IE0=0。能否软件清零,你可以试一下,不行的话再想办法。