资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
-基于51单片机的数字频率计一、 实验内容1.1数字频率计概述数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。本数字频率计将采用定时、计数的方法测量频率,采用四位LED数码管动态显示4位数。测量*围从1Hz10kHz的正弦波、方波、三角波。用单片机实现自动测量功能。1.2频率测量仪的设计思路与频率的计算频率测量仪的设计思路主要是:设置单片机T1为计数器模式,对输入信号进行计数,T0设置为定时器模式,定时时间为1秒,则计数器所计数值即为被测信号频率。1.3 基本设计原理基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以在单位时间内对被测信号上升沿计数的方法对正弦波、方波、三角波的频率进行自动的测量。如果被测信号频率超过量程,则有警报灯闪烁。所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。1.4 频率计性能参数设计量程:0-10KHz波形:方波输入信号电压:5V二、数字频率计的硬件结构设计2.1 系统硬件的构成本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有电源电路、复位电路、显示器,报警电路等器件,如下图所示:数码管显示数码管驱动电路电源电路单片机按键电路报警电路图一数字频率计功能模块2.2 AT89C51单片机引脚说明在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合数码管,发光二极管,按键开关构成控制及显示模块。在试验中选用P1.2,P1.3,P1.4端口分别控制数据和时钟信号的输入实现频率的动态显示。P口引脚外接发光二极管作为报警电路。P3.5引脚作为被测信号的输入引脚。2.3 数码管显示电路本实验使用四位共阳极数码管,使用两片74HC595作为数码管驱动通过P1.2,P1.3,P1.4端口分别控制数据和时钟信号的输入实现频率的动态显示。三、实验原理图图二数码管电路图三数码管驱动电路图五超量程报警电路图六单片机及复位电路四、实验记录(1)程序设计调试过程记录本次实验的程序框架都在实验的预习和准备中完成,其中包括延时函数编写,显示函数编写,定时器0初值计算,频率值的计算,定时器计数器的初始化和中断服务程序的编写。但是由于预习和设计时针对的数码管硬件连接方式不同,在预习时针对的数码管为74HC245和74HC138两个芯片控制一组四位共阳极数码管的动态显示,其中74HC245控制数码管显示的数值,74HC138控制数码管显示位数,这种硬件连接方式的驱动程序编写较为简单,但缺点是需要占用单片机两组I/O口,使得单片机利用率降低。而实验所用的开发板也带有两组四位共阳极数码管,但他们是由两块74HC595控制,只需要用三个I/O口即可实现8位数码管的显示控制,大大提高了单片机端口的利用率,但程序编写较为复杂,且需要进行时序控制,逻辑也较为复杂。在这次试验中,该显示程序的编写和调试占用了很多时间。在进行定时器模块设计时,由于定时时间较长,所以采用了方式1(16位计数器),将一次循环时间定为50ms,循环20次即为1s的时间。由于定时器0的工作方式一需要重装初值,因此在多次循环后会导致定时时间不准确,这会使最后计算得到的频率值产生误差,且频率越高误差越大(实验记录数据会在后边给出)。(2)实验数据记录输入波形:方波;输入信号幅值:5V;序号输入频率/Hz测量频率/Hz绝对误差/Hz相对误差110100025050003100110100.14200220200.15300330300.16400440400.17500550500.18600660600.19700770700.110800880800.111900990900.112100011001000.113150016501500.114200022002000.115250027502500.116300033003000.117500055005000.118800088008000.119900099009000.1(3)误差分析经过测量,发现测量频率与输入频率之间有较为明显的误差,且随着测量信号频率的升高绝对误差随之增大但相对误差基本不变,且由于误差的产生,频率只能测量到9K左右并不能达到预计量程。经过对程序的分析发现误差的主要来源为定时器定时不准确造成的。在实验设计时考虑到定时时间较长,所以选择了定时器0的工作方式1,其最大定时时间为65ms,故实验中选择一次定时50ms,循环20次以达到1s的准确定时,但由于多次重装初值,使实际定时时间大于1s。但是由于定时时间已经确定所以设实际定时时间为T0,输入信号频率为f0,则绝对误差为E有E=f0*(T0-1)Hz相对误差为Er有Er=E/f0=(T0-1)由于T0为定值,所以相对误差Er为一定值,且由上边记录数据可算出实际定时是时间T0为1.1s(4)解决方法方法一:通过调整定时器0初值,多次测量校准可以达到1s的准确定时,从而提高频率测量精度。方法二:改变定时器工作方式,有方式1改为方式2(自动重装初值),方式二由于可以自动重装初值可以减少方式1中重装初值所附加的时间,实现更加准确地定时。五、修改后的程序框图六、总结通过这次实验我加深了对51单片机的了解,对单片机的定时器,计数器,中断系统,I/O口等有了更加直观的认识。最初选题时对数字频率计还不是很了解,但通过查找相关资料及和同学讨论逐渐清楚了频率计的工作原理,也对各个组成部分的电路有了大致的了解,最终确定了选题完成了预习报告的撰写。虽然事先准备的比较充分,但实验过程中仍然遇到了很多问题,例如不同芯片驱动的数码管驱动程序需要重新编写,还要添加按键,发光二极管等外部设备。但最终通过查找资料及与同学交流顺利解决了这些问题最终顺利完成了本次实验。通过这次完整的实验设计和具体实践,让我学会了从系统的高度来考虑设计电路的各个模块,对电路的设计研究有了更加深刻的体会;同时我也感受到了用软件进行电路设计和仿真对实际电路设计有很重要的指导意义和参考价值。在这次试验中不仅要对单片机的功能,性能,引脚定义和内部结构也有较为详细的了解;此外对电路板中所用到的电源转换芯片,数字电路的各种驱动芯片的引脚和功能,可编程器件的驱动程序等有很好地认识;在程序设计过程中要注意进行模块化的程序设计,逐个模块进行调试不仅会使程序逻辑更加清晰,也会加快程序调试进程。以上是我对这次实验的感受。七、*include /-/ 函数原形定义*define uchar unsigned char*define uint unsigned intvoid main (void);/ 主函数void LED4_Display (void);/ LED显示void LED_OUT(uchar *);/ LED单字节串行移位函数unsigned char code LED_0F;/ LED字模表sbit DIO = P12;/串行数据输入sbit RCLK = P13;/时钟脉冲信号上升沿有效sbit SCLK = P14; /打入信号上升沿有效/-/ 全局变量uchar LED8;/用于LED的8位显示缓存uint ff; /接受频率值uchar start=1; /定时器,计数模式启动变量unsigned char code LED_0F = / 0 1 2 34 5 6 78 9 A bC d E F -0*C0,0*F9,0*A4,0*B0,0*99,0*92,0*82,0*F8,0*80,0*90,0*8C,0*BF,0*C6,0*A1,0*86,0*FF,0*bf;/-void delay(k) /延时函数while(k-);void Delay_ms(uint time) /延时函数uint i,j;for(i=time;i0;i-)for(j=125;j0;j-);void LED4_Display (void) /显示函数unsigned char code *led_table; / 查表指针uchar i;/显示第1位led_table = LED_0F + LED1;i = *led_table;LED_OUT(0*04);LED_OUT(i);RCLK = 0;RCLK = 1;/显示第2位led_table = LED_0F + LED2;i = *led_table;LED_OUT(0*08);LED_OUT(i);RCLK = 0;RCLK = 1;/显示第3位led_table = LED_0F + LED3;i = *led_table;LED_OUT(0*01);LED_OUT(i);RCLK = 0;RCLK = 1;/显示第4位led_table = LED_0F + LED4;i = *led_table;LED_OUT(0*02);LED_OUT(i);RCLK = 0;RCLK = 1;void LED_OUT(uchar *)/输出函数uchar i;for(i=8;i=1;i-)if (*&0*80) DIO=1; else DIO=0;*=1;SCLK = 0;SCLK = 1;void time0_init() /定时器初始化(TIMER0)TMOD|=0*01; /定时器0 定时模式计数*围65536T
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号