打印

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

[复制链接]
11213|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
把两个中断程序都帖上来吧

使用特权

评论回复
5
yan2005| | 2011-4-6 16:58 | 只看该作者
ISR - Interrupt Service Routine, 就是你说要发的中断服务程序

使用特权

评论回复
6
原野之狼| | 2011-4-6 16:58 | 只看该作者
3# l背靠背l
Interrupt  Service Routing
中断服务处理

使用特权

评论回复
7
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;   //判断外部中断能不能跳出                                                          
}

使用特权

评论回复
8
原野之狼| | 2011-4-6 17:04 | 只看该作者
在ISR里delay了这么多。。。
还有while等待
建议重新设计软件结构

使用特权

评论回复
9
ayb_ice| | 2011-4-6 17:06 | 只看该作者
本帖最后由 ayb_ice 于 2011-4-6 17:08 编辑

LZ果然程序高手

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

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

强烈建议先去搞点基本的程序架构概念吧

使用特权

评论回复
10
l背靠背l|  楼主 | 2011-4-6 17:07 | 只看该作者
可是我前面的程序都正常,就是不能退出去

使用特权

评论回复
11
l背靠背l|  楼主 | 2011-4-6 17:25 | 只看该作者
领教领教

使用特权

评论回复
12
l背靠背l|  楼主 | 2011-4-6 17:30 | 只看该作者
https://bbs.21ic.com/icview-228480-1-1.html#pid1603561
请教9楼,我只是在最后的时候出不去啊

使用特权

评论回复
13
jacky-cheung| | 2011-4-6 18:12 | 只看该作者
中断里加个标识变量,出来以后,主程序根据变量的值来进行判断,下一步就

使用特权

评论回复
14
王利110| | 2011-4-6 20:24 | 只看该作者
中断里面东西太强悍了......
顶楼上!!!!!

使用特权

评论回复
15
goldenriver| | 2011-4-6 22:28 | 只看该作者
我是来学习的:)

使用特权

评论回复
16
zhanghuilong| | 2011-4-6 22:42 | 只看该作者
哥,这个是红外接收程序吧!!!中断里面太乱了!!

使用特权

评论回复
17
刘前辈| | 2011-4-7 09:03 | 只看该作者
本帖最后由 刘前辈 于 2011-4-7 09:04 编辑

太好办了。如果外部中断里这么多东西运行没有问题的话,把这些东西转化为后台程序就行了。——也即把前台的优先权及早释放,允许另一个中断触发运行。而里面的东西转化为软实时程序F1()在后台执行。——不需要重写程序,修改一下堆栈,装入后台程序地址F1(),IRET 返回到这些后台程序的地址F1就行了(函数名即地址)。

使用特权

评论回复
18
joyme| | 2011-4-7 09:45 | 只看该作者
LS不要教坏人了,这么简单的程序重写也就不到半小时时间,开始学的时候要养成好一点的习惯,这样编程可不行?

使用特权

评论回复
19
123jj| | 2011-4-7 11:30 | 只看该作者
;P

使用特权

评论回复
20
abin0415| | 2011-4-7 13:01 | 只看该作者
刘前辈讲的太深奥了,听不懂。看来得加班学习了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:单反难民

0

主题

7

帖子

0

粉丝