unsigned long a=0;//保存16位定時器定時中斷次數(shù)數(shù)據(jù)加上定時器停止時定時器高8位和低8位寄存器內(nèi)剩余數(shù)值。
//因為每次開啟定時器16位定時器寄存器清零,然后開始計數(shù),這樣中斷一次數(shù)值都是65536。這樣的數(shù)值累加是很大的所以用long型
/****************************************************************************************************/
void int1_isr(void) //這是外中斷服務程序,就是測量這個IO口的信號頻率。第一個脈沖來了之后開啟定時器,第二個脈沖來了之后關
{ //閉定時器并計算定時器總共時間。
y^=1;
if(y){TCNT1H=0;TCNT1L=0;TCCR1B=0X01;}
else
{
TCCR1B=0X00;
a=a<<16; //計算中斷次數(shù): a=a*65536
a=a|((TCNT1H<<8)|TCNT1L); /////定時器計數(shù)值小于32768那么這里計算后的結果是正確的,超過32768就出問題結果是42億多
jf=1000000/a; //周期的倒數(shù),也就是數(shù)碼管顯示的頻率。頻率在31Hz以上測量都是準確的,在30Hz以下就出問題。
a=0;
}
}
void timer1_OVF_ISR(void)
{
a++; //每次中斷這個a自加一次,就是16位定時器的值一直加到0xFFFF溢出后產(chǎn)生中斷一次
}
測量頻率在2Hz,3Hz也正確,10幾赫茲的也有幾個正確,問題就出在上面a的計算上,請教大師這是什么原因,怎么解決???