找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9341|回复: 7
收起左侧

基于Proteus的数字频率计设计资料(PCB+仿真+单片机源码+电路图)

[复制链接]
ID:323670 发表于 2018-5-6 19:18 | 显示全部楼层 |阅读模式
分享分享
数字频率计电路原理图如下:
0.png

Altium Designer画的数字频率计原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

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

论文目录:
目录
前  言    1
第一章  总体设计方案    2
1.1 总设计框图    2
1.2 硬件设计分析    2
1.2.1 电源的设计    2
(4):LCD1602的指令说明及时序    10
(5): LCD1602的RAM地址映射及标准字库表    13
第二章  软件设计与分析    15
2.1 软件设计的组成    15
2.2  各部分软件分析    15
2.2.1  定时器0中断子函数    15
2.2.2  定时器1中断子函数    15
2.2.3  主函数    16
2.3  总源程序    18
第三章  软件介绍    28
3.1 PROTEUS简介    28
3.2 PROTEL 99 SE简介    29
3.2.1 电路工程设计部分    29
3.2.2 电路仿真与PLD部分    30
3.3 Protel 99 SE的功能特性    30
3.4 Protel99SE快捷键大全    30
3.6仿真图    36
3.7原理图    37
第四章  减小误差措施及扩展方面    39
4.1减小误差措施    39
4.2扩展方面    39
(1)预处理电路部分    39
(2)增加电源部分    39
4.3 功能上的完善    40
4.3.1 增加键盘控制    40
4.3.2 实现自动量程转换    40
4.3.3 液晶显示器(LCD)进行数据的显示    41
总结    42
致谢词    43
参考文献    44

