【原创】AT89S52 DIY 频率计
caoyuan96422010/08/25电子技术 IP:安徽
最近刚刚学会单片机技术(简单的)

然后学会了用定时器

于是设计电路编程序

仿真

用的是AT89S52

然后串行驱动4联的74HC164

控制数码管显示

计数使用的是6级4520四位二进制计数器

最高可以计数到16MHz

4520输出用74HC165并转串进到P0中读取信息

然后在单片机内部,

用T2定时器控制1s计时

用脉冲数来确定频率


请无视那里的几个开关和一些无关的东西。。

上图:
FG2.bmp
FG1.jpg
FG2.jpg
程序:
#include<AT89X52.h>
#define CLK P2_1
#define DISP P2_0
#define uint unsigned int
#define uchar unsigned char
#define ICLK P3_0
#define ISW P3_1  
#define IIN P3_2
#define VCLK P3_3
#define VSW P3_4
#define VIN P3_5
#define FOREVER for(;;)
#define delay(x) for(a=1;a<=(x);a++);
#define FBSW P1_0
#define FBCLK P1_1
#define CTR P1_2
#define FBIN P1_3
#define PRS_LED P3_7
int bitsss(int a,int b){
  return (a & (1<<b))>>b;
}
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 Iadj(int a){
  ISW=0;
  ICLK=0;IIN=bitsss(a,9);ICLK=1;
  ICLK=0;IIN=bitsss(a,8);ICLK=1;
  ICLK=0;IIN=bitsss(a,7);ICLK=1;
  ICLK=0;IIN=bitsss(a,6);ICLK=1;
  ICLK=0;IIN=bitsss(a,5);ICLK=1;
  ICLK=0;IIN=bitsss(a,4);ICLK=1;
  ICLK=0;IIN=bitsss(a,3);ICLK=1;
  ICLK=0;IIN=bitsss(a,2);ICLK=1;
  ICLK=0;IIN=bitsss(a,1);ICLK=1;
  ICLK=0;IIN=bitsss(a,0);ICLK=1;
  ISW=1;
}
void Vadj(int a){
  VSW=0;
  VCLK=0;VIN=bitsss(a,9);VCLK=1;
  VCLK=0;VIN=bitsss(a,8);VCLK=1;
  VCLK=0;VIN=bitsss(a,7);VCLK=1;
  VCLK=0;VIN=bitsss(a,6);VCLK=1;
  VCLK=0;VIN=bitsss(a,5);VCLK=1;
  VCLK=0;VIN=bitsss(a,4);VCLK=1;
  VCLK=0;VIN=bitsss(a,3);VCLK=1;
  VCLK=0;VIN=bitsss(a,2);VCLK=1;
  VCLK=0;VIN=bitsss(a,1);VCLK=1;
  VCLK=0;VIN=bitsss(a,0);VCLK=1;
  VSW=1;
}
int t,t0,t1;
uchar keeping;
long freq;
int main(){
  int a=5,i;
  P0=P1=P2=P3=0;
  CLK=0;
  ISW=1;IIN=0;ICLK=0;
  RCAP2H=0x10;
  RCAP2L=0x00;
  TMOD=1;
  TR2=1;
  ET2=1;
  EA=1;
  for(i=0;i<=1023;i++){
    Iadj(i);
for(a=1;a<=1000;a++);
  }
  while(1){
    if(P0_0==1){
     TR0=1;
  ET0=1;
  //inc(freq);
  //set(freq);
  keeping=0;t0=1;
  while((P0_0)){};
  TR0=0;
  ET0=0;
}
  }
  FOREVER;
  return 0;
}
timer2() interrupt 5
{
  long extf=0;
  char a,i;
  TF2=0;
  t++;
  if(t==30)
  {
    FBSW=0;FBSW=1;
for(i=23;i>=0;i--){
   FBCLK=1;a=FBIN;extf+=(1<<(i-1))*a;FBCLK=0;
}
CTR=1;CTR=0;
    t=0;
show(extf%10,0);
show(extf%100/10,0);
show(extf%1000/100,0);
show(extf/1000,0);
  }
}
timer0() interrupt 1
{
  if(!keeping){
   TH0=0x10;  
  TL0=0x00;
   t0++;
   if(t0==15){
   keeping=1;
TH0=0;
TL0=0;
  }
  }
  else{
    TH0=0x00;
TL0=0x00;
  }
}
+600  科创币    warmonkey    2010/08/25
来自:电子信息 / 电子技术
8
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
小特斯拉圈圈
13年10个月前 IP:未同步
252951
这电路对我来说太复杂了..还以为单片机+1602就可以做。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
thallium2012
13年10个月前 IP:未同步
252977
即将学习单片机,赞一个,期待你有更新的作品
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
13年10个月前 IP:未同步
253012
做出实物+600
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
13年10个月前 IP:未同步
253019
引用第1楼小特斯拉圈圈于2010-08-25 19:09发表的  :
这电路对我来说太复杂了..还以为单片机+1602就可以做。。


可以的,改下显示驱动ok
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vocal@ルカ
13年10个月前 IP:未同步
253076
即将学习单片机,赞一个,期待你有更新的作品————测速器(电物爱S你)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
caoyuan9642作者
13年10个月前 IP:未同步
253249
还有几天就开学了。。实物估计是来不及了
等到寒假再做吧
效果图如下:

我觉得我没有更简单的方法来实现了。。。

如果用单片机来直接计数的话我怕误差太大 FG4.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
caoyuan9642作者
13年10个月前 IP:未同步
253250
还有暂时我还没有掌握LCD的驱动方法。。
而且LCD的程序也复杂
不如用数码管就搞定了
再上效果图:
FG4.jpg
频率测定还是比较准的。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
所属分类
上级专业
同级专业
caoyuan9642
学者 笔友
文章
49
回复
810
学术分
4
2009/05/06注册,7年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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