单片机频率计

作者&投稿:赧送 (若有异议请与网页底部的电邮联系)
基于51单片机的数字频率计(0—10MHZ)~


再加两个数码管,用 T1 引脚检测频率,打开T1中断,每中断一次 加1计数,
满1秒中后停止T1计数,读出T1计数器的 TH1 TL1,
频率 = 65536 x 中断次数 + TH1 HL1 。
前提是 选择高速单片机,即只要 T1 引脚 能够响应 10M 的频率就没有问题
因为 要 计数 65536 次才 T1才会中断一次。

很明显啊,在测量小于1Hz频率时,测量时间必须大于1s,比如10s,20s或者更长时间,这样才能保证测量准确。

既然你一次定时0.5s不能变,那就有程序控制累加多个0.5s的测量结果再计算频率值。

所以程序中使用自适应方法,首先测量一个0.5s,看得到的频率值是否大于1,如果大于1即直接测量,如果频率值为0,表示被测频率小于1Hz,就转入长时间测量的模式。

1.实验任务

  利用51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。

2.电路原理图

    见插图

3.程序设计内容

(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。

(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。

4.C语言源程序

/******************************************************************************

*                      定时器+计数器测频

*

* file: frequency.c

* name: zhzhchang     

* time: 2010.3.17

* V 1.0

* blog:http://blog.csdn.net/zhzht19861011

* Nots: 本程序定义6个数码管,经过实测,在200HZ~50KHZ时结果较准确,误差小于0.4%,

*       50KHZ以上频率未进行测量.据资料表明,可以测量到120KHZ,本程序未证明.

*********************************************************************************/

#include<reg52.h>

 

bit int_flag; //定时器0 1S到标志位

unsigned char volatile int_count;   //定时器0中断次数

unsigned char volatile T1count;    //定时器1中断次数

unsigned char code dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0123456789

unsigned long sum;    //1S内脉冲总个数

unsigned char led[6];   //LED显示缓存

 

///////////////软件延时/////////////

void delay(unsigned int cnt) 

{

 while(--cnt);

}

///定时器0初始化

void init_t0(void)

{

 TMOD=(TMOD&0xF0)||0x01;   //定时器0工作于方式1

 TH0=(65536-50000)/256;   //定时50ms

 TL0=(65535-50000)%256;

}

// 定时器1初始化

void init_t1(void)

{

 TMOD=(TMOD&0x0F)|0x50;   //timer 1 for count

 TH1 =0x00;

 TL1 =0x00;

}

//显示

void disp(void)

{

 unsigned char i;

 for(i=0;i<6;i++)

 {

  P0=dofly[(led[i])];//取显示数据

     P2=5-i;  //取段码

     delay(100); //扫描间隙延时,根据单片机调整,延时1ms即可

 }

}

///////////////////////////////////////////////////////

void main (void)

{

 EA=1;      //开总中断

 init_t0();    //初始化定时器

 init_t1();   

 TR0=1;     //定时器开始工作

 TR1=1;

 ET0=1;   //开T0中断

   

 while(1)

{

 if(int_flag==1)

 {

  int_flag=0;

  sum=TL1+TH1*256+T1count*65536;   //计算1秒内的脉冲个数

  //以下将数据格式化,转成LED可显示的BCD码

  led[0]=sum%10; //最低位

  sum=sum/10;

  led[1]=sum%10; //第二位

  sum=sum/10;

  led[2]=sum%10;

  sum=sum/10;

  led[3]=sum%10;

  sum=sum/10;

  led[4]=sum%10;

  led[5]=sum/10;

  int_count=0x00;

  T1count=0;

  TH1=0x00;

  TL1=0x00;

  TR1=1;

 }

 disp();

}

}

//定时器0中断服务程序

void int_t0(void) interrupt 1

{

 TH0=(65535-50000)/256;

 TL0=(65535-50000)%256;

 int_count++;

 if(int_count==20)

 {

  TR1=0;

  int_flag=1;

  int_count=0x00;

 }

}

//定时器1中断服务程序

void int_t1(void) interrupt 3 

  T1count++; 

}   

别说你的设计要求用汇编啊!!!

不过既然是课程设计,我这个只是给你参考,你自己一定要弄懂,变成自己的。我实测过,程序没问题,但用到你的硬件上可能需要改一下,因为你的硬件数码管不一定和我的硬件接法一样,但整体思路我都给你了。



...碰到了点问题,论文题目是基于51单片机的数字频率计设计
答:输入引脚是P3.4 如果用定时器1作为计数器,输入引脚是P3.5 如果测单个脉冲宽度(或周期),可以输入任意引脚,但最好用中断引脚P3.2或P3.3 3。.信号进入引脚之后怎么计算它的程序 用另外一个定时器定时50ms,测50ms内有多少个脉冲输入,然后乘以20(即1S)即是频率 ...

单片机频率计原理程序代码
答://***信号频率测量模块***// float frequency(float freq){ initial();TR0=1;TR1=1;if(timecount==250){ TR0=0;freq=T0count*65536+TH0*256+TL0;return(freq);} } //***// //***信号周期测量模块***// float cycle(float count){ initial();if(P3_4==1){ TR0=1;TR1=1;...

求51单片机设计数字频率计,附带Proteus仿真和程序
答:刚刚下了一楼传的附件,测试后发现精度和测量范围都比较差。如果单从测频的角度来说,51的频率计是很简单的。恰好几年前我写过类似的程序,是用来测频率和占空比的。理论上单用C52这单片机测频率最高为:12M/12/2=500KHZ。我写的这个程序可以同时测频率和脉宽,仿真下大概可以测到350KHZ;测脉宽...

51单片机设计频率计,T0作定时器,T1作计数器,为什么测量时是单片机P3.4...
答:主要看你T0\T1的工作方式,因T0有方式0、方式1、方式2和方式3四钟工作方式,而T1只有0-2三种方式。一般都使用T0计数,T1定时配合使用进行频率的测定与显示。

有没有人用51单片机T2定时器做过频率计的?求完整程序,最好有proteus仿真...
答:TL2EQU0CCH ; T2 计数寄存器低字节 TH2EQU0CDH ; T2 计数寄存器高字节 TR2EQU0C8H.2 ; T2 启动位 RCAP2LEQU 0CAH ; T2 计数重栽陷阱寄存器低字节 RCAP2HEQU0CBH ; T2 计数重栽陷阱寄存器高字节 TF2EQU0C8H.7 ; 定时计数器2计满回零溢出中断请求标志位 ORG 0000H LJMP MAIN OR...

...很准,测量频率变大后误差加大,是因为单片机频率引起的吗?_百度知 ...
答:单片机速度有限,对高频输入,反应不及时,就会有误差。如果程序编写的很滥,就在会不很高的频率时,误差就出现了。

设计数字频率计
答:一、基本原理使用555产生矩形波信号,输入到单片机进行测量频率。测频的方案有多种:1、测周法:通过测量被测信号的周期的倒数得到频率,选用适当的时基,以被测信号作为计数的闸门进行测量,得到闸门内的计数值,与时基相乘即为被测信号的周期,周期的倒数即为频率。该法适合测量频率低的信号。2、测频...

单片机开题报告范文
答:随着单片机由于其较小的体积和很高的性价比,而在各种电子产品中受到广泛的应用和发展,单片机的研发人员也在不断的进行技术上的革新。下面是我为大家整理的单片机开题报告范文,欢迎阅读。 单片机开题报告范文篇1: 基于单片机数字频率计设计开题报告 一、选题的依据及意义: 本课题主要研究如何用单片机来设计数字频率计。因...

求文字解释说明下面这段代码,单片机宽带频率计相关的
答:}}//***///***信号频率测量模块***//float frequency(float freq){initial(); //初始化定时器TR0=1;TR1=1; //开启两个定时器if(timecount==250){ //如果计数变量等于250执行以下程序TR0=0; //关闭定时器0freq=T0count*65536+TH0*256+TL0; //计算计数个数赋值给freqreturn(freq...

单片机的ALE信号为什么没有频率?下面是我接的单片机的最小系统,我用...
答:和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20 ~ 40pF 之间选择(本实验套件使用30pF);当采用陶瓷谐振器件时,电容要适当地增大一些,在30 ~ 50pF 之间。通常选取33pF 的陶瓷电容就可以了。另外值得一提的是如果读者自己在设计单片机系统...