找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7660|回复: 6
收起左侧

为什么51单片机中断后一直卡死在中断,不会继续往下执行,也不会返回主程序

[复制链接]
ID:524819 发表于 2019-5-15 14:48 | 显示全部楼层 |阅读模式
#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:                  
   }

回复

使用道具 举报

ID:632653 发表于 2019-11-8 20:08 | 显示全部楼层
中断服务函数里面好像是不能执行太多东西的。
回复

使用道具 举报

ID:394817 发表于 2019-11-24 10:07 | 显示全部楼层
我是遇到网上拿来的红外中断出问题了,回不去主程序,中断一直没问题,后来把中断名改正常了  好像也就好了

void exint0() interrupt 0
回复

使用道具 举报

ID:606366 发表于 2019-11-26 12:23 | 显示全部楼层
为什么我在程序中并没有看到定时器设初值这条?
回复

使用道具 举报

ID:649922 发表于 2019-11-26 14:42 | 显示全部楼层
中断执行完如果有需求需要加个return;中断不要执行时间太长;不然很容易出现预想不到的问题。
回复

使用道具 举报

ID:638447 发表于 2019-11-26 17:18 | 显示全部楼层
中断里面内容过多
回复

使用道具 举报

ID:649818 发表于 2019-11-26 17:36 | 显示全部楼层

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表