为什么执行完外中断后不能返回主函数

hanqingxuan 2015-01-07 11:54:25
下面是一个红外接收的部分程序,程序可以用,但是不知道执行完中断后程序去了哪,我以为会去主函数就加了个小灯。现象是
开始小灯闪烁,按下遥控后,小灯停止闪烁,但遥控功能一直正常。




void main()
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符 WWW.RICHMCU.COM
WriteData(string[i]);
i++;
}
LED1=1;
EA=1; //开启总中断
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭

while(1)
{
LED1=~LED1;
delay(500);
}; //等待红外信号产生的中断

}


void Int0(void) interrupt 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0); //如果是低电平就等待,给引导码低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1) // 执行遥控解码功能
{

Disp();//调用1602LCD显示函数
beep();//蜂鸣器响一声 提示解码成功
}
}
EX0=1; //开启外中断EX0
}
...全文
4149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南神枪 2015-01-10
  • 打赏
  • 举报
回复
是的,要清中断标致! 还有,51的EX0测脉冲不是这么干的,可以巧妙地运用G/T位。再翻一下寄存器的这个位,你就明白了。
mangoalx 2015-01-09
  • 打赏
  • 举报
回复
退出中断前再清一次中断标志。虽然禁止了中断,但标志很可能仍然在,所以退出时开中断造成直接再次进中断
xionggch 2015-01-08
  • 打赏
  • 举报
回复 1
while(IR==0); //如果是低电平就等待,给引导码低电平计时 while(IR==1); //如果是高电平就等待,给引导码高电平计时 这个貌似不能这么写吧,C是顺序执行程序,这两处的等待写法容易造成死循环,或者无效
worldy 2015-01-08
  • 打赏
  • 举报
回复
引用 4 楼 xionggch 的回复:
while(IR==0); //如果是低电平就等待,给引导码低电平计时 while(IR==1); //如果是高电平就等待,给引导码高电平计时 这个貌似不能这么写吧,C是顺序执行程序,这两处的等待写法容易造成死循环,或者无效
这个应该没问题,只要外界有脉冲进来,就能脱离 假设现在是高电平:暂时停留在红色位置 电平变低:脱离红色,进入蓝色等待 电平回高:脱离蓝色,退出函数
fly_dragon_fly 2015-01-07
  • 打赏
  • 举报
回复
这是单片机程序吧,已经全忘了这些寄存器怎么用的了。你的ISR还好用,说明返回没问题,灯停止闪烁说明那个LED1电平被拉低,你单步跟踪一下isr,看有什么语句有没有把灯关掉?
worldy 2015-01-07
  • 打赏
  • 举报
回复
应该是外部中断和定时器中断直接来回奔跑了,根本没有给主程序执行的机会
dceacho 2015-01-07
  • 打赏
  • 举报
回复
说明了PC在中断里根本就没出来,或者是不停的进中断,你把 delay(500); 去掉,按下遥控器看还闪不闪,如果能看到明显的闪动那就说明是在不停的进中断 虽然中断里调用其他函数不合适,但代码简单还不至于堆栈溢出

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