曾做过这个题目,将资料整理了一下,放到了我的公共邮箱
邮件名是"51单片机频率计"
包括电路图和源程序在发帖之前验证过,没有问题!
可以测量的频率范围是0~65KHz
邮箱地址:protel2006@163com
密码是protel
已将你要的文件发到该邮箱~ 请不要删除,谢谢!
不知你测的是什么波形,为什么要除以2
若是方波,不用除以2
是交流电整流后半波变全波?是要除以2
若是STC的非1T 单片机,下载程序时 有6T和12T选项,若选6T,定时器定时时间就减小一半
实测频率就高了
STC有一个版本的下载软件有问题,6T应该是倍速,结果写成了12T是倍速
定时器1 1MS中断一次,5次是5ms,乘200就是1秒种,其初值由晶振频率决定,有计算软件
当然,也可以中断10次或20次,频率判断更准确,但响应速度慢了
1600或800方波接入定时器/计数器0的外部输入引脚上,好像是P34
程序如下:
void
init()//初始化设置
{
TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用
TH0=0;//计数器清0
TL0=0;
EA=1;//开总中断
ET1=1;//允许定时器1中断
TH1=;
TL1=;
TR0=1;//启动计数器
TR1=1;//启动定时器
aa=0;
}
void
main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb256+cc;//
5ms的计数值
ee=200dd;//换算为1秒钟的计数值
if((ee>750)&&(ee<850))
{
P35=0;
}
if((ee>1550)&&(ee<1650))
{
P35=1;
}
}
}
void
timer1()interrupt
3//注意:定时器1的中断序号为3
{
aa++;
TH1=;
TL1=;
if(aa==5)//中断5次,共5ms
{
TR0=0;//暂停计数
aa=0;
bb=TH0;//读出计数器数据
cc=TL0;
TL0=0;//计数器清0
TH0=0;
TR0=1;//重新启动计数器
}
}
很明显啊,在测量小于1Hz频率时,测量时间必须大于1s,比如10s,20s或者更长时间,这样才能保证测量准确。
既然你一次定时05s不能变,那就有程序控制累加多个05s的测量结果再计算频率值。
所以程序中使用自适应方法,首先测量一个05s,看得到的频率值是否大于1,如果大于1即直接测量,如果频率值为0,表示被测频率小于1Hz,就转入长时间测量的模式。
测频率时,频率高的时候,采用“定时计数法”。
楼上给出的“开启一个定时器,计算一定时间t内的count值”,就是这种方法。
但是,频率低的时候,这种方法是不适用的。
因为想要计几个数,就要花费很长的时间。
故此,频率低的时候,应该使用“测量周期法”,再换算成频率。
以上就是关于设计一个51单片机的数字频率计,要求显示从1—1000HZ,并用7段显码显示全部的内容,包括:设计一个51单片机的数字频率计,要求显示从1—1000HZ,并用7段显码显示、51单片机频率计,程序中时间按道理来说应该是只测了半个周期、51单片机频率计的中断程序怎么设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)