基于51单片机的频率计设计
软件设计原理:利用单片机内部资源,定时器0定时一秒,计数器1在1s内计数,从而计算得频率。
这样能测得1hz~450khz。
我想设定当频率小于10hz时,定时器0定时10s,计数器1在10s内计数,结果测得的数据除以10就得到频率,从而获得0.1hz~10hz更精确的频率。
现在代码测试的情况是:被测频率大于10hz没有问题,如果被测频率小于10hz,结果显示为10倍的频率,意思就是程序中没有除以10,怎么改都有问题,应该是跳过那几条备注的语句了,不知道问题出在哪,求大神解答。(问题部分用*标注)
void main()
{
CT_init();
LCD_init();
while(1)
{
/gbo();
if(num==numm)//如果1s到了,就计算出区间的脉冲数目,算出频率b
{
num=0;
b=((TH1*256+TL1)*1.0043);
if(b<10)//如果频率小于10hz,闸门时间变为10s,以便测量低频更准确********************************************************************
{
numm=200;
// LCD_Write_String(0,1,table2);
b=((TH1*256+TL1)*1.0043)/10;//为什么这条语句不执行??/**********************************************************************/
display();//为什么这条语句也不执行???/**********************************************************************************/
TH1=0;
TL1=0;
TR1=1;
TR0=1;
}
else//如果频率大于10hz,则正常1s定时计数
{
display();
TH1=0;
TL1=0;
TR1=1;
TR0=1;
}
}
}
}
我说说我的看法,好久没有写51了,仅仅是提个意见,你试试
1,可以再if(b<10)的语句里调用液晶显示函数,确定能够进入这个判断语句里面
2,用示波器确定输入的信号的频率确实是0.1hz~10hz
3,可以再if里面加个while循环
if(b<10)//如果频率小于10hz,闸门时间变为10s,以便测量低频更准确********************************************************************
{
num=0;
numm=200;
TH1=0;
TL1=0;
TR1=1;
TR0=1;
//重新计数
while(1){
if(num == numm){
// LCD_Write_String(0,1,table2);
b=((TH1*256+TL1)*1.0043)/10;//为什么这条语句不执行??
display();//为什么这条语句也不执行???
break;
}
}
}
可以先试试第三种方法,
假设6HZ,第一次会进入b<10那部分代码,闸门时间变为10s,但是到达10S后,当时的B=60,就不会在进入B<10了,也就不会除以10