基于51单片机的数字频率计设计 下载本文

内容发布更新时间 : 2024/6/16 21:56:25星期一 下面是文章的全部内容请认真阅读。

.

19 (3)误差分析

9000 9900 900 0.1 经过测量,发现测量频率与输入频率之间有较为明显的误差,且随着测量信号频率的升高绝对误差随之增大但相对误差基本不变,且由于误差的产生,频率只能测量到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中重装初值所附加的时间,实现更加准确地定时。

.

.

五、修改后的程序框图

.

.

开始Y定时器初始化计数器初始化复位按键是否按下N开启对应中断使发光二极管闪烁预警等待信号输入进入定时器1中断程序输入信号频率是否超量程YN进入定时器中断服务程序计算输入信号频率值将计算出的频率值返回主程序调用显示函数.

.

六、总结

通过这次实验我加深了对51单片机的了解,对单片机的定时器,计数器,中

断系统,I/O口等有了更加直观的认识。最初选题时对数字频率计还不是很了解,但通过查找相关资料及和同学讨论逐渐清楚了频率计的工作原理,也对各个组成部分的电路有了大致的了解,最终确定了选题完成了预习报告的撰写。虽然事先准备的比较充分,但实验过程中仍然遇到了很多问题,例如不同芯片驱动的数码管驱动程序需要重新编写,还要添加按键,发光二极管等外部设备。但最终通过查找资料及与同学交流顺利解决了这些问题最终顺利完成了本次实验。 通过这次完整的实验设计和具体实践,让我学会了从系统的高度来考虑设计电路的各个模块,对电路的设计研究有了更加深刻的体会;同时我也感受到了用软件进行电路设计和仿真对实际电路设计有很重要的指导意义和参考价值。 在这次试验中不仅要对单片机的功能,性能,引脚定义和内部结构也有较为详细的了解;此外对电路板中所用到的电源转换芯片,数字电路的各种驱动芯片的引脚和功能,可编程器件的驱动程序等有很好地认识;在程序设计过程中要注意进行模块化的程序设计,逐个模块进行调试不仅会使程序逻辑更加清晰,也会加快程序调试进程。以上是我对这次实验的感受。

.

.

七、附件

#include

//-----------------------------------------------------------------------------

// 函数原形定义

#define uchar unsigned char #define uint unsigned int

void main (void); // 主函数 void LED4_Display (void); // LED显示

void LED_OUT(uchar X); // LED单字节串行移位函数 unsigned char code LED_0F[]; // LED字模表

sbit DIO = P1^2; //串行数据输入

sbit RCLK = P1^3; //时钟脉冲信号——上升沿有效 sbit SCLK = P1^4; //打入信号————上升沿有效

//----------------------------------------------------------------------------- // 全局变量

uchar LED[8]; //用于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--); }

.