标题: 基于51单片机的等精度频率计设计(含程序,仿真电路,通过实测) [打印本页]

作者: wxfhz    时间: 2017-7-21 17:09
标题: 基于51单片机的等精度频率计设计(含程序,仿真电路,通过实测)
本设计以51单片机为核心,显示采用1602液晶。频率测量方法采用等精度频率法测量,外部脉冲作为内部高速脉冲计数的启动信号,也是最后的计数的结束信号。保证外部脉冲计数的无误差,通过内部的高速计数保证测量精度。

等精度频率计ppt:

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):

设计论文:


单片机源程序如下:
  1. #include "STC12C5A60S2.H"
  2. #include "Intrins.h"
  3. #include "1602.h"
  4. unsigned char t0_hh,t1_hh;
  5. unsigned char dis_buf[12];
  6. //unsigned char code frequence[]={"frequence:"};

  7. #define FOSC 11059200 //18432000L
  8. #define BAUD 9600


  9. //sbit  RS=P2^0;
  10. //sbit        RW=P2^1;
  11. ////sbit RS=P1^0;
  12. ////sbit RW=P1^1;
  13. //sbit        LCM1602_E=P2^2;
  14. //sbit        LCM1602_Busy=P0^7;
  15. bit         firstex,secondex;
  16. unsigned long count0,count1;
  17. unsigned long count;

  18. void deal_data()
  19. {
  20.         unsigned char i;
  21.         float adata;

  22.         count1=t1_hh*65536+TH1*256+TL1;
  23.         count0=t0_hh*65536+TH0*256+TL0;

  24.         adata=(float)count1*10000000/count0;
  25.         adata=(float)adata*10/1.0851245;  //修正
  26.         count=(unsigned long)(adata+0.5);

  27.         for(i=8;i>0;i--)
  28.         {
  29.                 dis_buf[i]=count%10;
  30.                 count=count/10;
  31.         }
  32.         dis_buf[0]=count;
  33.         dis_buf[9]=dis_buf[8];
  34.         dis_buf[8]=dis_buf[7];
  35.         dis_buf[7]=-2;
  36. }

  37. //低频液晶显示
  38. void display()
  39. {
  40.         unsigned char i;
  41.         for(i=0;i<12;i++)
  42.         {
  43.                 lcd_char_write(i,1,dis_buf[i]+0x30);
  44.         }

  45. }

  46. //外中断1
  47. void init1() interrupt 2
  48. { //lcd_char_write(10,0,0x30);
  49.         if(firstex==0)
  50.         {       
  51.                 TH1=0;
  52.                 TL1=0;
  53.                 TH0=0;
  54.                 TL0=0;
  55.                 t0_hh=0;
  56.                 t1_hh=0;
  57.                 TR1=1;
  58.                 TR0=1;
  59.                 EX1=0;
  60.                 firstex=1;
  61.                 secondex=0;
  62.         }
  63.         else
  64.         {
  65.                 TR1=0;
  66.                 TR0=0;
  67.                 secondex=1;
  68.                 EX1=0;
  69.         }
  70.                
  71. }
  72. //定时器1中断处理
  73. void timer1() interrupt 3
  74. {
  75.         t1_hh++;
  76. }

  77. void timer0() interrupt 1
  78. {
  79.         t0_hh++;
  80.         if(t0_hh>=20)
  81.         {
  82.                 IE1=0;
  83.                 EX1=1;
  84.         }
  85. }

  86. void main()
  87. {       

  88.         AUXR= 0x40;
  89.         TMOD=0x51;
  90.         ET1=1;
  91.         ET0=1;
  92.         IT1=1;
  93.         EX1=1;
  94. ……………………

  95. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51单片机等精度频率计.rar (1.03 MB, 下载次数: 612)



作者: admin    时间: 2017-7-22 17:21
好资料,51黑有你更精彩!!!
作者: white1    时间: 2017-7-30 14:02
本帖最后由 white1 于 2017-7-31 15:16 编辑

好资源,谢谢楼主
作者: xiaoyuxinke    时间: 2017-8-1 00:27
实测精度好差
作者: lwj7474741    时间: 2018-1-14 14:40
哇!太感谢了!
作者: a25575703    时间: 2018-1-14 22:24
感謝樓主的分享。
作者: raymondau    时间: 2018-3-25 16:46
本帖最后由 raymondau 于 2018-3-25 16:55 编辑

请问楼主那单片机是用STC89C51还是用STC12C5A60S2的?
另外再请问一下这频率计的测量范围有多大的?

作者: raymondau    时间: 2018-3-25 16:54
另外再请问一下这个频率计的测量范围有多大的?
作者: 1258185790@qq.c    时间: 2018-5-26 20:23
请问是采用测频、测周、混合、等精度中的哪一种
作者: 1258185790@qq.c    时间: 2018-5-26 20:35
可以STC89C52代替STC12C5A60S2吗?
作者: fsj5098    时间: 2018-12-13 22:30
应该是采用测周法
作者: 1xiaosun    时间: 2018-12-14 09:06
xiaoyuxinke 发表于 2017-8-1 00:27
实测精度好差

精度好差可能程序有错,这个原理应该很准的,0.001Hz~1MHz无压力
作者: qq13337338077    时间: 2018-12-18 13:05
精度怎么样?
作者: wljj1278824    时间: 2018-12-21 13:28
好资料,学习下,不过能达到这个精度吗
作者: springcsp    时间: 2019-7-15 16:09

好资料,51黑有你更精彩!!!
作者: gxtyx    时间: 2019-11-22 23:33
这个资料正合适
作者: 9638527410ppp    时间: 2020-3-30 11:47
太棒了!!感谢楼主!!
作者: jgjbd    时间: 2020-4-22 15:27
if(t0_hh>=20)         {                 IE1=0;                 EX1=1;         }  这一句的意义是什么啊
作者: jgjbd    时间: 2020-4-22 15:29
if(t0_hh>=20)
        {
                IE1=0;
                EX1=1;
        }
为什么没有这步就不显示数据,这一步的意义是什么啊
作者: 1935501565    时间: 2020-6-8 17:13
很好的分享
作者: 1935501565    时间: 2020-6-8 17:14
很好的分享,谢谢楼主分享
作者: 1935501565    时间: 2020-6-8 17:15
谢谢楼主的分享啦
作者: 初晴2000    时间: 2020-6-8 18:00
感谢大佬!!!爱了爱了
作者: 初晴2000    时间: 2020-6-22 16:21
精度很差诶!!!
作者: 一个傅立叶    时间: 2020-7-9 11:55
精度有点低啊
作者: bm32    时间: 2020-7-10 17:37
好资料,51黑有你更精彩!!!
作者: lujuguo    时间: 2020-8-17 16:43
有黑论坛生活更精彩!
作者: 陈润源home    时间: 2020-8-19 11:12
jgjbd 发表于 2020-4-22 15:29
if(t0_hh>=20)
        {
                IE1=0;

外部中断配置,没有就检测不了引脚电平变化
作者: ykygky    时间: 2021-5-3 00:01
这仿真只能测到10mhz以下,没有楼主PPT上面的那么高,应该要分频吧
作者: jhjh123f    时间: 2021-5-18 17:04
这个误差有点大啊
作者: aking991    时间: 2021-5-19 08:26
实际上51能测到那么高的精度吗?我以前也试验过,在24M有源温补晶振的情况下,最好的状态只能测到万分之一的精度,还作不到百万分之一的精度,虽然不相信,但也只能下载下来参考
作者: sharehope    时间: 2021-5-19 21:27
大家关注的确实都是精度这个点上,看看如何等布提高
作者: 卷卷zeta    时间: 2021-7-11 17:11
如果要把这个改成数码管显示应该怎么修改呀,小白求教
作者: 不必了啊    时间: 2021-7-16 16:14
        count1=t1_hh*65536+TH1*256+TL1;
        count0=t0_hh*65536+TH0*256+TL0;

        adata=(float)count1*10000000/count0;
        adata=(float)adata*10/1.0851245;  //修正
        count=(unsigned long)(adata+0.5);
问一下这里修正是干嘛用的,为什么要进行修正啊?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1