基于51单片机的数字频率计设计Word下载.docx

上传人:b****4 文档编号:16116872 上传时间:2022-11-20 格式:DOCX 页数:13 大小:363.70KB
下载 相关 举报
基于51单片机的数字频率计设计Word下载.docx_第1页
第1页 / 共13页
基于51单片机的数字频率计设计Word下载.docx_第2页
第2页 / 共13页
基于51单片机的数字频率计设计Word下载.docx_第3页
第3页 / 共13页
基于51单片机的数字频率计设计Word下载.docx_第4页
第4页 / 共13页
基于51单片机的数字频率计设计Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于51单片机的数字频率计设计Word下载.docx

《基于51单片机的数字频率计设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字频率计设计Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

基于51单片机的数字频率计设计Word下载.docx

波形:

方波

输入信号电压:

5V

二、数字频率计的硬件构造设计

2.1系统硬件的构成

本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有电源电路、复位电路、显示器,报警电路等器件,如下列图所示:

 

图一数字频率计功能模块

2.2AT89C51单片机引脚说明

在本次设计中,采用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

相对误差

1

10

2

50

3

100

110

0.1

4

200

220

20

5

300

330

30

6

400

440

40

7

500

550

8

600

660

60

9

700

770

70

800

880

80

11

900

990

90

12

1000

1100

13

1500

1650

150

14

2000

2200

15

2500

2750

250

16

3000

3300

17

5000

5500

18

8000

8800

19

9000

9900

〔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<

AT89X51.H>

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

//函数原形定义

#defineucharunsignedchar

#defineuintunsignedint

voidmain(void);

//主函数

voidLED4_Display(void);

//LED显示

voidLED_OUT(ucharX);

//LED单字节串行移位函数

unsignedcharcodeLED_0F[];

//LED字模表

sbitDIO=P1^2;

//串行数据输入

sbitRCLK=P1^3;

//时钟脉冲信号——上升沿有效

sbitSCLK=P1^4;

//打入信号————上升沿有效

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

//全局变量

ucharLED[8];

//用于LED的8位显示缓存

uintff;

//承受频率值

ucharstart=1;

//定时器,计数模式启动变量

unsignedcharcodeLED_0F[]=

{//0123456789AbCdEF-

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf

};

voiddelay(k)//延时函数

{

while(k--);

}

voidDelay_ms(uinttime)//延时函数

uinti,j;

for(i=time;

i>

0;

i--)

for(j=125;

j>

j--);

voidLED4_Display(void)//显示函数

unsignedcharcode*led_table;

//查表指针

uchari;

//显示第1位

led_table=LED_0F+LED[1];

i=*led_table;

LED_OUT(0x04);

LED_OUT(i);

RCLK=0;

RCLK=1;

//显示第2位

led_table=LED_0F+LED[2];

LED_OUT(0x08);

//显示第3位

led_table=LED_0F+LED[3];

LED_OUT(0x01);

//显示第4位

led_table=LED_0F+LED[4];

LED_OUT(0x02);

voidLED_OUT(ucharX)//输出函数

for(i=8;

=1;

{

if(X&

0x80)DIO=1;

elseDIO=0;

X<

<

SCLK=0;

SCLK=1;

}

voidtime0_init()//定时器初始化〔TIMER0〕

TMOD|=0x01;

//定时器0定时模式计数X围65536

TH0=0x3c;

//定时初值50ms

TL0=0x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1