写1838红外收发程序返回不了主函数

2020-01-30 13:57发布

写1838红外解码程序时,遇到问题。经调试,有以下结论:
1.用外部中断0检测按键,结果通过两个数码管动态扫描显示。主函数始终在display(),即动态扫描。
2.外部中断不触发时,程序运行正常。
3.外部中断触发后,程序能从中断开始一直运行到中断最后一行但是最后一行运行完后,程序停留在这里,不返回主函数。(中断函数开始EX0=0;末尾出有EX0=1)。
4.一次外部中断结束后,再按下一个键,能够再次进入中断,现象同3。

所以现在想问问各位,什么情况下会导致单片机有这种好像一直停留在中断函数函数尾,不返回主函数的现象?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
灰灰不会飞
1楼-- · 2020-01-31 06:42
贝贝M 发表于 2013-3-29 15:13
怀疑是你的中断函数有问题

void wbzdf() interrupt 0                                 //外部中断函数
{
        uchar count,m,n;
        EX0=0;
        IE0=0;
        while(!hwir);                                                 //9秒的低位引导码
        while(hwir);                                                 //4.5秒的高位引导码
        for(m=0;m<4;m++)
        {
                for(n=0;n<8;n++)
                {
                        while(!hwir);                  //等低电平结束
                                while(hwir)                                 //计算高电平时间
                                {
                                        delay(1);
                                        count++;
                                }               
                                        ir[m]=ir[m]>>1;
                                        if(count>5)                         //若超过1.12ms,赋1
                                        {
                                                ir[m]=ir[m]|0x80;
                                        }
                                count=0;
                }         
        }

        ir[4]=ir[2]&0x0f;                         //为ir[4]和ir[5]赋值
        ir[5]=ir[2]>>4;                                                 //9秒的低位引导码

        display(0x01,0x04);
//        P1=ir[4];
        delay(2000L);
        P1=~P1;

        EX0=1;
}
本来的中断函数经过调试以后被我改成这样了,就是想知道程序执行的过程。原来的程序和这个的结果是一样的,都是返回不了主函数。求教。
BXAK
2楼-- · 2020-01-31 07:04
没有超时跳出保护 while(hwir) 很危险
灰灰不会飞
3楼-- · 2020-01-31 08:57
BXAK 发表于 2013-3-29 21:56
没有超时跳出保护 while(hwir) 很危险

你的意思是程序可能会在这里一直等待,跳不出去吗?如上面所说,中断函数能执行到最后。
贝贝M
4楼-- · 2020-01-31 12:14
你用的四个WHILE肯定要有某个进入死循环了,换个别的判断试试

一周热门 更多>