微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51单片机中断嵌套

关于51单片机中断嵌套

时间:10-02 整理:3721RD 点击:
各位大神,如果我用STC90C516RD的单片机,默认的中断优先级,单独跑两个定时器中断,都OK,两个定时器一起跑就有问题了,定时器0中断正常的,定时器1中断却像没有执行一样,这是为什么?两个定时器服务程序对换也是定时器0没问题,定时器1像没有执行一样。

卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了中断,因为低优先级无法打断高优先级。解决办法就是使定时器0中断时间长一些,或者进入中断时先关闭中断,退出时再打开

贴出程序出来看看!

定时器1设置不对

void init_timer(void)
{
  //AUXR &= 0xBF;  //定时器时钟12T模式
    TMOD = 0x11;     //设置0定时器模式1
    TH0 = 0xFF;    //设置定时初值
    TL0 = 0xF6;    //设置定时初值 10US
    TF0 = 0;
    TH1 = 0xFC;    //设置定时初值
    TL1 = 0x66;    //设置定时初值 1mS
    TF1 = 0;
    ET1 = 1;
    ET0 = 1;
   EA = 1;
   TR0 = 1;
   TR1 = 1;
}
void key_scan(void)//按键扫描
{
   key=1;
if(key==0)
{
  delay_nms(15);
   if(key==0)
   {
key_flag=1;
   }
}
}
void main(void)
{
  init_timer(); //初始化定时器
  Init_BH1750();       //初始化BH1750
  Delay10ms(2);
  Single_Write_BH1750(0x42);
  Single_Write_BH1750(0x65);   //设置透光率100%
///////////////////////////////////////////////////////////////
  while(1)
  {
   key_scan();
  if(flag_BH==1)
{
  flag_BH=0;
   Single_Write_BH1750(0x01);   // power on
   Single_Write_BH1750(0x10);   // H- resolution mode
   BH_flag=1;
}
   if(flag_key==1)
   {
PWM=0;
bh1750_con=1;
   }
   else
   {
    bh1750_con=0;
   }
  }
}
///////////////////////////////////////////////////////////
void timer0()interrupt 1
{
TH0=FF;
TL0=F6;
n++;
if(n==100)
{
  n=0;           ;
  led=0;
  j++;
}      
if(j==200)
{
  j=0;
  if(flag_key==0)
  {
    if(Data>15&&PWM<100)
{
     PWM=PWM+1;
    }
    else if(Data<5&&PWM>0)
{
     PWM=PWM-1;
}
  }
}
//if(PWM==0) con_l=1;
if(PWM==n)
  {
led=1; //输出高
  }
} //PWM越大,占空比越小
///////////////////////////////////////////////////////////////
void timer1()interrupt 3
{
TH1=FC;
TL1=66;
if(key_flag==1)
{
  i++;
   if(key==1)
  {
   delay_nms(5);
   if(key==1)
   {
    if(i<=100)
    flag_key=1;
    else if(i>100) flag_key=0;
    i=0;
key_flag=0;
   }
  }
}
if(BH_flag==1)
{
  BH_c++;
  if(BH_c==180)
  {
   BH_c=0;
   Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
   Data=BUF[0];
   Data=(Data<<8)+BUF[1];//合成数据,即光照数据
   Data=(uint)(Data/1.2);
   dif=abs(Data-10);
   BH_flag=0;
  flag_BH=1;
  }
}
}

我再问一下,如果用1T的单片机会不会好点?

太好了,记下了慢慢研究

果真如5l大神所言,10us的定时加长以后就OK了!

程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间

。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top