单片机频率计
再加两个数码管,用 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 的陶瓷电容就可以了。另外值得一提的是如果读者自己在设计单片机系统...