单片机 频率计,

#include<reg52.h>
sbit input=P3^2;//频率输入口;
sbit dula=P2^7;
sbit wela=P2^6;
unsigned int num,num1,t;
unsigned char code table[]={
0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,
0x6f,0x77,0x7c,
0x39,0x5e,0x79,
0x71};
void init();
void display(unsigned int num);
void delayms(unsigned int x);
main()
{ init();

while(1)
{
while(input==0);
while(input==1);
TR0=1;
while(input==0);
while(input==1);
TR0=0;
num=500000/(TH0*256+TL0); //???????????
display(num);

TH0=0;
TL0=0;
}

}

void init()
{
TMOD=0x09;
TH0=0;
TL0=0;
EA=1;
ET0=1;
TR0=0;

}

void display(unsigned int num)
{

wela=1;
P0=0xfe;
wela=0;
delayms(5);
P0=0xff;
dula=1;
P0=table[num/100];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
P0=0xff;
dula=1;
P0=table[(num%100)/10];
dula=0;
delayms(5);
P0=0xff;

wela=1;
P0=0xfb;
wela=0;
delayms(5);
P0=0xff;
dula=1;
P0=table[num%10];
dula=0;
delayms(5);
P0=0xff;
}

void delayms(unsigned int x)
{
unsigned char j;
while(x--)
{
for(j=1;j<123;j++);
}
}

以上num=500000/(TH0*256+TL0)是怎样算出来的,为什么我算出来的是10000000而不是500000
我不小心多加了个0,是1000000,单片机频率为12M,
当12M时,单片机工作正常,当6M时,频率计比实际值大一倍。
你看,定时器,每计一次数为1个机器周期,也就是12个振荡周期,当单片机为12M时,计一次数的时间是12/12M=0.000001,是这样的吧,计N次数所用时间就是0.000001*N,没错吧,其倒数就是输入频率,此时就变成1000000/N; 这里的N就是(TH0*256+TLO);所以此时num=1000000/(TH0*256+TLO);但仿真却不对,只有当num=500000/(TH0*256+TL0)时,频率计才正确读数。为什么;

待测频率f=1/T,T=(TH0*256+TL0)*(1/F),其中F为CPU的主频。
那么有 f=1/T=F/(TH0*256+TL0).该式子和500000/(TH0*256+TL0)比较发现,它的500000和你的10000000就是CPU主频F。通过直接计算可得:它的晶振频率是500000*12=6M,你的晶振是10000000*12=120M。由此可见,问题出在你的计算上,我还真没见过哪个51的晶振选用120M的呢,忒高了吧!呵呵。
如飞龙电子说的:仔细分析一下TMOD吧,你把TMOD的GATE置位了。 一旦外部中断引脚INT0信号有效,Time0就会提前开始计时,导致测量频率偏低。而你在计算频率的时候,将10000000降低为500000,恰好也将频率降低了。这样阴差阳错,测出来的结果刚好对上了。不过前提是你输入的是方波,刚好有一个2倍的关系,你要是换一个其它占空比的波形,测量结果还能对上就怪了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-09-12
你仔细分析 TMOD 每一位的作用,你会发现原因的
第2个回答  2009-09-12
你的10000000,是怎样算出来的?
-----------------------------
以你现在的电路和程序,计数值(TH0*256+TL0)只是被测信号的脉冲宽度,而不是周期。
如果在外部加上一个D触发器,构成二分频电路,即可在P3.2为高电平时,测得信号的周期。
在使用12MHz晶振时,计算公式如下:
num = 1 000 000 /(TH0*256+TL0);
在使用6MHz晶振时,计算公式如下:
num = 500 000 /(TH0*256+TL0);

单片机的数字频率测试仪量程最大是多少?
你好!我用51单片机做的频率计,采用12M晶振,最高可以测到 10M

单片机 频率计,
待测频率f=1\/T,T=(TH0*256+TL0)*(1\/F),其中F为CPU的主频。那么有 f=1\/T=F\/(TH0*256+TL0).该式子和500000\/(TH0*256+TL0)比较发现,它的500000和你的10000000就是CPU主频F。通过直接计算可得:它的晶振频率是500000*12=6M,你的晶振是10000000*12=120M。由此可见,问题出在你的计...

51单片机的数字频率计
所以,t0的值表示触发了几次中断,也就表示接受到的脉冲几次从0到65536。所以会有t0*65536。 另外,由于计时的机制是THO++、TL0++,所以,THOTL0就表示当前的计数值。THOTLO- 初值就可以确定没有触发中断定时多少。TH0*256==TH0*2^8,实质就是左移8位,就是拼接TH0跟TL0的处理。所以频率的核心...

51单片机的简易频率计设计
单片机直接用USB连电脑只能取电不能通讯,通讯的话 需要接口电路,例如USB转TTL的芯片,CH340,PL2303,这样的芯片才可以,如果直接测TTL电平的话 确实不需要其他外围电路了,因为51的信号就是TLL电平的。

基于单片机的频率计,C语言完成。测量方波信号,T0计数,T1计时,记够1秒...
(1).定时\/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC\/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时...

利用51单片机设置简易频率计显示很慢的原因
带不动。传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行较慢,而且测量频率的范围较小。利用51单片机设置简易频率计显示很慢的原因是51单片机系统资源不足带不动,不可控的外部中断频繁触发使得程序无法按正常的逻辑执行。

单片机频率计如何计算更精确?
100ms,测量一次,显示一次,显示数值跳动,是正常的。可以把四次的数值,取平均值,每隔400ms,显示一次;这样,跳动的现象就会明显减小。如果把八次的数值,取平均值,每隔800ms,显示一次;这时,显示的就会很稳定了,但是,也显得“迟钝”和“冷漠”多了。每隔400ms,显示一次平均值,效果最好。

基于单片机的等精度频率计设计需要什么材料
在设计单片机的精度频率要使用到的材料是PCB实验板,能更准确的控制频率的发生,因此是PCB实验板。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器随机存储器(RAM),只读存储器(ROM),多种IO口和中断系统、定时器或计数器等功能集成到一块硅片上构成的一个小而...

做用51单片机做一个频率计,测量范围为0.1Hz~10kHz
低频一般会采用测周期,高频用测频才能提高测量的准确性。至于高低频的临界点,跟你的计数频率有关,感兴趣的话可以去看《电子测量原理》。下面我来讲下测周实现的方法,可以使用边沿触发的D触发器输出作为单片机的外部定时控制,测量信号作为触发时钟,计数值作为该信号的周期。

单片机为什么无法实现等精度频率法
等精度频率测量方法消除了量化误差,可以在整个测试频段内保持高精度不变,其精度不会因被测信号频率的高低而发生变化。采用单片机作为控制核心的等精度频率计,可以充分利用单片机软件编程技术实现等精度测频。通过单片机对同步门的控制,使被测信号和标准信号在闸门时间内同步测量,为了提高精度,将电子计数...

相似回答