设计一个51单片机的数字频率计,要求显示从1—1000HZ,并用7段显码显示

设计一个51单片机的数字频率计,要求显示从1—1000HZ,并用7段显码显示,第1张

曾做过这个题目,将资料整理了一下,放到了我的公共邮箱

邮件名是"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单片机频率计的中断程序怎么设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9296254.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存