标题: 51单片机红外中断INT0多次进入怎么解决 [打印本页]

作者: 15576739794    时间: 2019-1-24 14:46
标题: 51单片机红外中断INT0多次进入怎么解决
部分源代码:


void ReadIr() interrupt 0
{
        uchar j,k;
        uint err;

        Time=0;
                                                 
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;         //因为位1信号最长持续时间也只为2.25ms  超过3ms肯定接收失败
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }
        keystate=1;                       
}


作者: xuyaqi    时间: 2019-1-24 15:47
可以进中断后,EA=0;禁止中断,中断处理完后开中断,EA=1;
作者: 15576739794    时间: 2019-1-24 15:54
应该具体说是按一次红外遥控器的按键 多次进入了这个中断0  
作者: feng168    时间: 2019-1-24 16:14
好像没有清中断标志位
作者: zgf123456    时间: 2019-1-24 19:01
楼上说的对
作者: 周超然    时间: 2019-1-25 08:45
普中板子,有红外代码,测试就知道了
作者: 15576739794    时间: 2019-1-25 14:01
代码我测试过了 每按一次按键都要进入3次左右的中断0,中断标志位IE不是响应中断后自动清零的吗。


还有进入中断的时候关闭总中断EA 再执行完之后再开启   之后就不会再进入中断0了  怎么回事
作者: NMT1999    时间: 2022-7-18 14:50
xuyaqi 发表于 2019-1-24 15:47
可以进中断后,EA=0;禁止中断,中断处理完后开中断,EA=1;

这样试过了 也不行
作者: zhxiufan    时间: 2022-7-18 15:57
你不退出中断就不会重入同一中断的,所以不会出现你说的情况,一般红外解码都是进入外部中断后知道解码完成才退出。
作者: pcbboy    时间: 2022-7-18 16:56
进了中断建立标志位就退出来,用普通程序去判断。
作者: 非凡科技    时间: 2022-7-18 20:15
中断最好不要用死等
作者: univers    时间: 2022-7-19 17:19
一次只能干一次,干完这次再来下一次。不过一天可以干很多次。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1