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

上传人:b****3 文档编号:6807923 上传时间:2023-05-10 格式:DOCX 页数:13 大小:276.03KB
下载 相关 举报
基于51单片机的数字频率计设计.docx_第1页
第1页 / 共13页
基于51单片机的数字频率计设计.docx_第2页
第2页 / 共13页
基于51单片机的数字频率计设计.docx_第3页
第3页 / 共13页
基于51单片机的数字频率计设计.docx_第4页
第4页 / 共13页
基于51单片机的数字频率计设计.docx_第5页
第5页 / 共13页
基于51单片机的数字频率计设计.docx_第6页
第6页 / 共13页
基于51单片机的数字频率计设计.docx_第7页
第7页 / 共13页
基于51单片机的数字频率计设计.docx_第8页
第8页 / 共13页
基于51单片机的数字频率计设计.docx_第9页
第9页 / 共13页
基于51单片机的数字频率计设计.docx_第10页
第10页 / 共13页
基于51单片机的数字频率计设计.docx_第11页
第11页 / 共13页
基于51单片机的数字频率计设计.docx_第12页
第12页 / 共13页
基于51单片机的数字频率计设计.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

基于51单片机的数字频率计设计

基于51单片机的数字频率计

一、实验内容

1.1数字频率计概述

数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

它是一种用十进制数字显示被测信号频率的数字测量仪器。

它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。

在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。

本数字频率计将采用定时、计数的方法测量频率,采用四位LED数码管动态显示4位数。

测量范围从1Hz—10kHz的正弦波、方波、三角波。

用单片机实现自动测量功能。

1.2频率测量仪的设计思路与频率的计算

频率测量仪的设计思路主要是:

设置单片机T1为计数器模式,对输入信号进行计数,T0设置为定时器模式,定时时间为1秒,则计数器所计数值即为被测信号频率。

1.3基本设计原理

基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。

它以在单位时间内对被测信号上升沿计数的方法对正弦波、方波、三角波的频率进行自动的测量。

如果被测信号频率超过量程,则有警报灯闪烁。

所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。

若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。

1.4频率计性能参数设计

量程:

0-10KHz

波形:

方波

输入信号电压:

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

10

0

0

2

50

50

0

0

3

100

110

10

0.1

4

200

220

20

0.1

5

300

330

30

0.1

6

400

440

40

0.1

7

500

550

50

0.1

8

600

660

60

0.1

9

700

770

70

0.1

10

800

880

80

0.1

11

900

990

90

0.1

12

1000

1100

100

0.1

13

1500

1650

150

0.1

14

2000

2200

200

0.1

15

2500

2750

250

0.1

16

3000

3300

300

0.1

17

5000

5500

500

0.1

18

8000

8800

800

0.1

19

9000

9900

900

0.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

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

//函数原形定义

#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>0;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];

i=*led_table;

LED_OUT(0x08);

LED_OUT(i);

RCLK=0;

RCLK=1;

 

//显示第3位

led_table=LED_0F+LED[3];

i=*led_table;

LED_OUT(0x01);

LED_OUT(i);

RCLK=0;

RCLK=1;

 

//显示第4位

led_table=LED_0F+LED[4];

i=*led_table;

LED_OUT(0x02);

LED_OUT(i);

RCLK=0;

RCLK=1;

}

voidLED_OUT(ucharX)//输出函数

{

uchari;

for(i=8;i>=1;i--)

{

if(X&0x80)DIO=1;elseDIO=0;

X<<=1;

SCLK=0;

SCLK=1;

}

}

 

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

{

TMOD|=0x01;//定时器0定时模式计数范围65536

TH0=0x3c;//定时初值50ms

TL0=0xb0;

TR0=0;//暂停定时器0

}

voidtime1_init()//计数器初始化(T1)

{

TMOD|=0x50;//定时器1计数模式,计数范围65536

TH1=0;//计数初值0

TL1=0;

TR1=0;//暂停计数器

}

voidstr_init()//开中断

{

EA=1;

ET0=1;

ET1=1;

}

voidtime0_event()interrupt1//定时器0中断

{

staticuchari;

i++;

TH0=0x3c;//定时初值50ms

TL0=0xb0;

if(i==20)//循环20次为1秒

{

i=0;

TR1=0;//停止计数

TR0=0;//停止定时

ff=(TH1*256+TL1);//求出频率值就是1秒内脉冲次数

TH1=0;//计数值清零

TL1=0;

TH0=0x3c;//定时初值50ms

TL0=0xb0;

start=1;//启动定时器开启变量

}

}

voidtime1_event()interrupt3//定时器1中断

{inti=0xff;

while

(1)

{

P0=~i;

Delay_ms(500);

}

}

 

voidmain()

{uchari,j;

uinta,b,c,d;

uintss[4];

time0_init();//定时器初始化

time1_init();

str_init();//开中断

while

(1)

{

if(start==1)

{

TR0=1;//启动定时器

TR1=1;//启动计数器

start=0;//关闭启动变量位保证1秒时间

}

j=0;

do//计算显示频率数值

{

ss[j]=ff%10;

j++;

}while(ff/=10);

a=ss[0];

b=ss[1];

c=ss[2];

d=ss[3];

LED[1]=b;

LED[2]=a;

LED[3]=d;

LED[4]=c;

LED4_Display();//调用显示函数

}

}

 

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2