找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机数字频率测量仪设计论文下载

[复制链接]
跳转到指定楼层
楼主
ID:371135 发表于 2018-7-13 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

数字频率测量仪设计

摘要

数字频率计主要应用于计算机、通讯设备、音频视频等科研领域,数字频率计是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本 功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,显示直观,所以经常要用到数字频率计。

频率测量中直接测量的数字频率计主要由四个部分构成:时基(T)电路、输入 电路、计数显示电路以及控制电路。在一个测量周期过程中,被测周期信号在输入电路中经过放大、整形、微分操作之后形成方波信号,加到与非门的另一个输入端上.该与非门起到主阀门的作用,在与非门第二个人输入端上加阀门控制信号,控制信号为低电平时阀门关闭,无信号进入计数器;控制信号为高电频时,阀门开启整形后的信号进入计数器,若阀门控制信号取1s,则在阀门时间1s内计数器得到的脉冲数N就是被测信号的频率。

在普通的电子测量仪器中,示波器在进行频率测量时测量精度较低,误差较大。 频谱仪可以准确的测量频率并显示被测信号的频谱,但测量速度较慢,无法实时快速的跟踪捕捉到被测信号频率的变化。正是由于频率计能够快速准确的捕捉到被测信号频率的变化,因此,频率计拥有非常广泛的应用范围。

在此次的课程设计中我们将用51单片机来设计数字频率计。

一:单片机和频率计的研究现状
1.单片机系统的研究现状
在我国,单片机的推广、普及、开发应用已经经过十多个年头,在此期间也涌现出了不少单片机的专家和技术成果,使我国在单片机技术应用方面获得了长足的进步。由于我国单片机发展起步晚,尽管单片机的品种很多,但是在我国使用较为广泛的是Intel公司的MCS-51单片机系列。近年来32位单片机已进入实用阶段。也向多功能、高性能、高速度、低电压、低功耗、低价格、外围电路内装化及片内存储容量增加的方向发展。
2.频率计的研究现状
    频率测量是电子学测量中最为基本的测量之一。由于频率信号抗干扰性强,易于传输,因此可以获得较高的测量精度。随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,测频原理和测频方法的研究正受到越来越多的关注。
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号、方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。传统的频率计采用测频法测量频率,通常由组合电路和时序电路等大量的硬件电路组成,产品不但体积大,运行速度慢而且测量低频信号不准确。本次采用单片机技术设计一种数字显示的频率计,测量准确度高,响应速度快,体积小等优点。
国际国内通用数字频率计的主要技术参数:1.频率测量范围:电子计数器的测频范围,低端大部分从10Hz开始;高端则以不同型号的频率计而异。因此高端频率是确定低、中、高速计数器的依据。如果装配相应型号的变频器,各种类型的数字频率计的测量上限频率,可扩展十倍甚至几十倍。2.周期测量范围:数字频率计最大的测量周期,一般为10s,可测周期的最小时间,依不同类型的频率计而定。对于低速通用计数器最小时间为1ys;对中速通用计数器可小到0.1ys。3.晶体振荡器的频率稳定度:是决定频率计测量误差的一个重要指标。可用频率准确度、日波动、时基稳定度、秒级频率稳定度等指标,来描述晶体振荡器的性能。4.输入灵敏度:输入灵敏度是指在侧频范围内能保证正常工作的最小输入电压。目前通用计数器一般都设计二个输入通道,即d通道和月通道。对于4通道来说,灵敏度大多为50mV。灵敏度高的数字频率计可达30mV、20mV。5.输入阻抗:输入阻抗由输入电阻和输入电容两部分组成。输入阻抗可分为高阻(1M//25PF、500k//30PF)和低阻(50)。一般说来,低速通用计数器应设计成高阻输入;中速通用计数器,测频范围最高端低于100MHz,仍设计为高阻输入;对于高速通用计数器,测频>100MHz, 设计成低阻 (50Q) 输入,测频<100MHz,设计成高阻(500k//30PF)输入。

二:硬件电路设计
1.单片机周边电路框图以及电路设计
    在设计电路的过程中,涉及整体电路设计时,倘若能将整体电路分割为几部分别设计,就会使思路变得清晰,效率会大大提高。本系统被分为:同步门逻辑控制电路、AT89C52、时钟脉冲电路、显示电路。
    在本系统中,等精度测量硬件电路需要一个标准频率信号。选择了单片机添加的晶振电路来产生。需要的启计信号和清零信号由单片机AT89C51来产生。

   




  • 管脚说明
    AT89C52管脚图

                  


P0口:P0 口是一组8 位漏极开路型双向I/O 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个TTL逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:P1 是一个带内部上拉电阻的8 位双向I/O 口, P1 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51 不同之处是,P1.0 和P1.1 还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),
P2口:P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16 位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX @RI 指令)时,P2 口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3 口将用上拉电阻输出电流(IIL)。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能P3 口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:复位输入。当振荡器工作时,RST引脚出现两个机器存储以上高电平将使单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址存储允许)输出脉冲用于锁存地址的低8 位字节。一般情况下,ALE 仍以时钟振荡频率的1/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE 脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能存储器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。该位置位后,只有一条MOVX 和MOVC指令才能将ALE 激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE 禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52 由外部程序存储器取指令(或数据)时,每个机器存储两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许。欲使CPU 仅访问外部程序存储(地址为0000H—FFFFH),EA 端必须保持低电平(接地)。需注意的是:如果加密位LB1 被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU 则执行内部程序存储中的指令。Flash存储编程时,该引脚加上+12V 的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。

  • 时钟脉冲电路

