关于51单片机中断嵌套
卡爆了!定时器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了!
程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间
。。