单片机数字频率计源程序如下:
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. #include<intrins.h>
  4. typedef unsigned char uchar;
  5. typedef unsigned int  uint;
  6. sbit RS=P2^5;
  7. sbit RW=P2^6;
  8. sbit E=P2^7;
  9. sbit CLK=P2^0;
  10. sbit DO=P2^1;
  11. sbit DI=P2^1;
  12. sbit CS=P2^2;
  13. sbit CLR=P3^0;
  14. sbit GATE=P3^1;
  15. sbit K1=P3^7;
  16. uint  num=0;
  17. uint  c=0;
  18. float d=0;
  19. uchar e=1,f=1;
  20. unsigned long int aaa=0,bbb=0;
  21. uchar LCD_wait()//LCD1602内部等待函数
  22. {
  23.         RS=0;
  24.         RW=1;       
  25.         _nop_();
  26.         E=1;
  27.         _nop_();
  28.         E=0;
  29.         return P0;               
  30. }
  31. void LCD_write(bit aa,uchar bb)//向LCD写入命令或数据
  32. {
  33.         E=0;
  34.         RS=aa;
  35.         RW=0;               
  36.         _nop_();
  37.         P0=bb;       
  38.         _nop_();//注意顺序
  39.         E=1;               
  40.         _nop_();//注意顺序
  41.         E=0;               
  42.         _nop_();
  43.         LCD_wait();//LCD1602内部等待函数       
  44. }
  45. void LCD_display(uchar temp)
  46. {
  47.         LCD_write(0,0x08|temp);       
  48. }
  49. void LCD_input(uchar cc)
  50. {
  51.         LCD_write(0,0x04|cc);
  52. }
  53. void LCD_init()//初始化LCD
  54. {
  55.         //RW=0;
  56.         LCD_write(0,0x38);//8位数据端口,2行显示,5*7点阵
  57.         LCD_write(0,0x38);
  58.        
  59.         LCD_write(0,0x0C);//开启显示, 无光标
  60.         LCD_write(0,0x01);//清屏
  61.         LCD_write(0,0x0C);//AC递增,画面不动
  62.        
  63. }
  64. void LCD_sfj1(uchar x,uchar y)
  65. {
  66.         if(y==0)
  67.                 LCD_write(0,0x80|x);
  68.         if(y==1)
  69.                 LCD_write(0,0x80|(x-0x40));
  70. }
  71. void LCD_print(uchar *p)
  72. {
  73.         while(*p!='\0')
  74.         {
  75.                 LCD_write(1,*p);
  76.                 p++;
  77.         }
  78. }
  79. void delay1(uchar x)//ms延时子函数
  80. {                   
  81.     uchar i;
  82.     for(i=0;i<x;i++); //延时,脉冲一位持续的时间
  83. }
  84. uchar start(bit temp) //把模拟电压值转换成8位二进制数并返回,dat为通道选择。
  85. {          
  86.         uchar i,aa=0;
  87.     CS=0;
  88.     DO=0;//片选,DO为高阻态
  89.     delay1(10);
  90.     CLK=0;
  91.     delay1(2);
  92.     DI=1;         
  93.     CLK=1;         
  94.     delay1(2);//第一个脉冲,起始位
  95.     CLK=0;                                          
  96.     delay1(2);                                          
  97.     DI=1;                                          
  98.     CLK=1;                                          
  99.     delay1(2);//第二个脉冲,DI=1表示双通道单极性输入         
  100.     CLK=0;                                                                                 
  101.     delay1(2);                                                                                 
  102.     DI=temp;        /*******************************/                                                                                         
  103.     CLK=1;
  104.     delay1(2);//第三个脉冲,DI=1表示选择通道1(CH2)          
  105.     DI=0;                                                                                  
  106.     DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备
  107.     CLK=1;                                                                                                                                                                                    
  108.     delay1(2);                                                                          
  109.     CLK=0;                                                                          
  110.     delay1(2);//经实验,这里加一个脉冲AD便能正确读出数据,
  111.         //不加的话读出的数据少一位(最低位d0读不出)                  
  112.         for(i=0;i<8;i++)                                                                          
  113.     {
  114.             CLK=1;
  115.                delay1(2);
  116.                CLK=0;
  117.                delay1(2);
  118.                aa=(aa<<1)|DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
  119.         }
  120.     CS=1;//取消片选,一个转换周期结束
  121.     return(aa);//把转换结果返回
  122. }
  123. uint fenjie(bit cc)
  124. {
  125.         uchar dd;
  126.         uint  ee;
  127.         dd=start(cc);
  128.         ee=(uint)dd*100/51; //51是由5/255的倒数得来的,5是5V,255是8位AD。
  129.         return(ee);
  130. }       
  131. void delay2(uint z)//按键消抖
  132. {
  133.         uint x;
  134.         uchar y;
  135.         for(x=0;x<z;x++)
  136.                 for(y=0;y<110;y++);
  137. }
  138. void delay3()//1s延时子函数            
  139. {
  140.         uchar h,i,j,k;
  141.         for(h=5;h>0;h--)
  142.                 for(i=4;i>0;i--)
  143.                         for(j=116;j>0;j--)
  144.                                 for(k=214;k>0;k--);
  145. }
  146. //定时计数初始化
  147. void init()             
  148. {
  149.         TMOD=0x25;                                // T0计数,T1定时
  150.         TH0=0x00;       
  151.         TL0=0x00;
  152.         TH1=0x06;
  153.         TL1=0x06;
  154.         CLR=1;
  155.         CLR=0;
  156.         GATE=0;
  157.         GATE=1;
  158.         ET0=1;
  159.         ET1=1;
  160.         EA=1;
  161.         TR0=1;
  162.         TR1=1;
  163. }
  164. void main()//主函数
  165. {         
  166.         unsigned long a=0;
  167.         bit b=0;
  168.         uchar tab[10];
  169.         uint temp=0;
  170.         LCD_init();
  171.         init();
  172.         LCD_sfj1(0,0);
  173.         LCD_print("Welcome to use ");
  174.         LCD_sfj1(0,1);
  175.         LCD_print("Please Wating...");
  176.         delay3();
  177.         LCD_write(0,0x01);
  178.         while(1)
  179.         {
  180.                 if(K1==0)
  181.                 {       
  182.                         delay2(10);
  183.                         if(K1==0)       
  184.                         {
  185.                                 while(K1==0);
  186.                                 b=~b;
  187.                                 LCD_write(0,0x01);
  188.                         }
  189.                 }
  190.                 temp=fenjie(0);
  191.                 if(temp>c)
  192.                 c=temp;
  193.                 if(temp>c>>3&&temp<c>>1)
  194.                         f=0;
  195.                 if(b==0)
  196.                 {
  197.                         a=(aaa*256)+bbb;
  198.                         if(a==0)
  199.                         {
  200.                                 LCD_sfj1(0,0);
  201.                                 LCD_print("F= 0000000000 Hz");       
  202.                                 LCD_sfj1(0,1);
  203.                                 LCD_print("F= 0000000000 Hz");        
  204.                         }
  205.                         else
  206.                         {               
  207.                                 LCD_sfj1(0,0);
  208.                                 LCD_print("F=            Hz");
  209.                                 sprintf(tab,"%ld",a);
  210.                                 LCD_sfj1(2,0);
  211.                                 LCD_print(tab);
  212.                                 LCD_sfj1(0,1);
  213.                                 LCD_print("P=            ms");
  214.                                 sprintf(tab,"%0.6f",1000.0/a);
  215.                                 LCD_sfj1(2,1);
  216.                                 LCD_print(tab);       
  217.                         }
  218.                 }
  219.                 else
  220.                 {   
  221.                         sprintf(tab,"%bd",e);
  222.                         LCD_sfj1(0,0);
  223.                         LCD_print(tab);
  224.                         sprintf(tab,"Upp=%0.3fV",d);
  225.                         LCD_sfj1(0,1);
  226.                         LCD_print(tab);
  227.                 }
  228.         }
  229. }
  230. void t0() interrupt 1 using 1
  231. {

  232. }
  233. void t1() interrupt 3 using 3//定时器T1中断服务程序
  234. {          
  235.         if(num==3999)
  236.         {
  237.                 GATE=0;
  238.                 TR0=0;
  239.                 TR1=0;
  240.                 aaa=TH0*256+TL0;
  241.                 bbb=P1;
  242.                 d=c/100.0;
  243.                 c=0;
  244.                 e=f;
  245.                 f=1;
  246.                 CLR=1;
  247.                 CLR=0;
  248. ……………………

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

所有资料51hei提供下载:
数字频率计.zip (984.6 KB, 下载次数: 221)
回复

使用道具 举报

ID:361699 发表于 2018-7-4 21:40 | 显示全部楼层
大佬,你的程序在keil里打开时候显示有两处警告,仿真运行不了啊
回复

使用道具 举报

ID:370518 发表于 2018-7-14 16:39 | 显示全部楼层
仿真里只有一种波形可以识别,什么情况?
回复

使用道具 举报

ID:613683 发表于 2019-9-19 17:01 | 显示全部楼层
值得学习借鉴
回复

使用道具 举报

ID:612180 发表于 2019-9-20 10:43 | 显示全部楼层
不过现在protell不常用了,现在都是用AD了
回复

使用道具 举报

ID:656668 发表于 2019-12-22 21:58 来自手机 | 显示全部楼层
这个测量范围是多大
回复

使用道具 举报

ID:782711 发表于 2020-6-18 00:57 | 显示全部楼层
值得学习借鉴
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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