|
发表于 2008-2-28 14:42:56
|
显示全部楼层
首先,把测量和显示要分开考虑.
326页讲到被测最高频率为255KHZ,不是由于显示限制的,是测量方法限制的.T/C0为8位的计数器,门宽为1MS,所以当被测输入频率大于255K的时,1MS时间中的脉冲个数将超出255个,造成T/C0的溢出,这时频率测量就不准确了.
然后我们分析显示:
注意要显示的是变量freg中的数,freg为整数int型,最大为65535,所以只有5位,而且是100ms中的脉冲个数!
分析以下函数
void freq_to_disbuff(void) // 将频率值转化为BCD码并送入显示缓冲区
{
char i,j=7;
for (i=0;i<=4;i++)
{
dis_buff[j-i] = freq % 10;
freq = freq / 10;
}
dis_buff[2] = freq;
}
将freq转换成BCD码送入disbuff,只要转换5位可以了,而且个位在disbuff[7]中(3楼有误),最高位在disbuff[2]中,disbuff[1]和disbuff[0]永远为0(实际上,循环后面的dis_buff[2] = freq;是多余的一句了,它也是0)
然后看单位和小数点的位置.freg是100ms的脉冲个数,乘上10为Hz,除上1000为KHz.所以小数点点在disbuff[5]的位置,表示单位为KHz.(注意在显示扫描子程序中的if(posit == 5) PORTA = PORTA | 0X80).
实际上在这个例子中是不需要8位显示的,只要5位显示就够了,因为freg最大为65535.另外如果freg为65535的话,显示为655.35KHz,但实际上在测量中是不会出现的,因为测量方法决定了最高的测量频率为255K(1ms的T/C0最大为255,100ms的累加最大也就是25500!).因此你看到显示大于255K,那么程序中肯定有错误了!
至于如何改进该例子,提高测量频率的上限,在326页有提示.如果你真正理解透了,自己可以设计出更完善的频率计. |
|