标题: 单片机数字频率计设计 仿真 实物 PCB 原理图 课设论文都有 [打印本页]

作者: 51黑电子迷    时间: 2017-2-11 03:02
标题: 单片机数字频率计设计 仿真 实物 PCB 原理图 课设论文都有
给大家分享一个很好的单片机设计,而且资料很全。仿真 pcb 原理图 程序和课程设计论文都有.
频率计的所有设计资料下载:
频率计.rar (13.27 MB, 下载次数: 754)


下面给大家分享一下本设计的相关图片

数字频率计实物图:


单片机数字频率计原理图:





数字频率计仿真图:



单片机数字频率计pcb图:



/****** 数字频率计元件清单 *******/

1、1602LCD液晶屏                1个        
2、排阵16P                        1个
3、排阵4P                        1个
4、排母16P                        1个
5、单片机STC89C52                1个
6、DIP40插座                        1个
7、74HC390                        1个
8、74HC14                        1个
9、DIP14                        1个
10、DIP16                        1个
11、电阻300                        1个
12、3K                                1个
13、1K                                2个
14、75                                1个
15、电容470UF                        3个
16、0.1UF(104)                2个
17、10UF                        1个
18、30P                                2个
19、排阻103                        1个
20、电位器103                        1个
21、三极管8050                        1个
22、按键                        1个
23、晶振12M                        1个
24、DC电源座子                        1个
25、USB转DC线                        1个
26、电路板7*9                        1个
27、导线12匝                        1个
28、电路图                        1个
29、铜柱                        4套
30、自锁开关                        1个
/*********** 共计:29种 ***********/
/*********** 共计:41个 ***********/


单片机数字频率计源程序:
  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.                         fre = fre *100;//100分频
  172.                 }
  173.            TL0=0;                 //清零计数器0计数            
  174.            TH0=0;
  175.            TL1=0;
  176.            TH1=0;
  177.            count=0;               //清零计数器0计数         
  178.            count1=0;
  179.            EA=1;                  //开中断            
  180.         }
  181. }
  182. //----------------------------------------------------------------
  183. void timer0(void) interrupt 1 //计数器0中断(100分频前)         
  184. {
  185.         count++;
  186. }               
  187. //----------------------------------------------------------------
  188. void timer1(void) interrupt 3 //计数器1中断(100分频后)
  189. {
  190.         count1++;
  191. }
复制代码



作者: 51单片机小白    时间: 2017-3-30 11:32
谢谢高手分享!!
作者: uuu1    时间: 2017-5-17 15:29
怎么控制电压在50mv~1v之间,然后被测信号的频率范围在1Hz~10MHz呢
作者: 爱小宝    时间: 2017-10-9 23:51
请问一下,你这个原理图是在AD上还是PROTEL99SE上画的啊
作者: liu138097    时间: 2017-11-30 23:56
可以看看
作者: TinyRay    时间: 2017-12-23 16:13
芯片可以换51吗?
作者: wdsg    时间: 2017-12-30 19:15
我想问一下,为什么我运行的时候LCD只会亮,不显示频率呀?
作者: 高调的大帅哥    时间: 2018-1-2 09:45
很不错
作者: liangxinlong    时间: 2018-1-2 16:06
wdsg 发表于 2017-12-30 19:15
我想问一下,为什么我运行的时候LCD只会亮,不显示频率呀?

你这个问题解决了么

作者: liangxinlong    时间: 2018-1-2 16:08
你好,我根据你的帖子做出了一个频率计,但是液晶屏通电不显示频率,初始化也无法显示
作者: qjzyx    时间: 2018-1-3 11:29
谢谢分享!下个保存!做个玩玩!
作者: a25575703    时间: 2018-1-15 03:53
感謝樓主的分享。
作者: 路过的折耳兔    时间: 2018-5-14 13:37
感谢分享!
作者: meilidianzhi    时间: 2018-5-14 20:56
厉害了我的哥
作者: fuj    时间: 2018-5-27 16:48
下载不了,浪费了我好多积分

作者: yulanhao    时间: 2018-5-28 21:33
你们都分享出来,还让学生好好做毕设嘛?都抄袭了
作者: 大苏打123    时间: 2018-6-2 17:13
厉害了
作者: 大玉米    时间: 2018-6-6 10:07
谢谢分享!下个保存!做个玩玩
作者: 大玉米    时间: 2018-6-6 10:08
谢谢分享!下个保存!做个玩玩
作者: zzy1259    时间: 2018-7-2 21:09
感谢分享!!!!

作者: 673191231    时间: 2018-7-6 08:42
楼主,我想问一下这个频率计测量范围是多少,怎么样修改为0-999hz
作者: 帅到爆炸    时间: 2018-7-6 09:15
点击下载点了两次,多花了5黑币,蛋疼。。。
作者: zh18016498169    时间: 2018-12-23 13:07
感谢分享,赞一个

作者: 小可爱我爱你    时间: 2018-12-24 21:04
谢谢分享
作者: 小可爱我爱你    时间: 2018-12-25 18:03
非常棒!
作者: 小可爱我爱你    时间: 2018-12-26 16:51
对我很有用
作者: bclafa    时间: 2019-3-28 11:27
好详细啊!感激!
作者: 蒹葭萋萋    时间: 2019-10-19 14:34
测试范围是多少呢
作者: cwdw    时间: 2019-10-29 22:25
感谢分享,不错
作者: zxd0106a    时间: 2024-10-25 15:41
谢谢分享!下个保存!做个玩玩!




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