单片机/MCU论坛
直播中

jf_94851377

5年用户 54经验值
擅长:EDA/IC设计
私信 关注
[问答]

用单片机设计一个频率计

`用单片机设计频率计k1按下测高频(采用测频法),k2测低频(测周法),测频法可以但是有时误差很大,测周法不可以,电路图代码如下求指点
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar tab1[]={"The frequency:"};      //???????????????
uchar tab2[]={"        0.000khz"};
uchar tab3[]={"             0hz"};
/*********************lcd????????????**************************************/
***it RS=P2^7;
***it E=P2^6;
***it RW=P2^5;
/**************************??????????????????????**********************************************/
***it k1=P1^0;      //????????ò???
***it k2=P1^3;    //???????ò???
bit m_flag,t_flag,s_flag;
unsigned char m;  //???***????
unsigned long tcount; //??????????????????????
unsigned long Mcount; //?????T0????????
uint time_count,TMcount,freqt,freqm; //???????????????????
void delay(uchar ms); //???????
void init_timer1();        //?***?????
void init_timer2();
void lcdbegin();
void lcd_init_1();      //lcd?????
void lcd_init_2();
void lcd_wcom(uchar com); //lcdд????
void lcd_wdat(uchar dat); //lcdд????
void lcd_disp1(uchar address,ulong dat);
void lcd_disp2(uchar address,ulong dat);
void main()
{
lcdbegin();
while(1)
{
  if(k1==0) //?????
  {
   lcd_init_1();
   init_timer1();
   m_flag=1;
  }
  if(k2==0) //?????
  {
   lcd_init_2();
   t_flag=1;
   init_timer2();
  }
}
}
void delay(uchar ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=0;j<110;j++);
}
void init_timer1()
{
TMOD=0x15;   //?????1??????????0????
TH1=(65536-50000)/256; //???50ms
TL1=(65536-50000)%256;
TH0=0;
TL0=0;
TR0=1;      //????????????
TR1=1;      
ET0=1;
ET1=1;
EA=1;      //?????***?
}
void init_timer2()
{
TMOD=0x01;
TH0=(65536-65535)/256;   //???1us
TL0=(65536-65535)%256;
ET0=1;    //?????????***?????
EX0=1;    //???***?????
IT0=1;    //???***???????
EA=1;
}
void int0() interrupt 0
{
TR0=1;
m++;
if(m==2)
{
  TR0=0;
  EX0=0;
  TMcount=(unsigned int)(1000000/(tcount));
  freqt=TMcount;
  lcd_disp1(0x40,freqt);
  tcount=0;
  m=0;
}
}
void time0() interrupt 1
{
if(m_flag==1)
{
  Mcount++;
}
if(t_flag==1)
{
  TH0=(65536-65535)/256;
  TL0=(65536-65535)%256;
  tcount++;
}  
}
void time1() interrupt 3
{
if(m_flag==1)
{
  TH1=(65536-50000)/256;
  TL1=(65536-50000)%256;
  time_count++;
  if(time_count==20)
  {
   TR0=0;
   TR1=0;
   time_count=0;
   freqm=Mcount*65536+TH0*256+TL0;
   lcd_disp2(0x40,freqm);
   Mcount=0;
  }
}
}
void lcdbegin()
{
uchar i;
lcd_wcom(0x01);
lcd_wcom(0x38);
lcd_wcom(0x0C);
lcd_wcom(0x06);
lcd_wcom(0x80);
for(i=0;i<16;i++)
lcd_wdat(tab1);
}
void lcd_init_1()
{
uchar i;
lcdbegin();
lcd_wcom(0xC0);
for(i=0;i<16;i++)
lcd_wdat(tab2);
}
void lcd_init_2()
{
uchar i;
lcdbegin();
lcd_wcom(0xC0);
for(i=0;i<16;i++)
lcd_wdat(tab3);
}
void lcd_wcom(uchar com)
{
delay(5);
E=0;RS=0;RW=0;
E=1;
P0=com;
E=0;
}
void lcd_wdat(uchar dat)
{
delay(5);
E=0;RS=1;RW=0;
E=1;
P0=dat;
E=0;
}
void lcd_disp1(uchar address,ulong dat)
{
uint gw,bw,sw,qw;
if(t_flag==1)
{
qw=dat/1000;
bw=dat%1000/100;
sw=dat%1000%100/10;
gw=dat%1000%100%10;
lcd_wcom(0x80+address+0x0A);
if(qw!=0)
{
lcd_wdat(0x30+qw);
}
else
{
lcd_wdat(' ');
}
if(bw!=0)
{
lcd_wdat(0x30+bw);
}
else
{
lcd_wdat(' ');
}
if(sw!=0)
{
lcd_wdat(0x30+sw);
}
else
{
lcd_wdat(' ');
}
lcd_wdat(0x30+gw);
}
}
void lcd_disp2(uchar address,ulong dat)
{
uint gw,sw,bw,qw,ww,sww;
sww=dat/100000;
ww=dat%100000/10000;
qw=dat%100000%10000/1000;
bw=dat%100000%10000%1000/100;
sw=dat%100000%10000%1000%100/10;
gw=dat%100000%10000%1000%100%10;
lcd_wcom(0x80+address+0x06);
if(sww!=0)
{
lcd_wdat(0x30+sww);
}
else
{
lcd_wdat(' ');
}
if(ww!=0)
{
lcd_wdat(0x30+ww);
}
else
{
lcd_wdat(' ');
}
lcd_wdat(0x30+qw);
lcd_wdat('.');
lcd_wdat(0x30+bw);
lcd_wdat(0x30+sw);
lcd_wdat(0x30+gw);
}

`
频率计.zip (29.01 KB)
(下载次数: 97, 2020-3-17 17:22 上传)

回帖(3)

小猫猫要吃鱼

2020-3-17 18:27:37
你好!
1、你要测的最高频率是多少?
2、你现有程序,测量误差是多少?
3、测量的误差要求控制在多少范围内?
4、建议以后写程序的时候加上点注释
举报

王栋春

2020-3-17 21:49:34
楼主最好将程序当中的注释标记一下
举报

小猫猫要吃鱼

2020-3-18 14:06:30
以前完成的频率计,仿真和实物
频率计1.jpg

频率计.jpg
举报

更多回帖

×
20
完善资料,
赚取积分