标题: 最近DIY了一个简易数字频率计(PCB+电路图+单片机源码+实物制作) [打印本页]

作者: 123一起走    时间: 2018-4-15 18:42
标题: 最近DIY了一个简易数字频率计(PCB+电路图+单片机源码+实物制作)
资源全部在里面 请大家多多指教 一个新手  第一次发帖



全部资料51hei下载地址:
单片机频率计.rar (10.9 MB, 下载次数: 1050)




频率计电路原理图如下:


pcb文件:


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


频率计实物图:


单片机源程序如下:
  1. #include <reg52.h>
  2. unsigned long int fre;
  3. unsigned char time;
  4. unsigned int count;
  5. unsigned int count1;
  6. sbit   LCD_RS=P1^0;          //片选信号
  7. sbit   LCD_RW=P1^1;          //读写信号
  8. sbit   LCD_E=P1^2;           //使能信号
  9. #define LCD_DB  P0        //数据信号
  10. unsigned char character[10]={0};//在屏幕上显示的字符串
  11. unsigned char character_1[]={"fre= Hz"};
  12. unsigned char FLAG = 0;  //是否分频选择标志
  13. void LCD_init(void);//初始化函数   
  14. void LCD_write_command(unsigned char command);//写指令函数         
  15. void LCD_write_data(unsigned char dat);//写数据函数           
  16. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
  17. void delay_n40us(unsigned int n);//延时函数
  18. void timer_init();            //中断初始化函数  
  19. //-----------------------------延时函数---------------------------
  20. void delay_n40us(unsigned int n)                  //延时函数
  21. {
  22.         unsigned int i;
  23.         unsigned char j;            
  24.         for(i=n;i>0;i--)
  25.         for(j=0;j<2;j++);         
  26. }
  27. void delay_1s()
  28. {
  29.         unsigned int i,j;
  30.         for(i = 0;i<100;i++)
  31.                 for(j = 0;j<1000;j++);
  32. }
  33. //---------------------lcd1602液晶显示函数--------------------                                    
  34. void LCD_init(void)         //液晶初始化函数
  35. {
  36.         LCD_write_command(0x38);//设置8位格式,2行,5x7
  37.         LCD_write_command(0x38);//设置8位格式,2行,5x7
  38.         LCD_write_command(0x38);//设置8位格式,2行,5x7
  39.         LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  40.         LCD_write_command(0x06);//设定输入方式,增量不移位
  41.         LCD_write_command(0x01);//清除屏幕显示         
  42.         delay_n40us(100);//清屏延时
  43. }
  44. void LCD_write_command(unsigned char dat)  //写命令函数
  45. {
  46.         LCD_DB=dat;
  47.         LCD_RS=0;//指令         
  48.         LCD_RW=0;//写入         
  49.         LCD_E=1; //使能         
  50.         LCD_E=0;
  51.         delay_n40us(1);//写命令延时   
  52. }         
  53. void LCD_write_data(unsigned char dat)          //写数据函数
  54. {
  55.         LCD_DB=dat;
  56.         LCD_RS=1;//数据         
  57.         LCD_RW=0;//写入         
  58.         LCD_E=1;//使能  
  59.         LCD_E=0;
  60.         delay_n40us(1);         //写数据延时
  61. }
  62. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//显示一个字符
  63. {
  64.         unsigned char address;
  65.         if(y==1)
  66.                  address=0x80+x;         //显示在第一排的时候的x的地址
  67.         else
  68.                  address=0xc0+x;         //显示在第二排的时候的x的地址
  69.         LCD_write_command(address);         //输入地址
  70.         LCD_write_data(dat);                 //输入数据
  71. }
  72. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//显示一个数字
  73. {
  74.         unsigned char address;
  75.         if(y==1)
  76.                  address=0x80+x;         //显示在第一排的时候的x的地址
  77.         else
  78.                  address=0xc0+x;         //显示在第二排的时候的x的地址
  79.         LCD_write_command(address);         //输入地址
  80.         LCD_write_data(dat+48);                 //输入数据
  81. }
  82. void dis_num(void)
  83. {
  84.         unsigned char i=0,j=0,k=0;
  85.         LCD_write_command(0x01);//清除屏幕显示
  86.         character[0] = fre/10000000;
  87.         character[1] = fre/1000000%10;
  88.         character[2] = fre/100000%10;
  89.         character[3] = fre/10000%10;
  90.         character[4] = fre/1000%10;
  91.         character[5] = fre/100%10;
  92.         character[6] = fre/10%10;
  93.         character[7] = fre%10;
  94.     character[8] = 'H';
  95.         character[9] = 'z';
  96.         for(i = 0;i<4;i++)                 //显示“fre=”
  97.         {
  98.                  LCD_disp_char(i+0,1,character_1[i]);
  99.         }
  100.         for(i = 0;i<10;i++)         //判断第一个不为0的数
  101.         {
  102.                 if(character[i]!=0)
  103.                         break;
  104.         }
  105.         k = 8-i;
  106.         for(j = 0;j<k;j++)         //显示所有的数字
  107.         {
  108.                         LCD_disp_num(4+j,1,character[i++]);        
  109.         }
  110.     for(i = 5;i<7;i++)         //显示“Hz”
  111.         {
  112.                  LCD_disp_char(j+4,1,character_1[i]);
  113.                 j++;
  114.         }
  115. }
  116. //----------------主函数--------------------
  117. void main()
  118. {
  119.         unsigned char i;
  120.         LCD_init();
  121.         timer_init();             //定时/计数器初始化
  122.         for(i = 0;i<4;i++)
  123.         {
  124.                  LCD_disp_char(i+0,1,character_1[i]);
  125.         }
  126.         while(1)
  127.         {
  128.                 dis_num();         //显示
  129.                 delay_1s();
  130.         }
  131. }
  132. //-------------------定时/计数器初始化--------------
  133. void timer_init(void)         //定时/计数器初始化
  134. {
  135.         TMOD=0x66;                //计数器0和计数器1工作工作方式2,自动重装初值
  136.         TH0=0;                    //计数器初值为0
  137.         TL0=0;
  138.         TR0=1;                    //计数器开始计数            
  139.         ET0=1;                    //打开计数器0中断   
  140.         TH1=0;                    //计数器初值为0
  141.         TL1=0;
  142.         TR1=1;                    //计数器开始计数            
  143.         ET1=1;                    //打开计数器1中断   
  144.         RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值,
  145.         RCAP2L=(65536-62500)%256; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
  146.         TH2=RCAP2H;               //12M晶振下每次中断62.5ms(1s=1000ms=62.5ms×16)
  147.         TL2=RCAP2L;
  148.         ET2=1;                    //打开定时器2中断         
  149.         TR2=1;                    //定时器2开始计时  
  150.         EA=1;                     //开总中断   
  151. }
  152. //------------------中断函数----------------------
  153. void timer2(void) interrupt 5 //定时器2中断(62.5ms)
  154. {
  155.         time++;
  156.         TF2=0;                    //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零
  157.         if (time==16)             //定时1s时间到  
  158.         {
  159.            time=0;                //计时清0
  160.            EA=0;                  //关中断                 
  161.            fre=(long)count1*256+TL1;     //count*256强制转换成long型,否则将不产生进位~先判断分频后(计数器1)
  162.            FLAG = 0;
  163.          
  164.            if(fre<2000)//如果不到200KHz则读取分频前(计数器0)频率(200K÷100=2000)
  165.            {
  166.                            fre = (long)count*256+TL0;
  167.                         FLAG = 1;         
  168.            }
  169.                 if(!FLAG)
  170. ……………………

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


作者: 51单片机小白    时间: 2018-4-16 14:13
向高手学习!!
作者: 若梦5151    时间: 2018-4-24 15:53
大家不要下,有错误,不能仿真
作者: ljm789123    时间: 2018-4-25 08:42

向高手学习 学习
作者: ljm789123    时间: 2018-4-25 08:42
学习学习学习学习
作者: f556    时间: 2018-4-26 17:14
最高频率多少?
作者: cqqwing    时间: 2018-6-11 14:33
精准度 效验过吗, 100-500Mhz 的频率,有多精确? 还有,功率 亚音等,是否能测?
作者: cqqwing    时间: 2018-6-11 14:56
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

注意检查,不是任何东西都能原模原样照抄的,照抄不一定能用,
作者: Urara    时间: 2018-6-24 10:12
好用!!!
作者: qujilei    时间: 2018-9-19 09:06
厉害了
作者: aking991    时间: 2018-9-27 08:26
学习到了,谢谢分享
作者: 乐乐畅    时间: 2018-10-29 09:35
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

我都仿真成功了,你是不是哪里没有设置
作者: 快乐眼泪    时间: 2018-10-29 18:55
感谢楼主分享!
作者: wpppmlah    时间: 2019-3-25 16:38
厉害的高手,下载了全部资料学习一下感谢.
作者: wpppmlah    时间: 2019-3-25 16:52
可以仿真,并仿真成功.

调整大小 快照1.jpg (112.36 KB, 下载次数: 173)

调整大小 快照1.jpg

作者: paradan    时间: 2019-4-25 21:39
本帖最后由 paradan 于 2019-4-26 08:48 编辑

C:\Users\Administrator\Desktop为啥我这个之后10

20190425213816.png (41.02 KB, 下载次数: 157)

20190425213816.png

作者: GYM19960608    时间: 2019-4-29 11:28
这个可以测频范围是多少?

作者: weiran    时间: 2019-4-29 18:59
厉害了,学习学习,正好要用到。
作者: lisony1    时间: 2019-7-16 12:25


向高手学习 学习
作者: vvv64    时间: 2019-8-26 17:23
很想知道这个可以测量的频率范围是多少?
作者: 物业tuan    时间: 2019-12-21 08:49
这个测量范围是多大
作者: qiezi12318    时间: 2019-12-27 23:51
wpppmlah 发表于 2019-3-25 16:52
可以仿真,并仿真成功.

为啥我连了之后 这个lcd显示屏没有字符显示
作者: qiezi12318    时间: 2019-12-27 23:52
请问一下我连了之后这个lcd显示屏为什么没有字符显示
作者: 19lv    时间: 2019-12-31 16:49
为什么我测不出频率啊
作者: @@;    时间: 2020-1-7 16:33
频率范围多少
作者: 未知的追求    时间: 2020-2-3 12:13
我想咨询一个问题,基于这个频率计,在放大电路中的信号输入端,高频信号是通过104pf的电容进入放大电路,则低频信号是通过470uf的电容进入放大电路吗?
作者: 未知的追求    时间: 2020-2-3 12:19
我想咨询一个问题,基于这个频率计,关于放大电路的频率信号输入,高频信号通过104pf的电容进入放大电路,而低频信号是通过470uf的电容进入放大电路,这样理解对吗?
作者: kevintang    时间: 2020-2-6 23:43
学习了,谢谢分享!
作者: 586486    时间: 2020-2-10 08:45
谢谢,学习了。
作者: 天才兄妹    时间: 2020-2-19 11:11
很强,向前辈学习
作者: wangjinlongd    时间: 2020-3-10 09:38
学习了
作者: ypd14567    时间: 2020-5-7 07:55
学习学习
作者: ypd14567    时间: 2020-5-7 08:33
学习学习
作者: 单片机新手12.15    时间: 2020-5-13 20:46
为什么我测不出1m以上的频率

作者: 195470880    时间: 2020-5-14 18:56
谢谢楼主,学习一下!
作者: 195470880    时间: 2020-5-14 21:43
谢谢楼主,学习中!
作者: hhdsdy    时间: 2020-6-17 01:00
怎么都没人回答测量范围?
作者: lixinren45    时间: 2020-7-18 14:41
想问一下测量范围有多大
作者: jintaiyang    时间: 2020-7-25 21:38
向楼主请教一下:74HC390的6脚连12脚还是7脚连12脚。原理图和PCB图两种连接方式都有,不知哪个正确。
作者: Aan.    时间: 2020-8-7 10:11
向高手学习

作者: lumie    时间: 2020-8-24 16:27
我想要使两个正弦信号叠加,要设置他们的频率和幅值,请问您的仿真软件可以做到吗,如果可以在VSM那四个旋钮里应该怎样设置呢
作者: lumie    时间: 2020-8-24 16:29
我想要使两个正弦信号叠加,要设置他们的频率和幅值,在VSM那四个旋钮里应该怎样设置呢,有没有大佬知道啊
作者: lumie    时间: 2020-8-24 16:40
这个测得是一个频率吗,我想要测两个正弦信号的叠加频率,可以实现吗
作者: rayin    时间: 2020-11-15 17:37
不错,值得学习。51hei有你更精彩!!
作者: 12ooooo    时间: 2021-8-13 12:03
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

你自己不会玩吧  没问题呀
作者: 老愚童63    时间: 2021-11-10 20:06
这个非常好,下载试制成功,因为设计一款产品需要检测频率差,频率不高,100KHz以内,而且是占空比接近50%的方波,所以将这个电路简化了,省略了施密特反相器74HC14和100分频电路74HC390以及三极管等,直接将输入信号加到单片机的P3.4口,另外,使用了网购的现成的单片机最小系统板PCB(2.7元),这样比使用点阵板要方便一些,因为网购的单片机最小系统板PCB的1602A的控制脚是P2.4(RS),P2.3(RW),P2.2(EN),所以,程序需要修改一下将原来的P1.0,P1.1,P1.2分别改成P2.4,P2.3,P2.2即可。手头有一款最高频率为1.5MHz的信号发生器,在此频率范围内测试可靠。谢谢楼主提供的资料。
作者: 老愚童63    时间: 2021-11-11 10:29
老愚童63 发表于 2021-11-10 20:06
这个非常好,下载试制成功,因为设计一款产品需要检测频率差,频率不高,100KHz以内,而且是占空比接近50% ...

单片机最小系统论坛中有原理图和比较详细的资料。
作者: yhtuse    时间: 2021-11-16 17:14
感谢分享,正需要频率计。
作者: zydl123    时间: 2021-11-25 12:42
测频宽度是多少?最高测频是多高?
作者: 1138599068    时间: 2022-1-3 20:09
向高手学习

作者: zydl123    时间: 2022-1-20 10:08
最高测频是多高?PIC的可以做到50M-1.5G
作者: mslrc    时间: 2022-4-11 19:08
可不可以分单位显示
作者: 红花无常    时间: 2022-4-12 15:02
感谢分享啊,这个相当不错,不知道它能测的频率范围是多少呢?如果能到500K左右就最好了。
作者: wukouyyq    时间: 2022-4-16 13:43
下载了,向高手学习了。

很想制作一个频率计,一直不知道如何制,且又成本很低的,但要求不高的就行,这个可以了。

我是搞电路维修的,有个这个很方便吧,回头做成成品

手头有89C52两块,集成电路网购很方便,小件都有的。
作者: lele88888    时间: 2022-7-30 22:49
很想知道这个可以测量的频率范围是多少
作者: CTLU    时间: 2023-6-14 21:23
这个值得拥有,谢谢无私奉献!
作者: jiajiahui123abc    时间: 2023-7-29 15:57
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

试过了,确实不能仿真,只要重新加载几次HEX文件就可以了




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