【原创】AT89S52 DIY 频率计 Version2.0
caoyuan96422010/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 优秀
来自:电子信息 / 电子技术
7
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
ry7740kptv
14年5个月前 IP:未同步
260248
个人觉得你在信号输入前加箝位二极管保护和施密特触发器整波形,效果会更好!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
14年5个月前 IP:未同步
260275
输入端的信号处理比较重要,但lz没做~
说实话频率计的软件估计没几个人做不了,但能搞定硬件的相对来说就不多了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AsyncMaster
14年4个月前 IP:未同步
261279
加一片74HC393可以测到几十M.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cjboy2008
14年1个月前 IP:未同步
277688
如果用外部的电路(晶振)产生1Hz的时钟呢?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
twelveboy
12年6个月前 IP:未同步
443946
哪位高人把前端输入电路设计一下啊!
听说输入端需要施密特触发电路及限幅电路吧
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
大道至简
12年3个月前 IP:未同步
469884
“理论上的精度是很高的(限于频率不低于10Hz时,不高于晶振频率一半(即11.0582MHz)时)”
楼主,这个难道不用考虑12分频吗?有实物测试吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
caoyuan9642
学者 笔友
文章
49
回复
810
学术分
4
2009/05/06注册,8年7个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}