找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10958|回复: 33
收起左侧

基于51单片机的等精度频率计设计(含程序,仿真电路,通过实测)

  [复制链接]
ID:46986 发表于 2017-7-21 17:09 | 显示全部楼层 |阅读模式
本设计以51单片机为核心,显示采用1602液晶。频率测量方法采用等精度频率法测量,外部脉冲作为内部高速脉冲计数的启动信号,也是最后的计数的结束信号。保证外部脉冲计数的无误差,通过内部的高速计数保证测量精度。

等精度频率计ppt:
0.png 0.png
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
0.png
设计论文:
0.png 0.png

单片机源程序如下:
  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, 下载次数: 600)
回复

使用道具 举报

ID:1 发表于 2017-7-22 17:21 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:223372 发表于 2017-7-30 14:02 | 显示全部楼层
本帖最后由 white1 于 2017-7-31 15:16 编辑

好资源,谢谢楼主
回复

使用道具 举报

ID:61140 发表于 2017-8-1 00:27 | 显示全部楼层
实测精度好差
回复

使用道具 举报

ID:275831 发表于 2018-1-14 14:40 | 显示全部楼层
哇!太感谢了!
回复

使用道具 举报

ID:268118 发表于 2018-1-14 22:24 | 显示全部楼层
感謝樓主的分享。
回复

使用道具 举报

ID:102702 发表于 2018-3-25 16:46 | 显示全部楼层
本帖最后由 raymondau 于 2018-3-25 16:55 编辑

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

使用道具 举报

ID:102702 发表于 2018-3-25 16:54 | 显示全部楼层
另外再请问一下这个频率计的测量范围有多大的?
回复

使用道具 举报

ID:254903 发表于 2018-5-26 20:23 | 显示全部楼层
请问是采用测频、测周、混合、等精度中的哪一种
回复

使用道具 举报

ID:254903 发表于 2018-5-26 20:35 | 显示全部楼层
可以STC89C52代替STC12C5A60S2吗?
回复

使用道具 举报

ID:78901 发表于 2018-12-13 22:30 | 显示全部楼层
应该是采用测周法
回复

使用道具 举报

ID:275671 发表于 2018-12-14 09:06 | 显示全部楼层

精度好差可能程序有错,这个原理应该很准的,0.001Hz~1MHz无压力
回复

使用道具 举报

ID:448688 发表于 2018-12-18 13:05 来自手机 | 显示全部楼层
精度怎么样?
回复

使用道具 举报

ID:204720 发表于 2018-12-21 13:28 | 显示全部楼层
好资料,学习下,不过能达到这个精度吗
回复

使用道具 举报

ID:584519 发表于 2019-7-15 16:09 | 显示全部楼层

好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:84932 发表于 2019-11-22 23:33 | 显示全部楼层
这个资料正合适
回复

使用道具 举报

ID:714426 发表于 2020-3-30 11:47 | 显示全部楼层
太棒了!!感谢楼主!!
回复

使用道具 举报

ID:652093 发表于 2020-4-22 15:27 | 显示全部楼层
if(t0_hh>=20)         {                 IE1=0;                 EX1=1;         }  这一句的意义是什么啊
回复

使用道具 举报

ID:652093 发表于 2020-4-22 15:29 | 显示全部楼层
if(t0_hh>=20)
        {
                IE1=0;
                EX1=1;
        }
为什么没有这步就不显示数据,这一步的意义是什么啊
回复

使用道具 举报

ID:773076 发表于 2020-6-8 17:13 | 显示全部楼层
很好的分享
回复

使用道具 举报

ID:773076 发表于 2020-6-8 17:14 | 显示全部楼层
很好的分享,谢谢楼主分享
回复

使用道具 举报

ID:773076 发表于 2020-6-8 17:15 | 显示全部楼层
谢谢楼主的分享啦
回复

使用道具 举报

ID:739368 发表于 2020-6-8 18:00 | 显示全部楼层
感谢大佬!!!爱了爱了
回复

使用道具 举报

ID:739368 发表于 2020-6-22 16:21 | 显示全部楼层
精度很差诶!!!
回复

使用道具 举报

ID:800184 发表于 2020-7-9 11:55 | 显示全部楼层
精度有点低啊
回复

使用道具 举报

ID:519062 发表于 2020-7-10 17:37 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:617813 发表于 2020-8-17 16:43 | 显示全部楼层
有黑论坛生活更精彩!
回复

使用道具 举报

ID:293363 发表于 2020-8-19 11:12 | 显示全部楼层
jgjbd 发表于 2020-4-22 15:29
if(t0_hh>=20)
        {
                IE1=0;

外部中断配置,没有就检测不了引脚电平变化
回复

使用道具 举报

ID:914024 发表于 2021-5-3 00:01 | 显示全部楼层
这仿真只能测到10mhz以下,没有楼主PPT上面的那么高,应该要分频吧
回复

使用道具 举报

ID:905744 发表于 2021-5-18 17:04 | 显示全部楼层
这个误差有点大啊
回复

使用道具 举报

ID:65956 发表于 2021-5-19 08:26 | 显示全部楼层
实际上51能测到那么高的精度吗?我以前也试验过,在24M有源温补晶振的情况下,最好的状态只能测到万分之一的精度,还作不到百万分之一的精度,虽然不相信,但也只能下载下来参考
回复

使用道具 举报

ID:924117 发表于 2021-5-19 21:27 | 显示全部楼层
大家关注的确实都是精度这个点上,看看如何等布提高
回复

使用道具 举报

ID:951816 发表于 2021-7-11 17:11 | 显示全部楼层
如果要把这个改成数码管显示应该怎么修改呀,小白求教
回复

使用道具 举报

ID:953846 发表于 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);
问一下这里修正是干嘛用的,为什么要进行修正啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表