搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

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

所以现在想问问各位,什么情况下会导致单片机有这种好像一直停留在中断函数函数尾,不返回主函数的现象?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-3-28 17:18:30 | 显示全部楼层
补充一下第3点,程序停留在这里不返回主函数的具体现象是两个数码管只有一个常亮,另一个不亮。

出0入0汤圆

发表于 2013-3-28 20:43:39 | 显示全部楼层
你没用返回指令?

出0入0汤圆

 楼主| 发表于 2013-3-29 10:06:06 | 显示全部楼层
lxa0 发表于 2013-3-28 20:43
你没用返回指令?

我用的c语言编译的 不用返回指令吧

出0入0汤圆

发表于 2013-3-29 11:16:45 | 显示全部楼层
你的意思是 在中断中设置返回值吗? 函数直接共享参数 可以通过全局变量 这个红外模块在进中断前做个简单的判断 稍微延时再判断 那样效果会好点

出0入0汤圆

发表于 2013-3-29 15:13:55 | 显示全部楼层
怀疑是你的中断函数有问题

出0入0汤圆

 楼主| 发表于 2013-3-29 17:51:21 | 显示全部楼层
电子爱好者_MCU 发表于 2013-3-29 11:16
你的意思是 在中断中设置返回值吗? 函数直接共享参数 可以通过全局变量 这个红外模块在进中断前做个简单的 ...

中断应该是不能返回值的吧

出0入0汤圆

 楼主| 发表于 2013-3-29 17:54:52 | 显示全部楼层
贝贝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;
}
本来的中断函数经过调试以后被我改成这样了,就是想知道程序执行的过程。原来的程序和这个的结果是一样的,都是返回不了主函数。求教。

出0入0汤圆

发表于 2013-3-29 21:56:53 | 显示全部楼层
没有超时跳出保护 while(hwir) 很危险

出0入0汤圆

 楼主| 发表于 2013-3-30 12:12:17 | 显示全部楼层
BXAK 发表于 2013-3-29 21:56
没有超时跳出保护 while(hwir) 很危险

你的意思是程序可能会在这里一直等待,跳不出去吗?如上面所说,中断函数能执行到最后。

出0入0汤圆

发表于 2013-3-30 17:35:54 | 显示全部楼层
你用的四个WHILE肯定要有某个进入死循环了,换个别的判断试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表