【开源】基于51的无外围中频频率计。。
任某人2012/08/23电子技术 IP:北京
上午折腾了一个小频率计。。无外围分频什么的。非常准。一开始没想做频率计的。。而是想做一个电感表……不过都涉及频率所以干脆先把容易的写出来再改公式。。、

视频点击此处查看视频
这次发的是1602版,也有数码管版的其实完全可以用13个io控制5个数码管不过开发板是带锁存器的所以就写成锁存器版的了,有想自己做数码管的可以改一改程序把锁存器省了。。
不过更是适于1602操作,因为1602本身有锁存功能,而数码管扫描非常浪费单片机资源所以低频是会出现等待触发中断的无显示现象,其实要是改也可以改一改把整个采值和计算程序都集成在中断函数中然后疯狂的扫描数码管。。

该物还是各有优缺点。。有点是非常准确,只要晶振没问题那出来的频率肯定没问题。用示波器直读实测。见下楼图。
缺点是51主频分频严重这点不如avr和pic所以最高频率也就920KHz。再高会有漏数造成不准。
还有就是低频由于要等待精确的50000次计数才能触发一次,也就是说50kHZ才一秒更新一次频率。低频就非常蛋疼了。最低可以让人类接受的可测频率20k左右。。2秒更新一次频率,但是非常准确。

由于该物还是有各种局限,所以不适合---HAM使用。适用人群--开关电源er,----TCer----其他各种小制作er……etc
过两天出便携版,届时锂电供电数码管显示掌上版。预计成本10元以内。。
先把1602版的贴上来。我用的ly51s开发板别的板子的同学自己改io


#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define DataPort P0
sbit rs = P2^4;  
sbit rw = P2^5;
sbit e = P2^6;
sbit in=P3^5;    //t1
sbit ind=P2^0;
unsigned char c,t,num,hout,lout;
unsigned long int result,transit;
unsigned code sheet[]={0x30,0x31,0x32,0x33,0x34,0x35,
0x36,0x37,0x38,0x39};
unsigned code Fr[]={0x46,0x3d};
unsigned code fline[]={0x52,0x4d,0x52,0x27,0x73,0x20,
0x46,0x72,0x65,0x71,0x20,0x6d,0x65,0x74,0x65,0x72};
unsigned code hzz[]={0x6b,0x48,0x7a};
void DelayUs2x(unsigned char t)
{  
while(--t);
}
void delay(unsigned char t)
{
     while(t--)
      {
     //????1mS
     DelayUs2x(245);
     DelayUs2x(245);
      }
}

bit LCD_Check_Busy(void)
{
    DataPort=0xFF;
     rs=0;
     rw=1;
     e=0;
     _nop_();
     e=1;
    return (bit)(DataPort & 0x80);
}
void write_command (unsigned char com)
{
     while(LCD_Check_Busy());
     rs=0;
     rw=0;
     _nop_();
     DataPort=com;
     _nop_();
     e=1;
     _nop_();
     _nop_();
     e=0;
}
void write_data (unsigned char info)
{
     while(LCD_Check_Busy());
     rs=1;
     rw=0;
     _nop_();
     DataPort=info;
     _nop_();
     e=1;
     _nop_();
     _nop_();
     e=0;
}
unsigned long int calculate()
{
        transit=t*50000+(50000-(65536-(hout*256+lout)));
        result=200000000/(transit/50);
        return result;
}
void start()
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    TR0=1;
    TR1=1;
    t=0;
    c=0;
    while(t+c==0){}
    if(t>=c)
    {
        while(c==0){}
        TR0=0;
        TR1=0;
        hout=TH0;
        lout=TL0;
    }
}


void display(unsigned long int dis)
{    
    unsigned char ge,shi,bai,qian,wan;
    wan=dis/10000%10;
    qian=dis/1000%10;
    bai=dis/100%10;
    shi=dis/10%10;
    ge=dis%10;
    write_command(0x80+0x42);
    write_data(sheet[wan]);
    write_command(0x80+0x43);
    write_data(sheet[qian]);
    write_command(0x80+0x44);
    write_data(sheet[bai]);
    write_command(0x80+0x46);
    write_data(sheet[shi]);
    write_command(0x80+0x47);
    write_data(sheet[ge]);
}
void initial ()
{
    rs=0;
    e=0;
    TMOD=0x51 ; // T1=count  T0=time
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    EA=1;
    ET1=1;
    ET0=1;
    TR0=0;
    TR1=0;    
    write_command(0x38);
    delay(5);
    write_command(0x38);
    delay(5);
    write_command(0x38);
    delay(5);      
    write_command(0x38);
    write_command(0x08);
    write_command(0x01);
    write_command(0x06);
    delay(3);
    write_command(0x0c);
}
    
void main()
{
    initial();
    for(num=0;num<16;num++)
    {
        write_data(fline[num]);
        delay(1);
    }
    num=0;
    write_command(0x80+0x40);
    for(num=0;num<2;num++)
    {
        write_data(Fr[num]);
        delay(1);
    }
    num=0;
    write_command(0x80+0x48);
    for(num=0;num<3;num++)
    {
        write_data(hzz[num]);
        delay(1);
    }
    write_command(0x80+0x45);
    write_data('.');
    while(1)
    {
        start();
        display(calculate());

    }
}




