unsigned long a=0;//保存16位定时器定时中断次数数据加上定时器停止时定时器高8位和低8位寄存器内剩余数值。
//因为每次开启定时器16位定时器寄存器清零,然后开始计数,这样中断一次数值都是65536。这样的数值累加是很大的所以用long型
/****************************************************************************************************/
void int1_isr(void) //这是外中断服务程序,就是测量这个IO口的信号频率。第一个脉冲来了之后开启定时器,第二个脉冲来了之后关
{ //闭定时器并计算定时器总共时间。
y^=1;
if(y){TCNT1H=0;TCNT1L=0;TCCR1B=0X01;}
else
{
TCCR1B=0X00;
a=a<<16; //计算中断次数: a=a*65536
a=a|((TCNT1H<<8)|TCNT1L); /////定时器计数值小于32768那么这里计算后的结果是正确的,超过32768就出问题结果是42亿多
jf=1000000/a; //周期的倒数,也就是数码管显示的频率。频率在31Hz以上测量都是准确的,在30Hz以下就出问题。
a=0;
}
}
void timer1_OVF_ISR(void)
{
a++; //每次中断这个a自加一次,就是16位定时器的值一直加到0xFFFF溢出后产生中断一次
}
测量频率在2Hz,3Hz也正确,10几赫兹的也有几个正确,问题就出在上面a的计算上,请教大师这是什么原因,怎么解决???