文号
t28924
阅读
7644
回复
7
收藏
11
【原创】AT89S52 DIY 频率计 Version2.0
2010/08/28
IP:安徽
今天由于看了gzh007的“关于电感表的自制”

启发我去继续学习单片机技术

然后我学会了T0、T1计数器的计数使用方式

正好。。用在频率计上面

电路图如下,改进了,简单了,

驱动4个数码管的电路不变,

只是计数功能改编了

LCMeter1.jpg

左边的3个灯是显示频率的单位的(Hz、kHz、MHz)

用的晶振频率22.1184MHz
LCMeter2.jpg

信号频率(方波)
LCMeter3.bmp

效果图:
仿真(Proteus)
LCMETER3.jpg
理论上的精度是很高的(限于频率不低于10Hz时,不高于晶振频率一半(即11.0582MHz)时)

对于有人不相信10M可以测出来的。。
LCMeter4.jpg
就是这时候电脑爆卡(没办法,频率太高了)

程序还是公开:
#include<AT89X52.h>
#define CLK P2_0
#define DISP P2_1
#define Hz P1_0
#define kHz P1_1
#define MHz P1_2
#define uchar unsigned char
long pn=0;
long freq;
uchar t=0;
uchar th,tl;
int put(uchar p){
  CLK=0;DISP=p;CLK=1;
}
void show(uchar a,uchar pos){
  put(pos);
  if((a==2)||(a==3)||(a==4)||(a==5)||(a==6)||(a==8)||(a==9))put(1);else put(0);
  if((a==4)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
  if((a==2)||(a==6)||(a==8)||(a==0))put(1);else put(0);
  if((a==2)||(a==3)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
  if((a==1)||(a==3)||(a==4)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
  if((a==1)||(a==2)||(a==3)||(a==4)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
  if((a==2)||(a==3)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);    
  } //倒序,低位在前
void display(long f){
  if(f<10){show(0,0);show(0,0);show(0,0);show(f,1);Hz=1;kHz=0;MHz=0;}
  else if(f<100){show(0,0);show(0,0);show(f%10,1);show(f/10,0);Hz=1;kHz=0;MHz=0;}
  else if(f<1000){show(0,0);show(f%10,1);show(f%100/10,0);show(f/100,0);Hz=1;kHz=0;MHz=0;}
  else if(f<10000){show(f%10,0);show(f%100/10,0);show(f%1000/100,0);show(f/1000,1);Hz=0;kHz=1;MHz=0;}
  else if(f<100000){show(f%100/10,0);show(f%1000/100,0);show(f%10000/1000,1);show(f/10000,0);Hz=0;kHz=1;MHz=0;}
  else if(f<1000000){show(f%1000/100,0);show(f%10000/1000,1);show(f%100000/10000,0);show(f/100000,0);Hz=0;kHz=1;MHz=0;}
  else if(f<10000000){show(f%10000/1000,0);show(f%100000/10000,0);show(f%1000000/100000,0);show(f/1000000,1);Hz=0;kHz=0;MHz=1;}
}
void main(){
  TMOD=0x05;
  TR0=1;
  ET0=1;
  TR2=1;
  RCAP2H=0x10;RCAP2L=0x00;
  ET2=1;
  EA=1;
  while(1){
  }
}
timer0() interrupt 1{
  pn+=65536;
}
timer2() interrupt 5{
  TF2=0;
  t++;
  if(t==30){
    th=TH0;tl=TL0;
    TH0=0;TL0=0;
    pn+=th*256;
    pn+=tl;
    freq=pn;
    display(freq);
    pn=0;
t=0;
  }
}

比以前那个短多了。。功能也还不错的
+200
科创币
joyeep
2010/08/28
优秀
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的