找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25330|回复: 56
打印 上一主题 下一主题
收起左侧

最近DIY了一个简易数字频率计(PCB+电路图+单片机源码+实物制作)

  [复制链接]
跳转到指定楼层
楼主
资源全部在里面 请大家多多指教 一个新手  第一次发帖



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




频率计电路原理图如下:


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黑下载附件…………
复制代码

评分

参与人数 3黑币 +63 收起 理由
aifengdian + 8 共享资料的黑币奖励!
vvv64 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏45 分享淘帖 顶6 踩
回复

使用道具 举报

来自 2#
ID:491875 发表于 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的信号发生器,在此频率范围内测试可靠。谢谢楼主提供的资料。
回复

使用道具 举报

板凳
ID:113235 发表于 2018-4-16 14:13 | 只看该作者
向高手学习!!
回复

使用道具 举报

地板
ID:314911 发表于 2018-4-24 15:53 | 只看该作者
大家不要下,有错误,不能仿真
回复

使用道具 举报

5#
ID:285047 发表于 2018-4-25 08:42 | 只看该作者

向高手学习 学习
回复

使用道具 举报

6#
ID:285047 发表于 2018-4-25 08:42 | 只看该作者
学习学习学习学习
回复

使用道具 举报

7#
ID:282850 发表于 2018-4-26 17:14 | 只看该作者
最高频率多少?
回复

使用道具 举报

8#
ID:26275 发表于 2018-6-11 14:33 | 只看该作者
精准度 效验过吗, 100-500Mhz 的频率,有多精确? 还有,功率 亚音等,是否能测?
回复

使用道具 举报

9#
ID:26275 发表于 2018-6-11 14:56 | 只看该作者
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

注意检查,不是任何东西都能原模原样照抄的,照抄不一定能用,
回复

使用道具 举报

10#
ID:245084 发表于 2018-6-24 10:12 | 只看该作者
好用!!!
回复

使用道具 举报

11#
ID:399814 发表于 2018-9-19 09:06 | 只看该作者
厉害了
回复

使用道具 举报

12#
ID:65956 发表于 2018-9-27 08:26 | 只看该作者
学习到了,谢谢分享
回复

使用道具 举报

13#
ID:395304 发表于 2018-10-29 09:35 | 只看该作者
若梦5151 发表于 2018-4-24 15:53
大家不要下,有错误,不能仿真

我都仿真成功了,你是不是哪里没有设置
回复

使用道具 举报

14#
ID:399179 发表于 2018-10-29 18:55 来自手机 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

15#
ID:68189 发表于 2019-3-25 16:38 | 只看该作者
厉害的高手,下载了全部资料学习一下感谢.
回复

使用道具 举报

16#
ID:68189 发表于 2019-3-25 16:52 | 只看该作者
可以仿真,并仿真成功.

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

调整大小 快照1.jpg
回复

使用道具 举报

17#
ID:521318 发表于 2019-4-25 21:39 | 只看该作者
本帖最后由 paradan 于 2019-4-26 08:48 编辑

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

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

20190425213816.png
回复

使用道具 举报

18#
ID:524319 发表于 2019-4-29 11:28 | 只看该作者
这个可以测频范围是多少?
回复

使用道具 举报

19#
ID:476752 发表于 2019-4-29 18:59 | 只看该作者
厉害了,学习学习,正好要用到。
回复

使用道具 举报

20#
ID:585016 发表于 2019-7-16 12:25 | 只看该作者


向高手学习 学习
回复

使用道具 举报

21#
ID:300101 发表于 2019-8-26 17:23 | 只看该作者
很想知道这个可以测量的频率范围是多少?
回复

使用道具 举报

22#
ID:656668 发表于 2019-12-21 08:49 | 只看该作者
这个测量范围是多大
回复

使用道具 举报

23#
ID:655518 发表于 2019-12-27 23:51 来自手机 | 只看该作者
wpppmlah 发表于 2019-3-25 16:52
可以仿真,并仿真成功.

为啥我连了之后 这个lcd显示屏没有字符显示
回复

使用道具 举报

24#
ID:655518 发表于 2019-12-27 23:52 来自手机 | 只看该作者
请问一下我连了之后这个lcd显示屏为什么没有字符显示
回复

使用道具 举报

25#
ID:677396 发表于 2019-12-31 16:49 来自手机 | 只看该作者
为什么我测不出频率啊
回复

使用道具 举报

26#
ID:677584 发表于 2020-1-7 16:33 来自手机 | 只看该作者
频率范围多少
回复

使用道具 举报

27#
ID:683580 发表于 2020-2-3 12:13 | 只看该作者
我想咨询一个问题,基于这个频率计,在放大电路中的信号输入端,高频信号是通过104pf的电容进入放大电路,则低频信号是通过470uf的电容进入放大电路吗?
回复

使用道具 举报

28#
ID:683580 发表于 2020-2-3 12:19 | 只看该作者
我想咨询一个问题,基于这个频率计,关于放大电路的频率信号输入,高频信号通过104pf的电容进入放大电路,而低频信号是通过470uf的电容进入放大电路,这样理解对吗?
回复

使用道具 举报

29#
ID:24486 发表于 2020-2-6 23:43 | 只看该作者
学习了,谢谢分享!
回复

使用道具 举报

30#
ID:418213 发表于 2020-2-10 08:45 | 只看该作者
谢谢,学习了。
回复

使用道具 举报

31#
ID:375357 发表于 2020-2-19 11:11 | 只看该作者
很强,向前辈学习
回复

使用道具 举报

32#
ID:196787 发表于 2020-3-10 09:38 | 只看该作者
学习了
回复

使用道具 举报

33#
ID:745038 发表于 2020-5-7 07:55 | 只看该作者
学习学习
回复

使用道具 举报

34#
ID:745038 发表于 2020-5-7 08:33 | 只看该作者
学习学习
回复

使用道具 举报

35#
ID:736675 发表于 2020-5-13 20:46 | 只看该作者
为什么我测不出1m以上的频率
回复

使用道具 举报

36#
ID:159857 发表于 2020-5-14 18:56 | 只看该作者
谢谢楼主,学习一下!
回复

使用道具 举报

37#
ID:159857 发表于 2020-5-14 21:43 | 只看该作者
谢谢楼主,学习中!
回复

使用道具 举报

38#
ID:88256 发表于 2020-6-17 01:00 | 只看该作者
怎么都没人回答测量范围?
回复

使用道具 举报

39#
ID:261884 发表于 2020-7-18 14:41 | 只看该作者
想问一下测量范围有多大
回复

使用道具 举报

40#
ID:774370 发表于 2020-7-25 21:38 | 只看该作者
向楼主请教一下:74HC390的6脚连12脚还是7脚连12脚。原理图和PCB图两种连接方式都有,不知哪个正确。
回复

使用道具 举报

41#
ID:812079 发表于 2020-8-7 10:11 | 只看该作者
向高手学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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