既然是频率计, 那么只要记下两次中断的时间差就可以实现了.
因此, 只要定时器自由运行, 由 INT0 中断读取计时器的值, 再加上高位值(如 timer1 的溢出累计器),减去上次中断保存的计数器值, 通过这个时间计算频率, 理论上就不会有错.
当然还有一个中断嵌套问题, int 和 timer 中断同时出现的时候, 要判断一下(这也不难, 只是个注意点)
最后滤波运算, 主程序把 INT 中断里记录下的时间差, 进行滤波计算, 然后再变换成要显示的频率值.
;楼主程序的最大毛病在这里:
while(flag==1); //第二个下降沿关闭T0,T1
TR0=0; //终止Timer0
TR1=0;
flag=0;
pulse=(unsigned int)(TH1*256+TL1);
pulse=65536*T1count+pulse; //脉冲数
display_val2(pulse); //显示脉冲数
display_val1(count); //显示时间
T1count=0;
随便关闭定时器, 没有让它自由运行, 这就错过了(少计了)很多的时间, 导致统计计算出现大量误差.
|