51单片机测频率的程序
5个回答
展开全部
测频率时,频率高的时候,采用“定时计数法”。
楼上给出的“开启一个定时器,计算一定时间t内的count值”,就是这种方法。
但是,频率低的时候,这种方法是不适用的。
因为想要计几个数,就要花费很长的时间。
故此,频率低的时候,应该使用“测量周期法”,再换算成频率。
楼上给出的“开启一个定时器,计算一定时间t内的count值”,就是这种方法。
但是,频率低的时候,这种方法是不适用的。
因为想要计几个数,就要花费很长的时间。
故此,频率低的时候,应该使用“测量周期法”,再换算成频率。
追问
怎么测量周期法,目前我用的是测量一个低电平还有一个高定平的时间,两个加起来,效果不错,要有更好的方法我就采纳你。楼上的我试过了,高频好使,低频不适合
追答
测量频率,一般的目的,是为了显示给人看。
一秒钟显示一次,是最简单的方法。
按照“定时计数”的方法,如果频率约为10Hz,一秒钟显示出来的就是9或10。
如果显示9,误差就是10%。
这样大的误差,一般是不允许的。
那么,一般,频率低于100Hz,就要改用“测量周期法”了。
“测量一个低电平还有一个高定平的时间,两个加起来,......”
就是这样,取其倒数,就是频率。
用下降沿控制单片机内部定时器的启动、停止,也可以得到周期。
展开全部
void timers() interrupt 0
{count++;
TR0=1;
}
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
每一个下降沿到达时conut自加1。开启一个定时器,计算一定时间t内的count值,主程序就好写了,再写一个H=count/t语句,H就是频率了。总体思路就是这样,细节你就自己来写吧。
{count++;
TR0=1;
}
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
每一个下降沿到达时conut自加1。开启一个定时器,计算一定时间t内的count值,主程序就好写了,再写一个H=count/t语句,H就是频率了。总体思路就是这样,细节你就自己来写吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2020-03-23
展开全部
#include "reg51.h"
#include "intrins.h"
unsigned char t0_hh,t1_hh;
unsigned char dis_buf[9];
unsigned char code frequence[]={"frequence:"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit LCM1602_E=P2^2;
sbit LCM1602_Busy=P0^7;
bit firstex,secondex;
unsigned long count0,count1;
unsigned long count;
unsigned char cnt;
unsigned char thh;
unsigned long f;
//延迟程序
void LCM1602_DELAY(unsigned short count)
{
unsigned char i;
while(count-->0)
{
for(i=0;i<125;i++);//370us
}
}
//写指令
void LCM1602_WRITECMD(unsigned char a)
{
P0=a;
RS=0;
RW=0;
LCM1602_E=0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E=1;
}
//写入数据
void LCM1602_WRITEDATA(unsigned char b)
{
P0=b;
RS=1;
RW=0;
LCM1602_E=0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E=1;
}
void LCM1602_TestBusy(void)
{
do{
P0 = 0xff;
RS = 0;
RW = 1;
LCM1602_E = 0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E = 1;
}while(LCM1602_Busy);
}
void LCM1602_init()
{
LCM1602_DELAY(500);
LCM1602_WRITECMD(0x38);
LCM1602_DELAY(150);
LCM1602_WRITECMD(0x38);
LCM1602_DELAY(10);
LCM1602_WRITECMD(0x38);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x01);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x38);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x0c);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x06);
LCM1602_TestBusy();
}
//低频数据处理
void deal_data()
{
unsigned char i;
float adata;
count1=t1_hh*65536+TH1*256+TL1;
count0=t0_hh*65536+TH0*256+TL0;
adata=(float)count1*100000000/count0;
count=(unsigned long)(adata+0.5);
for(i=7;i>0;i--)
{
dis_buf[i]=count%10;
count=count/10;
}
dis_buf[0]=count;
dis_buf[8]=dis_buf[7];
dis_buf[7]=dis_buf[6];
dis_buf[6]='.';
}
//低频液晶显示
void display()
{
unsigned char i,p;
LCM1602_WRITECMD(0x80);
LCM1602_DELAY(30);
for(p=0;p<10;p++)
{
LCM1602_WRITEDATA(frequence[p]);
LCM1602_DELAY(30);
}
LCM1602_WRITECMD(0xc0);
LCM1602_DELAY(30);
for(i=0;i<9;i++)
{
LCM1602_WRITEDATA(dis_buf[i]+0x30);
LCM1602_DELAY(30);
}
}
void main()
{
LCM1602_init();
//T0定时1S,10ms*100
TMOD=0x51;
TH0=(0-10000)/256
TL0=(0-10000)%256
ET0=1;
TR0=1;
TH1=0;
TL1=0;
ET1=0;
while(1)
{
if(fpro)
{
}
}
}
#include "intrins.h"
unsigned char t0_hh,t1_hh;
unsigned char dis_buf[9];
unsigned char code frequence[]={"frequence:"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit LCM1602_E=P2^2;
sbit LCM1602_Busy=P0^7;
bit firstex,secondex;
unsigned long count0,count1;
unsigned long count;
unsigned char cnt;
unsigned char thh;
unsigned long f;
//延迟程序
void LCM1602_DELAY(unsigned short count)
{
unsigned char i;
while(count-->0)
{
for(i=0;i<125;i++);//370us
}
}
//写指令
void LCM1602_WRITECMD(unsigned char a)
{
P0=a;
RS=0;
RW=0;
LCM1602_E=0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E=1;
}
//写入数据
void LCM1602_WRITEDATA(unsigned char b)
{
P0=b;
RS=1;
RW=0;
LCM1602_E=0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E=1;
}
void LCM1602_TestBusy(void)
{
do{
P0 = 0xff;
RS = 0;
RW = 1;
LCM1602_E = 0;
_nop_(); //LCM1602_TestBusy();
LCM1602_E = 1;
}while(LCM1602_Busy);
}
void LCM1602_init()
{
LCM1602_DELAY(500);
LCM1602_WRITECMD(0x38);
LCM1602_DELAY(150);
LCM1602_WRITECMD(0x38);
LCM1602_DELAY(10);
LCM1602_WRITECMD(0x38);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x01);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x38);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x0c);
LCM1602_TestBusy();
LCM1602_WRITECMD(0x06);
LCM1602_TestBusy();
}
//低频数据处理
void deal_data()
{
unsigned char i;
float adata;
count1=t1_hh*65536+TH1*256+TL1;
count0=t0_hh*65536+TH0*256+TL0;
adata=(float)count1*100000000/count0;
count=(unsigned long)(adata+0.5);
for(i=7;i>0;i--)
{
dis_buf[i]=count%10;
count=count/10;
}
dis_buf[0]=count;
dis_buf[8]=dis_buf[7];
dis_buf[7]=dis_buf[6];
dis_buf[6]='.';
}
//低频液晶显示
void display()
{
unsigned char i,p;
LCM1602_WRITECMD(0x80);
LCM1602_DELAY(30);
for(p=0;p<10;p++)
{
LCM1602_WRITEDATA(frequence[p]);
LCM1602_DELAY(30);
}
LCM1602_WRITECMD(0xc0);
LCM1602_DELAY(30);
for(i=0;i<9;i++)
{
LCM1602_WRITEDATA(dis_buf[i]+0x30);
LCM1602_DELAY(30);
}
}
void main()
{
LCM1602_init();
//T0定时1S,10ms*100
TMOD=0x51;
TH0=(0-10000)/256
TL0=(0-10000)%256
ET0=1;
TR0=1;
TH1=0;
TL1=0;
ET1=0;
while(1)
{
if(fpro)
{
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我来帮你啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
oo,我舍友就是专门研究单片机的,下来我给你问一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询