OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 51 在51单片机的中断程序中调用其它函数会产生死机现象

共6条 1/1 1 跳转至

51 在51单片机的中断程序中调用其它函数会产生死机现象

院士
2006-12-22 22:43:00    评分
51 在51单片机的中断程序中调用其它函数会产生死机现象



关键词: 单片机     中断     程序     调用     其它     函数     产生     死机         

院士
2006-12-22 22:43:00    评分
2楼
问     下午用keil C51写的外部中断1函数,该函数是用于作为读取外部键盘值的。当有按键按下时硬件产生中断,然后延时一定时间去抖动,再读取按键值。当延时去抖动用外部延时子程序时,每次按下按键都会产生死机现象。当延时去抖动不调用外部子程序,而作了个for语句则不会产生死机现象。

      1: 不介意的话 程序发上来看看 2: 死机时的程序void Key_Int(void) interrupt 2 using 1
{
    unsigned char data i,SendCmd[4]={0x1B,0x2A,0x00,0x1B};
    unsigned char data Key_Val;
    unsigned int delaytime;
    for (delaytime = 0; delaytime < 0x3ff; delaytime++);//键盘去抖动
    Key = 1;
    if (!Key)
    {
        Key_Val = KeyComd[P4 & 0x0f];
        switch (Key_Val)
        {
            case 1:
                    SendCmd[0] = 0xff;                //发送键盘命令值
                    SendCmd[1] = 0x00;
                    break;
            case 2:
                    SendCmd[0] = 0xfe;
                    SendCmd[1] = 0x01;
                    break;
            case 3:
                    SendCmd[0] = 0xfd;
                    SendCmd[1] = 0x02;
                    break;
            case 4:
                    SendCmd[0] = 0xfb;
                    SendCmd[1] = 0x04;
                    break;
            case 5:
                    SendCmd[0] = 0xfa;
                    SendCmd[1] = 0x05;
                    break;
            case 6:
                    SendCmd[0] = 0xf9;
                    SendCmd[1] = 0x06;
                    break;
            case 7:
                    SendCmd[0] = 0xf7;
                    SendCmd[1] = 0x08;
                    break;
            case 8:
                    SendCmd[0] = 0xf6;
                    SendCmd[1] = 0x09;
                    break;
            case 9:
                    SendCmd[0] = 0xf5;
                    SendCmd[1] = 0x0a;
                    break;
            case 10:
                    SendCmd[0] = 0xf3;
                    SendCmd[1] = 0x0c;
                    break;
            case 11:
                    SendCmd[0] = 0xf2;
                    SendCmd[1] = 0x0d;
                    break;
            case 12:
                    SendCmd[0] = 0xf1;
                    SendCmd[1] = 0x0E;
                    break;
            case 13:
                    SendCmd[0] = 0xef;
                    SendCmd[1] = 0x10;
            case 14:
                    SendCmd[0] = 0xee;
                    SendCmd[1] = 0x11;
                    break;
            case 15:
                    SendCmd[0] = 0xed;
                    SendCmd[1] = 0x12;
                    break;
            default:break;
        }
        SendCmd[2] = 0xff;
        SendCmd[3] = 0x00;
        for (i = 0; i < 4; i++)            //串口发送
        {
            ACC = SendCmd[i];
            TB8 = P;
            SBUF = SendCmd[i];
            err = 0;
            while (!TI)
            {
                err++;
                if (err > 5000)
                {
                    break;
                }            
            }
            TI = 0;
        }
    }
} 3: 对不起,发错了!上面是没有死机时的程序如果将   for (delaytime = 0; delaytime < 0x3ff; delaytime++);
改成     Delay(10);//延时10ms
就产生死机现象
4: 检查是不是内存不足,导致堆栈溢出了?    你的延时函数是否在其它地方还有调用?如果有的话,要声明成可重入的。 5: 函数重入问题,需要重入声明。不过我不推荐在中断中调用函数 6: 编译的时候有没有提示L15警告 7: 不要在中断中处理那么多程序。可以改成标志 8: 请注意delaytime的数据类型! 9: to gwnpeter,编译时没有任何警告 10: to lxb_gd ,delaytime是unsigned int

菜鸟
2010-09-13 09:25:46    评分
3楼

我也遇到这种问题,在串口中断中调用一个显示函数,可是一点反应都没有,现在还不知到怎么解决这个问题呢,郁闷……


专家
2010-09-13 11:05:21    评分
4楼

中断函数调用死延时会出现以外的结果!


菜鸟
2010-10-15 17:33:10    评分
5楼
中断中加的东西太多的话 会死的

菜鸟
2013-05-15 15:53:21    评分
6楼
请问楼主后来怎么解决的呢?我也遇到这样的问题了。我在想可不可以把键扫放在中断以外的地方,可是不知道怎样实现。

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]