void count ()interrupt 3
{
    c++;
    if(t==0)
    {
        TH0=(65536-50000)/256;      //reset count while time haven't trig
        TL0=(65536-50000)%256;
    }
}



void time () interrupt 1
{
    t++;        
    if(c==0)
    {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
    }

}
+25  科创币    科学人    2012/08/24
+50  科创币    20!Dopaminor    2012/08/25
来自:电子信息 / 电子技术
7
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
任某人 作者
12年6个月前 IP:未同步
443500
数码管版。。可能还有bug欢迎报告
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define DataPort P0
sbit rs=P1^0;
sbit e=P1^2;
sbit rw=P1^1;
sbit in=P3^5;    //t1
sbit g=P0^0;
sbit s=P0^1;
sbit b=P0^2;
sbit q=P0^3;
sbit w=P0^4;
sbit dula=P1^0;
sbit wela=P1^1;
sbit ind=P2^0;
unsigned char tfc,num,waste,stof;
unsigned int  hout,lout,c,t;
unsigned long int result,transit;
unsigned code otime[]={0x6f,0x6e,0x74,0x69,0x6d,0x65,0x3d};

code unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void DelayUs2x(unsigned char t)
{  
while(--t);
}
void delay(unsigned char t)
{
     while(t--)
      {
     //????1mS
     DelayUs2x(245);
     DelayUs2x(245);
      }
}
void led(unsigned long int dis)
{
    num=0;
    while(num!=30)
    {
        [s:9]0=seg7code[dis%10];
        dula=1;
        dula=0;
        [s:9]0=0xef;
        wela=1;
        wela=0;
        delay(1);
        [s:9]0=seg7code[dis/10%10];
        dula=1;
        dula=0;
        [s:9]0=0xf7;
        wela=1;
        wela=0;
        delay(1);
        [s:9]0=seg7code[dis/100%10];
        dula=1;
        dula=0;
        [s:9]0=0xfb;
        wela=1;
        wela=0;
        delay(1);
        [s:9]0=seg7code[dis/1000%10];
        dula=1;
        dula=0;
        [s:9]0=0xfd;
        wela=1;
        wela=0;
        delay(1);
        [s:9]0=seg7code[dis/10000%10];
        dula=1;
        dula=0;
        [s:9]0=0xfe;
        wela=1;
        wela=0;
        delay(1);
        num++;
        [s:9]0=0xff;
        wela=1;
        wela=0;
    }

    num=0;
}

void start()
{
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    TH1=(65536-5000)/256;
    TL1=(65536-5000)%256;
    TR0=1;
    TR1=1;
    t=0;
    c=0;
    while(t+c==0){}
    if(t>=c)
    {
        while(c==0){}
        TR0=0;
        TR1=0;
        tfc=1;
        hout=TH0;
        lout=TL0;
    }
    else
    {
        while(t==0){}
        TR0=0;
        TR1=0;
        tfc=0;
        hout=TH1;
        lout=TL1;
    }
}

unsigned long int calculate()
{
    
        if(tfc==1)
        {
            transit=t*5000+(5000-(65536-(hout*256+lout)));
            result=100000-(10000000/(transit/50));
        }
        if(tfc==0)
        {
            transit=((c+1)*5000)-(65536-(hout*256+lout));
            result=transit*4;     //Hundred Hz is the unit
        }
    return result;
}


void initial()
{
    rs=0;
    rw=0;
    e=0;
    TMOD=0x51 ; // T1=count  T0=time
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    TH1=(65536-5000)/256;
    TL1=(65536-5000)%256;
    EA=1;
    ET1=1;
    ET0=1;
    TR0=0;
    TR1=0;                
}
void main()
{
    initial();
//    while(1){c++;}
    while(1)
    {
        start();
        led(calculate());
        ind=stof;
    }
}




void count ()interrupt 3
{
    c++;
    if(t==0)
    {
        TH1=(65536-5000)/256;      //reset count while time haven't trig
        TL1=(65536-5000)%256;
    }
}

void time () interrupt 1
{
    t++;        
    if(c==0)
    {
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
    }

}

上几张图
DSC_0565.jpg DSC_0566.jpg DSC_0567.jpg DSC_0568.jpg DSC_0569.jpg DSC_0570.jpg [attachment=event]
+1
科创币
hx
2012-08-23
看到了一块骚板
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yanli12321
12年6个月前 IP:未同步
443558
如果你用的是STC89c系列的单片机的话可以在STC下载界面选择6T/双倍速把程序下载两次,这样单片机会由12分频变为6分频,相当于晶振频率提高了一倍
QQ截图20120823231834.jpg
PS:别问我为啥要下载两次,我也不知道,我试过只下载一次的话还是12分频
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
任某人作者
12年6个月前 IP:未同步
443584
回 2楼(yanli12321) 的帖子
忘了说了。。就是跑的6t。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yanli12321
12年6个月前 IP:未同步
443704
回 3楼(任某人) 的帖子
在输入端加一个74HC4060或74HC4040可大幅提高频率上限吧[s:274]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
最高主机泡泡
12年6个月前 IP:未同步
443707
找一个洞洞板做吧,用开发板做这个有点浪费,不便携,也容易损坏。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yanli12321
12年6个月前 IP:未同步
443710
回 5楼(baiwenglong) 的帖子
开发板只是临时试验而已[s:275]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

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

空空如也

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