时钟脉冲电路的主要作用是对外发出时序控制信号,在AT89C52芯片上,XTAL1和XTAL2分别为反向放大器的输入和输出,其中,当与本试验线路相同时,即使用内部时钟方式时,XTAL1和XTAL2必须外接石英晶体和微调电容,其中电容C1、C2对振荡频率起稳定的作用,振荡频率应在1.2MHz——12MHz。该反向放大器可以配置为片内振荡器。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。产生的时钟信号送至单片机内部的各个部分,时钟频率越高,单片机控制器的节拍越快,运算速度也越快。
时钟电路可以简单定义如下:
(1).就是产生象时钟一样准确的振荡电路;
(2).任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。
时钟电路一般由晶体振荡器、晶震控制芯片和电容组成。时钟电路应用十分广泛,如电脑的时钟电路、电子表的时钟电路以及MP3MP4的时钟电路。如图3-5所示。      
4.同步门逻辑控制电

同步门逻辑控制电路由D触发器构成,由它来产生同步门信号Ts。在测试开始后,利用单片机的P1.7作为预置门信号Ts的输出线。当P1.7=1时,在被测信号的上升沿作用下D触发器的输出Q=1,使得单片机的INT0和INT1同时为1,启动单片机内部的定时/计数器开始工作。其中,T0对被测信号的输出Q仍然为1,因此两个计数器并不停止计数,直到随后而至的待测信号的上升沿到来时,才使得D触发器的输出为0,同步门关闭,两个计数器才同时停止计数。

5.静态显示电路

显示电路是六位数码管的静态显示电路。静态显示:各个数码管在现实过程中持续得到送显信号,与各数码管接口的I/O口线是专用的。静态电路显示特点:无闪烁,用元器件多,占I/O线多,无须扫描,节省CPU时间,编程简单。单片机系统扩展LED数码管时多用共阳LED:共阳数码管每个段笔画是用低电平(“0”)点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平(“0”)点亮的,要求驱动功率较大。通常每个段笔画要串一个数百欧姆的降压电阻。



