1、波形:方波输入信号电压:5V二、数字频率计的硬件构造设计2.1 系统硬件的构成本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有电源电路、复位电路、显示器,报警电路等器件,如下列图所示:图一数字频率计功能模块2.2 AT89C51单片机引脚说明在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合数码管,发光二极管,按键开关构成控制及显示模块。在试验中选用P1.2,P1.3,P1.4端口分别控制数据和时钟信号的输入实现频率的动态显示。P口引脚外接发光二极管作为报警电路。P3.5引脚作为被测信号的输入引脚。2.3 数码
2、管显示电路本实验使用四位共阳极数码管,使用两片74HC595作为数码管驱动通过P1.2,P1.3,P1.4端口分别控制数据和时钟信号的输入实现频率的动态显示。三、实验原理图图二数码管电路图三数码管驱动电路图五超量程报警电路图六单片机及复位电路四、实验记录1程序设计调试过程记录本次实验的程序框架都在实验的预习和准备中完成,其中包括延时函数编写,显示函数编写,定时器0初值计算,频率值的计算,定时器计数器的初始化和中断效劳程序的编写。但是由于预习和设计时针对的数码管硬件连接方式不同,在预习时针对的数码管为74HC245和74HC138两个芯片控制一组四位共阳极数码管的动态显示,其中74HC245控制
3、数码管显示的数值,74HC138控制数码管显示位数,这种硬件连接方式的驱动程序编写较为简单,但缺点是需要占用单片机两组I/O口,使得单片机利用率降低。而实验所用的开发板也带有两组四位共阳极数码管,但他们是由两块74HC595控制,只需要用三个I/O口即可实现8位数码管的显示控制,大大提高了单片机端口的利用率,但程序编写较为复杂,且需要进展时序控制,逻辑也较为复杂。在这次试验中,该显示程序的编写和调试占用了很多时间。在进展定时器模块设计时,由于定时时间较长,所以采用了方式116位计数器,将一次循环时间定为50ms,循环20次即为1s的时间。由于定时器0的工作方式一需要重装初值,因此在屡次循环后会
4、导致定时时间不准确,这会使最后计算得到的频率值产生误差,且频率越高误差越大实验记录数据会在后边给出。2实验数据记录输入波形:方波; 输入信号幅值:5V;序号输入频率/Hz测量频率/Hz绝对误差/Hz相对误差11025031001100.14200220205300330306400440407500550860066060970077070800880801190099090121000110013150016501501420002200152500275025016300033001750005500188000880019900099003误差分析经过测量,发现测量频率与输入频率之间有较
5、为明显的误差,且随着测量信号频率的升高绝对误差随之增大但相对误差根本不变,且由于误差的产生,频率只能测量到9K左右并不能到达预计量程。经过对程序的分析发现误差的主要来源为定时器定时不准确造成的。在实验设计时考虑到定时时间较长,所以选择了定时器0的工作方式1,其最大定时时间为65ms,故实验中选择一次定时50ms,循环20次以到达1s的准确定时,但由于屡次重装初值,使实际定时时间大于1s。但是由于定时时间已经确定所以设实际定时时间为T0,输入信号频率为f0,那么绝对误差为E有E=f0*(T0-1)Hz相对误差为ErEr=E/f0=(T0-1)由于T0为定值,所以相对误差Er为一定值,且由上边记录
6、数据可算出实际定时是时间T0为1.1s4解决方法方法一:通过调整定时器0初值,屡次测量校准可以到达1s的准确定时,从而提高频率测量精度。方法二:改变定时器工作方式,有方式1改为方式2自动重装初值,方式二由于可以自动重装初值可以减少方式1中重装初值所附加的时间,实现更加准确地定时。五、修改后的程序框图六、总结通过这次实验我加深了对51单片机的了解,对单片机的定时器,计数器,中断系统,I/O口等有了更加直观的认识。最初选题时对数字频率计还不是很了解,但通过查找相关资料及和同学讨论逐渐清楚了频率计的工作原理,也对各个组成局部的电路有了大致的了解,最终确定了选题完成了预习报告的撰写。虽然事先准备的比拟
7、充分,但实验过程中仍然遇到了很多问题,例如不同芯片驱动的数码管驱动程序需要重新编写,还要添加按键,发光二极管等外部设备。但最终通过查找资料及与同学交流顺利解决了这些问题最终顺利完成了本次实验。通过这次完整的实验设计和具体实践,让我学会了从系统的高度来考虑设计电路的各个模块,对电路的设计研究有了更加深刻的体会;同时我也感受到了用软件进展电路设计和仿真对实际电路设计有很重要的指导意义和参考价值。在这次试验中不仅要对单片机的功能,性能,引脚定义和内部构造也有较为详细的了解;此外对电路板中所用到的电源转换芯片,数字电路的各种驱动芯片的引脚和功能,可编程器件的驱动程序等有很好地认识;在程序设计过程中要注
8、意进展模块化的程序设计,逐个模块进展调试不仅会使程序逻辑更加清晰,也会加快程序调试进程。以上是我对这次实验的感受。七、附件#include /-/ 函数原形定义#define uchar unsigned char#define uint unsigned intvoid main (void); / 主函数void LED4_Display (void); / LED显示void LED_OUT(uchar X); / LED单字节串行移位函数unsigned char code LED_0F; / LED字模表sbit DIO = P12; /串行数据输入sbit RCLK = P13;
9、/时钟脉冲信号上升沿有效sbit SCLK = P14; /打入信号上升沿有效/-/ 全局变量uchar LED8; /用于LED的8位显示缓存uint ff; /承受频率值uchar start=1; /定时器,计数模式启动变量unsigned char code LED_0F = / 0 1 2 3 4 5 6 7 8 9 A b C d E F - 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf;void delay(k) /延时函数while(k-);void De
10、lay_ms(uint time) /延时函数uint i,j; for(i=time;i0;i-) for(j=125;jj-);void LED4_Display (void) /显示函数unsigned char code *led_table; / 查表指针uchar i; /显示第1位led_table = LED_0F + LED1; i = *led_table; LED_OUT(0x04); LED_OUT(i); RCLK = 0; RCLK = 1;/显示第2位led_table = LED_0F + LED2; LED_OUT(0x08);/显示第3位led_table = LED_0F + LED3; LED_OUT(0x01);/显示第4位led_table = LED_0F + LED4; LED_OUT(0x02);void LED_OUT(uchar X) /输出函数 for(i=8;=1; if (X&0x80) DIO=1; else DIO=0;X SCLK = 0; SCLK = 1; void time0_init() /定时器初始化TIMER0TMOD|=0x01; /定时器0 定时模式计数X围65536 TH0=0x3c; /定时初值50ms TL0=0x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1