为什么有人说只能记到65532,但又有人说可以测500Khz以内?
可参考
STC89C52芯片使用的是12MHz的晶振,根据其内部定时器的计算方法,STC89C52最大能够计数的频率为Fosc/12,即1MHz。因此,如果以晶振频率为基准来计算,STC89C52只能直接测量最高200KHz的信号频率。
另外,STC89C52定时器的计数范围为0~65535,也就是说,最大只能记到65535。如果使用定时器计算频率,需要将计数器值除以时间,得到的是一个16位无符号整数。所有,在使用 STC89C52 测量频率时,需要特别注意测量频率的范围和精度。
500K当然没问题,用计数器模式输入即可,12M/12/2,500K妥妥的没问题,频率高一些还可以更高。
用最新的STC51,在30M主频下,输入10M都可以
一个定时器当计数器用,另一个定时器来计时,计算一定时间内的脉冲数量,即可测得频率。
用心解答,如有帮助,恭请采纳。
答:首先,STC89C52的计数器/定时器,有16位计数器/定时器,其计数范围为0到65535,可记到65532。
其次,STC89C52通常使用12MHz的内部时钟。它的最大定时器计数器值是12MHz/12=1M,即1,000,000。计数器/定时器的范围是0到1,000,000。也就是说在一个200kHz的信号中,每秒钟会产生200,000个时钟周期,这意味着在1M的计数器值下,只能测量小于1M/200k=50个时钟周期的信号。而且,计数器的计数速率与信号的频率有关。如果信号的频率太高,计数器可能无法准确测量信号的频率。
因此,对于一个500kHz的信号,每秒钟会产生500,000个时钟周期。这意味着在使用STC89C52的计数器/定时器进行测频时,只能测量小于1M/500k=2个时钟周期的信号。
如果直接使用STC89C52的计数器/定时器测量500kHz的信号频率是不可行的,但不是说不能做,强行使用STC89C52测量500kHz的信号,计数器可能会丢失一些时钟周期,从而导致测量结果不准确。最好是使用更高频率的时钟源或外部计数器电路来提高测量精度。
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
这个问题涉及到计算机系统中的两个概念,即内存和频率。
需要注意的是,这两个概念是不同的,一个涉及到内存容量,而另一个涉及到信号测量的频率范围。它们之间没有直接的联系或依赖关系。
因此,两种说法所指的内容不同,一个是关于内存容量的限制,而另一个是关于频率测量的能力。
当然可以啊,你只要缩小测量时段,保证计数不溢出(或者在溢出之前处理完)就ok了呀,最不济的加上分频器,一点问题都没有
基于单片机(STC89C52)的数字频率计,是能够对0-250KHZ的信号频率进行准确计数
//Written by RYQ
#include <AT89X52.H>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//数码管显示字符转换表
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void main(void)
{
unsigned char i;
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-8690)/256;
TL1=(65536-8690)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
if(flag==1)
{
flag=0;
x=T0count*65536+TH0*256+TL0;
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(x/10)
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];
}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void t0(void) interrupt 1 using 0 // 中断号1,T0---定时器/计数器0中断 using 0 调用同一组寄存器,共有四组,范围为0~3
{
T0count++;
}
void t1(void) interrupt 3 using 0 // 中断号3,T1----定时器/计数器1中断 using 0 调用同一组寄存器,共有四组,范围为0~3
{
TH1=(65536-8690)/256; //65536-8690 是计数器的初值,也就是定时器走8690次(1次为1us),到达65536会产生一个中断,定时器的计时时间为8690 us
TL1=(65536-8690)%256;
timecount++;
if(timecount==115) //定时11.5次
{
TR0=0;
timecount=0;
flag=1;
}
switch(dispcount)
{
case 0:P2 = 0xfe; dispcount++; P0=dispcode[dispbuf[0]];break;
case 1:P2 = 0xfd; dispcount++; P0=dispcode[dispbuf[1]];break;
case 2:P2 = 0xfb; dispcount++; P0=dispcode[dispbuf[2]];break;
case 3:P2 = 0xf7; dispcount++; P0=dispcode[dispbuf[3]];break;
case 4:P2 = 0xef; dispcount++; P0=dispcode[dispbuf[4]];break;
case 5:P2 = 0xdf; dispcount=0; P0=dispcode[dispbuf[5]];break;
}
if(dispcount==8)
{
dispcount=0;
}
}
可以的哇。STC89C52利用51单片机的T0、T1的定时计数器功能,能够对0-250KHZ的信号频率进行准确计数。所以你的200KH属于这个范围,完全没有问题的
理论上能够测量高达6MHz的频率。但是,其最大计数器值为65535,因此不能直接处理200KHz以上的频率。但是可以通过添加外部电路的支持来缓冲和转换输入信号来实现高频率的测量