原理图:


  1. <font color="rgb(0, 0, 0)">#include<reg51.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. /****************定时器设置相关的变量***********************/
  6. unsigned char TL0_temp;              /*暂存TL0的初值*/
  7. unsigned char TH0_temp;              /*暂存TH0的初值*/
  8. #define INT_CLOCK 5 /*INT_CLOCK为定时值,单位为ms ,此处定义为5ms*/
  9. #define CRY_FREQUENCY 12000000 /*CRY_FREQUENCY为晶振频率,单位为Hz*/

  10. uchar T0count;
  11. uchar timecount;
  12. bit flag;
  13. uint x;







  14. ////////////////////
  15. /***数码管位选定义*****/
  16. sbit w3 = P2^2;
  17. sbit w4 = P2^3;
  18. sbit w1 = P2^0;
  19. sbit w2 = P2^1;
  20. sbit w5 = P2^4;
  21. sbit w6 = P2^5;



  22.                                                          




  23. /////共阴数码管段选//////////////////////////////////////////////
  24. uchar table[22]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0XF6,0X38};


  25.                                                                        



  26. /*******************************************
  27. 定时器0初始化函数
  28. /******************************************/
  29. void Timer0_init()
  30. {
  31.               unsigned long T0_temp;                                     /*暂存T0的初始值              */
  32.               T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
  33.               TL0_temp = T0_temp & 0xff;
  34.               TH0_temp = T0_temp >> 8;
  35.               TL0 = TL0_temp;
  36.               TH0 = TH0_temp;
  37.               TMOD |= 0x01;
  38.               TR0 = 1;
  39.               ET0 = 1;                                                  /*开定时器0中断*/

  40. }

  41. /************************
  42. 12M晶振下,延时1MS的函数
  43. ***********************/
  44. void delay(uint ms)
  45. {
  46.               uchar x;
  47.               for(ms;ms>0;ms--)
  48.                             for(x=110;x>0;x--);
  49. }








  50. void display()//显示函数
  51. {
  52.             

  53.                  
  54.                                           w1=0;P0=table[x/100000];delay(5);//第1位显示数据            
  55.                                           P0=0x00;w1=1;delay(1);//关闭显示消除动态扫描阴影
  56.                                           w2=0;P0=table[(x%100000)/10000];delay(5);//第2位显示数据
  57.                                           P0=0x00;w2=1;delay(1);//关闭显示消除动态扫描阴影
  58.                                           w3=0;P0=table[((x%10000)/1000)];delay(5);//第3位显示数据
  59.                                           P0=0x00;w3=1;delay(1);//关闭显示消除动态扫描阴影
  60.                                           w4=0;P0=table[(((x%1000)/100))];delay(5);//第4位显示数据
  61.                                           P0=0x00;w4=1;delay(1);//关闭显示消除动态扫描阴影
  62.                                           w5=0;P0=table[((x%100)/10)];delay(5);//第4位显示数据
  63.                                           P0=0x00;w5=1;delay(1);//关闭显示消除动态扫描阴影
  64.                                           w6=0;P0=table[(x%10)];delay(5);//第4位显示数据
  65.                                           P0=0x00;w6=1;delay(1);//关闭显示消除动态扫描阴影
  66.             
  67.             




  68. }





  69. void main()
  70. {
  71.               uchar i;
  72.             
  73.               TMOD=0x15;
  74.                 TH0=0;
  75.                 TL0=0;
  76.                 TH1=(65536-49989)/256;
  77.                 TL1=(65536-49989)%256;
  78.                 TR1=1;
  79.                 ET0=1;
  80.                 ET1=1;
  81.                 EA=1;
  82.                 TR0=1;



  83.               while(1)
  84.               {
  85.                             /******每隔一秒钟计算脉冲数****/
  86.                             display();
  87.                             if(flag==1)
  88.                      {
  89.                        flag = 0;
  90.                        x=(T0count*65536+TH0*256+TL0);
  91.                        timecount=0;
  92.                        T0count=0;               /****T0count清零,准备下一秒的计数***/
  93.                        TH0=0;                                                                                                                                                                                      
  94.                        TL0=0;
  95.                        TR0=1;
  96.                                          
  97.                      }
  98.             
  99.               }


  100. }


  101. void t0(void) interrupt 1 using 0              //计脉冲个数
  102. {
  103. ……………………

  104. …………限于本文篇幅 余下代码请从51黑下载附件…………
  105. </font>
复制代码

完整的Word格式文档51黑下载地址:
论文.zip (112.01 KB, 下载次数: 17)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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