标题: 为什么51单片机中断后一直卡死在中断,不会继续往下执行,也不会返回主程序 [打印本页]

作者: hjskjhgskh    时间: 2019-5-15 14:48
标题: 为什么51单片机中断后一直卡死在中断,不会继续往下执行,也不会返回主程序
#include<reg52.h>
#include"2.h"


/***************红外解码***********************/
unsigned char IR_DAT[4];  
sbit IR=P3^2;           //将IR位定义为P3.2引脚
unsigned int LowTime,HighTime; //储存高、低电平的宽度  
unsigned char bz;
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
/*****************先知科技******************************

              led显示驱动程序
                           V1.0-20190512
*******************************************************/


#include<reg52.h>


sbit SI=P2^0;//定义数据输入口
sbit SCK=P2^1;//上升沿时数据寄存器的数据移位,a>h
sbit RCK=P2^2;//上升沿时移位寄存器数据进入数据存储器

   /**************************************************

        函数功能:延时1ms
***************************************************/
void delay1ms()
{
                   unsigned char i,j;       
                 for(i=0;i<10;i++)
                  for(j=0;j<33;j++)
           ;                 
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
**************************************************/
void delay(unsigned int n)
{
           unsigned int i;
        for(i=0;i<n;i++)
        delay1ms();
}



void Ser_IN(unsigned char DataH,unsigned char DataL)
{
unsigned char i;
for(i=0;i<8;i++)
{
  SCK=0;//现将移位寄存器时钟置低
  SI=DataH&0x80;//取数据最高位
  DataH<<=1;
  SCK=1;
}
for(i=0;i<8;i++)
{
  SCK=0;//现将移位寄存器时钟置低
  SI= DataL&0x80;//取数据最高位
   DataL<<=1;
  SCK=1;
}

}
//并行数据输出
void Par_OUT(void)
{
RCK=0;
RCK=1;

}
void dispay_reset1(void)
{

Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);


}




void dispay_reset(void)
{
/**************************************
流水灯检测坏点
**************************************/
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);
Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);
Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);
Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);
Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);
Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);
Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);

Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);

Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);

Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);

Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);
Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);
Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);
Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);
Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);


Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);

Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);

Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);

Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);

Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);

Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);

Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);

Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);

Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);

Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);

Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);

Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);

Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);

Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);

Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);

Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);

Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);

Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);


Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);

Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);

Ser_IN(0x00,0x00);         //全部开启
Par_OUT();
delay(100);

Ser_IN(0xff,0xff);         //全部关闭
Par_OUT();
delay(100);
}


main()
{
while(1)
{        EA=1;        //开启总中断
   EX0=1;       //开外中断0
ET0=0;       //定时器T1中断允许
   IT0=1;       //外中断的下降沿触发  
    TMOD=0x11;   //使用定时器T1的模式1       
        TR0=0;       //定时器T0关闭

dispay_reset();        




if(0x0a==bz)
  {

Ser_IN(bz,bz);
Par_OUT();
}
else
{

dispay_reset1();



}




}
}

/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
  {
  unsigned char i,j;
   unsigned char IR_temp;    //储存解码出的数据

   EX0=0;//关闭外中断0,不在接收二次红外信号中断,只解码当前的红外
   TH0=0;//定时器高八位清零
   TL0=0;//定时器T0低八位清0
   TR0=1;//定时器开启
   while(IR==0);//等待低电平变为高电平计算低电平的时间
   TR0=0;//关闭定时器T0
   LowTime=TH0*256+TL0;//保存低电平的时间
   TH0=0;
   TL0=0;
   TR0=1;//定时器清空之后,重新计算高电平的时间
       
   while(IR==1);

   TR0=0;//关闭定时器
   HighTime=TH0*256+TL0;

    if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700)) //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
        {
         
          for(i=0;i<4;i++)
          {
           for(j=0;j<8;j++)
           {
           while(IR==0);//低电平不执行程序,滤掉低电平,只检测高电平
          
           TH0=0;
           TL0=0;        //检测到高电平开始计算高电平持续时间
           TR0=1;

           while(IR==1);//等待高电平结束
           TR0=0;//高电平结束停止计时
          
           HighTime=TH0*256+TL0; //计算高电平的时间

           IR_temp=IR_temp>>1;

           if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
                                   IR_temp=IR_temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
           if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
                                  IR_temp=IR_temp|0x80;      


           }
          
          
                  IR_DAT[i]=IR_temp;//将得到的数据保存在数组中
                dispay_reset1();  
          }

/******************************
if(IR_DAT[2]!=~IR_DAT[3])
{
  bz=0xff;
  EX0=1;
        Ser_IN(0xff,0x00);
  Par_OUT();
return;

}
   else
   {

           bz=IR_DAT[2];
        Ser_IN(bz,bz);
    Par_OUT();
            EX0=1;
                  
           //       
   }

dispay_reset();
return;

   }



  // else
  // {
//         EX0=0;//关闭外中断0,不在接收二次红外信号中断,只解码当前的红外
          
           //dispay_reset1();

             // }
                 *******************************/
}                 
        EX0=1;           
//restart:                  
   }


作者: 克林    时间: 2019-11-8 20:08
中断服务函数里面好像是不能执行太多东西的。
作者: chen_ying992    时间: 2019-11-24 10:07
我是遇到网上拿来的红外中断出问题了,回不去主程序,中断一直没问题,后来把中断名改正常了  好像也就好了

void exint0() interrupt 0
作者: 无敌的UUZ大人    时间: 2019-11-26 12:23
为什么我在程序中并没有看到定时器设初值这条?
作者: SKLMT    时间: 2019-11-26 14:42
中断执行完如果有需求需要加个return;中断不要执行时间太长;不然很容易出现预想不到的问题。
作者: H1996    时间: 2019-11-26 17:18
中断里面内容过多
作者: zhang1070020919    时间: 2019-11-26 17:36

为什么我在程序中并没有看到定时器设初值这条?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1