百分悬赏51单片机定时器中断优先权问题

来源:百度知道 编辑:UC知道 时间:2024/06/02 13:40:50
void count0() interrupt 1
{
flag0=1;
beep=0;
delay50ms(1);
tt5=0;//初始化最近5次液滴所用时间
TH0=(65536-1)/256;
TL0=(65536-1)%256;
yds++;//液滴数

if(js5++>=6)
{ tt5=tt0;
js5=0;tt0=0;
ds=6000/tt5;//每分钟滴速(测试)
}

}

void count1() interrupt 3//50ms计时中断
{ TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
tt0++;
}

两个中断分别是上面那样的。简要的说,计数器T0是记液滴数,定时器T1是每50ms产生一个中断计使tt0加一。然后没5个液滴,查询tt0计数值,就可以算出液滴速度。
现在问题是。。。
默认T0优先权币T1高,当T0中断执行检测液滴的时候,T1中断就无法计数了!导致计时不准。而且由于去抖动,导致T0执行时间比较长。
设置T1中断高之后,当T1产生中断就是在执行计时tt0自加时,虽然时间很短,但是这是如果来一个液滴,T0中断还是被屏蔽了,就会漏掉液滴数,也导致计时不准。这样可能100次才会碰上几次的样子,但是对测速影响还是太大。不可取。

请教下,如何设置才能保证即计时准确也能够计数准确呢?
老师说可以使T1计时器不产生中断,直接自己计数,然后到需要的时间查询计数值得到时间,不产生冲突。可现在没发现51能够读取计数器值的例程。
现这种情况请教解决方法。
给出方案后,最好能附上程序或者参考资料。
谢谢
我已经改成用中断来延时的了。可是还是 不行。。。无解。。。
请帮我看看。参考《百分悬赏51单片机定时器中断优先权问题(续)》
共200分了

误区:记液滴数应该使用外部中断,不要采用定时器

方案:
定时器0用做液滴计时器,并增加一个时间的高位变量tt0,外部中断0用做液滴计数器,接液滴计数脉冲信号.
当第一个液滴脉冲来的时候,将定时器0及tt0清零,并开始计时,此时定时器0及tt0组成一个3字节的单位为uS的计时器,液滴计数器置为1,表示第1个液滴开始计数;以后每来一个液滴,液滴计数值加1,当液滴计数值等于6时,停止定时器,此时的定时器值就是5个液滴的时间.
unsigned char drops,tt0;
void timer0() interrupt 1//65536uS计时器0中断
{ tt0++;
}
void count0() interrupt 0//液滴计数器外部中断0
{
if(drops==0)
{//第1个液滴落下时,计时值全清零,并开始计时
TL0=0;
TH0=0;
TR0=1;
tt0=0;
}
if(drops<6)
drops++; //
else
{//第5个液滴落下时,计时停止
TR0=0;
if(TF0==1)
{//外部中断0过程中,定时器0有溢出
tt0++;
TF0=0;
}
}
}
void main()
{ unsigned long dropstime;
//这里加上外部中断0,定时器中断0的初始化程序
TR0=0;
drops=0;
while(1)
{
if(drops==6)
{ dropstime=tt0*256*256+TH0*256+TL0;//5次液滴的时间,单位为uS
//请自己在这里加上时间