共6条
1/1 1 跳转至页
51 在51单片机的中断程序中调用其它函数会产生死机现象

问
下午用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
答 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


共6条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |