找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字频率计设计 仿真 实物 PCB 原理图 课设论文都有

  [复制链接]
跳转到指定楼层
楼主
给大家分享一个很好的单片机设计,而且资料很全。仿真 pcb 原理图 程序和课程设计论文都有.
频率计的所有设计资料下载:
频率计.rar (13.27 MB, 下载次数: 736)


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

数字频率计实物图:


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





数字频率计仿真图:



单片机数字频率计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. }
复制代码


评分

参与人数 4黑币 +18 收起 理由
帅到爆炸 + 3 绝世好帖!
zzy1259 + 5 很给力!
qjzyx + 5 淡定
啾纠 + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:113235 发表于 2017-3-30 11:32 | 只看该作者
谢谢高手分享!!
回复

使用道具 举报

板凳
ID:192999 发表于 2017-5-17 15:29 | 只看该作者
怎么控制电压在50mv~1v之间,然后被测信号的频率范围在1Hz~10MHz呢
回复

使用道具 举报

地板
ID:237416 发表于 2017-10-9 23:51 | 只看该作者
请问一下,你这个原理图是在AD上还是PROTEL99SE上画的啊
回复

使用道具 举报

5#
ID:255397 发表于 2017-11-30 23:56 | 只看该作者
可以看看
回复

使用道具 举报

6#
ID:265674 发表于 2017-12-23 16:13 | 只看该作者
芯片可以换51吗?
回复

使用道具 举报

7#
ID:269260 发表于 2017-12-30 19:15 | 只看该作者
我想问一下,为什么我运行的时候LCD只会亮,不显示频率呀?
回复

使用道具 举报

8#
ID:269998 发表于 2018-1-2 09:45 | 只看该作者
很不错
回复

使用道具 举报

9#
ID:266624 发表于 2018-1-2 16:06 | 只看该作者
wdsg 发表于 2017-12-30 19:15
我想问一下,为什么我运行的时候LCD只会亮,不显示频率呀?

你这个问题解决了么
回复

使用道具 举报

10#
ID:266624 发表于 2018-1-2 16:08 | 只看该作者
你好,我根据你的帖子做出了一个频率计,但是液晶屏通电不显示频率,初始化也无法显示
回复

使用道具 举报

11#
ID:266116 发表于 2018-1-3 11:29 | 只看该作者
谢谢分享!下个保存!做个玩玩!
回复

使用道具 举报

12#
ID:268118 发表于 2018-1-15 03:53 | 只看该作者
感謝樓主的分享。
回复

使用道具 举报

13#
ID:268588 发表于 2018-5-14 13:37 | 只看该作者
感谢分享!
回复

使用道具 举报

14#
ID:48413 发表于 2018-5-14 20:56 | 只看该作者
厉害了我的哥
回复

使用道具 举报

15#
ID:289704 发表于 2018-5-27 16:48 | 只看该作者
下载不了,浪费了我好多积分

评分

参与人数 1黑币 +80 收起 理由
admin + 80 已经恢复

查看全部评分

回复

使用道具 举报

16#
ID:338173 发表于 2018-5-28 21:33 | 只看该作者
你们都分享出来,还让学生好好做毕设嘛?都抄袭了
回复

使用道具 举报

17#
ID:343610 发表于 2018-6-2 17:13 | 只看该作者
厉害了
回复

使用道具 举报

18#
ID:345953 发表于 2018-6-6 10:07 | 只看该作者
谢谢分享!下个保存!做个玩玩
回复

使用道具 举报

19#
ID:345953 发表于 2018-6-6 10:08 | 只看该作者
谢谢分享!下个保存!做个玩玩
回复

使用道具 举报

20#
ID:363509 发表于 2018-7-2 21:09 | 只看该作者
感谢分享!!!!
回复

使用道具 举报

21#
ID:364499 发表于 2018-7-6 08:42 | 只看该作者
楼主,我想问一下这个频率计测量范围是多少,怎么样修改为0-999hz
回复

使用道具 举报

22#
ID:365950 发表于 2018-7-6 09:15 | 只看该作者
点击下载点了两次,多花了5黑币,蛋疼。。。
回复

使用道具 举报

23#
ID:433094 发表于 2018-12-23 13:07 | 只看该作者
感谢分享,赞一个
回复

使用道具 举报

24#
ID:453860 发表于 2018-12-24 21:04 | 只看该作者
谢谢分享
回复

使用道具 举报

25#
ID:453860 发表于 2018-12-25 18:03 来自手机 | 只看该作者
非常棒!
回复

使用道具 举报

26#
ID:453860 发表于 2018-12-26 16:51 | 只看该作者
对我很有用
回复

使用道具 举报

27#
ID:412908 发表于 2019-3-28 11:27 | 只看该作者
好详细啊!感激!
回复

使用道具 举报

28#
ID:496720 发表于 2019-10-19 14:34 | 只看该作者
测试范围是多少呢
回复

使用道具 举报

29#
ID:632361 发表于 2019-10-29 22:25 | 只看该作者
感谢分享,不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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