51单片机外部中断不能返回主程序问题,求解决

[复制链接]
 楼主| l背靠背l 发表于 2011-4-6 16:10 | 显示全部楼层 |阅读模式
/*************************************/
下面是我的初始化程序,请教高手帮忙分析一下,如果没问题还可以把外部中断服务程序发上来,急求,谢谢
/*************************************/
sbit IRIN = P3^2;         //红外接收器数据线
sbit BEEP = P2^0;    //嗡鸣器

void system_init() //系统初始化,
{
TMOD = 0x01;//定时器1工作方式1
TH0 = (65536-100)/256;
TL0 = (65536-100)%256;     
ET0 = 1;
TR0 = 1;
PT0 = 1;
PX0 = 0;
EA = 1;//定时器主要是定时,扫描读其他数据
}
void IR_init()
{   
        IRIN=1;               //P3^2,I/O口初始化
BEEP=1;
EX0=1;                //允许总中断中断,使能 INT0 外部中断
IT0 = 1;             //触发方式为脉冲负边沿触发
}
void main()
{
system_init();
delay_ms(20);
IR_init();
    while(1)
{ temp_shi=temp/100;
  temp_ge=temp%100/10;
      display(temp_shi,temp_ge);//显示温度
  bell=0;//用来测试能否返回主程序,经测试不能
}
}  //经测试在没有外部中断情况下,显示温度,响铃都正常。一旦进入外部中断,就不能显示温度和响铃了。
原野之狼 发表于 2011-4-6 16:36 | 显示全部楼层
ISR在哪里呢 有没有进入?
 楼主| l背靠背l 发表于 2011-4-6 16:48 | 显示全部楼层
ISR是什么?
ayb_ice 发表于 2011-4-6 16:56 | 显示全部楼层
把两个中断程序都帖上来吧
yan2005 发表于 2011-4-6 16:58 | 显示全部楼层
ISR - Interrupt Service Routine, 就是你说要发的中断服务程序
原野之狼 发表于 2011-4-6 16:58 | 显示全部楼层
3# l背靠背l
Interrupt  Service Routing
中断服务处理
 楼主| l背靠背l 发表于 2011-4-6 16:59 | 显示全部楼层
/*****************************************/
这是上面程序的外部中断服务子程序
/******************************************/

void IR_IN() interrupt 0
{
  unsigned char j,k,N=0;
     EX0 = 0;   
         delay(15);
         if (IRIN==1)
     { EX0 =1;
           return;
          }
                           //确认IR信号出现
  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay(1);}

for (j=0;j<4;j++)         //收集四组数据
{
  for (k=0;k<8;k++)        //每组数据有8位
  {
   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
     {delay(1);}
    while (!IRIN)          //等 IR 变为高电平
     {delay(1);}
     while (IRIN)           //计算IR高电平时长
      {
            delay(1);
            N++;           
            if (N>=30)
                 { EX0=1;
                 return;}     //0.14ms计数过长自动离开。
      }                        //高电平计数完毕               
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }
}
      if (IRCOM[2]!=~IRCOM[3])
   { EX0=1;
     return; }                           //如果8位数据码和8为数据反码不匹配,则返回

        if(IRCOM[2]==0x44 || IRCOM[2]==0x40)temp_set();
        if(IRCOM[2]==0x07 || IRCOM[2]==0x15)time_set();          //判断是哪个按键按下,进入选择

     beep();
     EX0 = 1;
     BEEP=0;   //判断外部中断能不能跳出                                                          
}
原野之狼 发表于 2011-4-6 17:04 | 显示全部楼层
在ISR里delay了这么多。。。
还有while等待
建议重新设计软件结构
ayb_ice 发表于 2011-4-6 17:06 | 显示全部楼层
本帖最后由 ayb_ice 于 2011-4-6 17:08 编辑

LZ果然程序高手

中断程序中居然有:
    1: delay程序
   2: while (!IRIN)等待某个PIN的状态
这样的程序不出问题才怪啊,程序100%在外部中断中出不来了,MAIN程序又怎么会有时间显示呢

你这是典型的天马行空,想怎么来就怎么来

强烈建议先去搞点基本的程序架构概念吧
 楼主| l背靠背l 发表于 2011-4-6 17:07 | 显示全部楼层
可是我前面的程序都正常,就是不能退出去
 楼主| l背靠背l 发表于 2011-4-6 17:25 | 显示全部楼层
领教领教
 楼主| l背靠背l 发表于 2011-4-6 17:30 | 显示全部楼层
https://bbs.21ic.com/icview-228480-1-1.html#pid1603561
请教9楼,我只是在最后的时候出不去啊
jacky-cheung 发表于 2011-4-6 18:12 | 显示全部楼层
中断里加个标识变量,出来以后,主程序根据变量的值来进行判断,下一步就
王利110 发表于 2011-4-6 20:24 | 显示全部楼层
中断里面东西太强悍了......
顶楼上!!!!!
goldenriver 发表于 2011-4-6 22:28 | 显示全部楼层
我是来学习的:)
zhanghuilong 发表于 2011-4-6 22:42 | 显示全部楼层
哥,这个是红外接收程序吧!!!中断里面太乱了!!
刘前辈 发表于 2011-4-7 09:03 | 显示全部楼层
本帖最后由 刘前辈 于 2011-4-7 09:04 编辑

太好办了。如果外部中断里这么多东西运行没有问题的话,把这些东西转化为后台程序就行了。——也即把前台的优先权及早释放,允许另一个中断触发运行。而里面的东西转化为软实时程序F1()在后台执行。——不需要重写程序,修改一下堆栈,装入后台程序地址F1(),IRET 返回到这些后台程序的地址F1就行了(函数名即地址)。
joyme 发表于 2011-4-7 09:45 | 显示全部楼层
LS不要教坏人了,这么简单的程序重写也就不到半小时时间,开始学的时候要养成好一点的习惯,这样编程可不行?
123jj 发表于 2011-4-7 11:30 | 显示全部楼层
abin0415 发表于 2011-4-7 13:01 | 显示全部楼层
刘前辈讲的太深奥了,听不懂。看来得加班学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:单反难民

0

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部