当前位置:文档之家› 单片机简易频率计课程设计

单片机简易频率计课程设计

单片机简易频率计课程设计
单片机简易频率计课程设计

前言 (2)

一、总体设计 (3)

二、硬件设计 (5)

AT89C51单片机及其引脚说明: (5)

显示原理 (7)

技术参数 (8)

电参数表 (8)

时序特性表 (8)

模块引脚功能表 (9)

三、软件设计 (9)

四、调试说明 (11)

五、使用说明 (13)

结论 (13)

参考文献 (13)

附录 (14)

Ⅰ、系统电路图 (14)

Ⅱ、程序清单 (14)

前言

单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用在生活中至关重要。

随着电子信息产业的不断发展,信号频率的测量在科技研究和实际应用中的作用日益重要。传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行缓慢,而且测量频率的范围比较小。考虑到上述问题,本论文设计一个基于单片机技术的数字频率计。首先,我们把待测信号经过放大整形;然后把信号送入单片机的定时计数器里进行计数,获得频率值;最后把测得的频率数值送入显示电路里进行显示。本文从频率计的原理出发,介绍了基于单片机的数字频率计的设计方案,选择了实现系统得各种电路元器件,并对硬件电路进行了仿真。

一、总体设计

用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。

所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率f x。时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等于1s。闸门电路由标准秒信号进行控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。

本系统采用测量频率法,可将频率脉冲直接连接到AT89C51的T0端,将T/C1用做定时器。T/C0用做计数器。在T/C1定时的时间里,对频率脉冲进行计数。在1S定时内所计脉冲数即是该脉冲的频率。见图1:

图1测量时序图

由于T0并不与T1同步,并且有可能造成脉冲丢失,所以对计数器T0做一定的延时,以矫正误差。具体延时时间根据具体实验确定。

根据频率的定义,频率是单位时间内信号波的个数,因此采用上述各种方案都能实现频率的测量。但是本论文设计的是一个用单片机做为电路控制系统的数字式频率计,采用脉冲定时测频法,则在低频率的测量时误差会大一些。采用脉冲周期测频法则测高频率时精度无法保证;采用脉冲数倍频测频法和脉冲数分频测频法则精度有所提高,但控制电路较复杂;采用脉冲平均周期测频法则很难兼

顾低频信号的测量;而采用多周期同步测频法,闸门时间与被测信号同步,消除了对被测信号计数产生的±1误差,测量精度大大提高,且测量精度与待测信号的频率无关,达到了在整个测量频段等精度测量。本次设计由于个人水平有限,因此,本次设计根据需要,采用脉冲定时测频法。

基本设计原理是首先把待测信号通过放大整形,变成一个脉冲信号,然后通过控制电路控制计数器计数,最后送到译码显示电路里进行显示,其基本构成框图如图2所示。

图2

由上图可以看出,待测信号经过放大整形电路后得到一个待测信号的脉冲信号,然后通过计数器计数,可得到需要的频率值,最后送入译码显示电路中显示出来。但是控制部分才是最重要的,它在整个系统的运行中起至关重要的作用。

为了得到一个高性能的数字频率计,本次设计采用单片机来做为数字频率计的核心控制电路,辅之于少数的外部控制电路。因此本此设计的系统包括信号放大整形电路、分频电路、单片机AT89C51和显示电路等。本系统让被测信号经过放大整形后,进入单片机开始计数,利用单片机内部定时计数器定时,在把所记得的数经过相关处理后送到显示电路中显示。其系统原理框图将在下面介绍。根据上述的基于单片机的数字频率计的设计原理,我们可设计一个由放大整形电路、分频电路、多路数据选择器、AT89C51以及显示电路来构成的数字式频率计,其系统框图如图3所示。

图3

二、硬件设计

AT89C51单片机及其引脚说明:

89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器, 一个5中断源两个优先级的中断结构,一个双工的串行口, 片上震荡器和时钟电路。

引脚说明:

2VCC:电源电压

2GND:地

2P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。

当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。

在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。

2P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。

2P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓

冲能驱动4个TTL逻辑门电路。当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。

2P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX @DPTR)时,P2口送出高8位地址数据。在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。当利用8位地址线访问外部数据存储器时(例MOVX @R1),P2口输出特殊功能寄存器的内容。当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。

2P3口:P3是一带有内部上拉电阻的8位双向的I/O端口。P3口的输出缓冲能驱动4个TTL逻辑门电路。当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。

P3口同时具有AT89C51的多种特殊功能,具体如下表1所示:

表1

2RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。

2EA/V PP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,EA必须同GND相连接。需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。

2ALE/RPOG:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。当在Flash编程时还可以作为编程脉冲输出(RPOG)。

一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。

2PSEN:程序存储允许时外部程序存储器的读选通信号。当AT89C52执行外部程序存储器的指令时,每个机器周期PSEN两次有效,除了当访问外部数据存储器时,PSEN将跳过两个信号。

显示原理

我们测量的频率最终要显示出来。八段LED数码管显示器基本电路如图4所示。

图4

八段LED数码管显示器由8个发光二极管组成。基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在数码管显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED数码管显示器有两种形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管显示器。如下图所示。共阴和共阳结构的LED数码管显示器各笔划段名和安排位置是相同的。当二极管导通时,对应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7、D6、D5、D4、D3、D2、D1、D0,于是用8位二进制码就能表示欲显示字符的字形代码。

技术参数

表2 极限参数表电参数表

表3 电参数表时序特性表

表4 时序特性表

模块引脚功能表

表5 模块引脚功能表

三、软件设计

测频软件的实现是基于电路系统来进行设计的。本次设计采用的是脉冲定时测频法,所以在软件实现上基本遵照系统的设计原理,进行测频。本次软件设计语言采用C语言,在电脑上编译通过后即可下载到电路上的实际电路中,即可实现频率的测量。

四、调试说明

当输入频率为1HZ时,测得频率为1HZ.

当输入频率为987HZ时,测得频率为987HZ。

但是当输入频率为5KHZ时,测得频率为5001HZ。误差为0.02%。

当输入频率大到100kHZ时,测得频率为10015HZ,误差为0.15%。

误差分析:因为定时和计数都是由单片机本身来完成的,在计数的时候会产生误差。这个误差的大小是用单片机的内部时钟决定的,采用高频率的晶振来为单片机提供内部时钟,则能减少此误差。本次设计我们用的是12MHz的晶振,而测频的范围是1Hz~1MHz。所以定时计数的误差在本系统基本可以忽略不计。

五、使用说明

该设计主要是能够测量外部周期信号的频率值,并且通过数码管进行显示。

把编译好得到的hex程序文件载入到单片机里,就可以对整体电路进行仿真了。经过对上述电路的仿真,我们可以看出,电路所要完成的功能都能基本实现。结论

基于单片机的频率计的设计涉及到计算机的硬软件知识,通过对系统的设计和调试,本次设计主要完成了以下工作:

1、提出基于单片机的数字频率计设计的基本方案;

2、完成了电路设计;

3、编译了软件程序;

4、对硬件电路进行了仿真,进行了误差分析。

参考文献

[1] 李雷等编.集成电路应用实验.国防工业出版社2003

[2] 李雷等编.电子技术应用实验教程.电子科技大学出版社,2006

[3] 朱红等编.电子技术综合实验.电子科技大学出版社,2005

[4] 冯熙昌编.电子电话机集成电路手册.人民邮电出版社,1996

[5] 李华等编.MCS-51 系列单片机实用接口技术.北京航空航天大学出版社,1993

[6] 徐惠民,安德宁等编.单片微型计算机原理接口及应用.北京邮电大学出版社,2000

[7] 张毅坤,陈善久,单片微型计算机原理及应用.西安电子科技大学出版社,2002.

[8] 张友德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000.

附录

Ⅰ、系统电路图

Ⅱ、程序清单

#include

#include

#define uchar unsigned char #define uint unsigned int sfr16 DPTR=0x82;

bit status_F=1;

uint aa, qian, bai,shi,ge,bb,wan,shiwan;

uchar cout;

unsigned long temp;

uchar code

table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay(uint z);

void init();

void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge); void xtimer0();

void xtimer1();

void main()

{

P0=0XFF;

init();

while(1)

{

if(aa==19)

{

aa=0;

status_F=1;

TR1=0;

delay(46);

TR0=0;

DPL=TL0;

DPH=TH0;

temp=DPTR+cout*65535;

shiwan=temp%1000000/100000;

wan=temp%100000/10000;

qian=temp%10000/1000;

bai=temp%1000/100;

shi=temp%100/10;

ge=temp%10;

if(shiwan==0)

{

shiwan=10;

if(wan==0)

{

wan=10;

if(qian==0)

{

qian=10;

if(bai==0)

{

bai=10;

if(shi==0)

shi=10;

}}}}

}

display(shiwan,wan,qian,bai,shi,ge);

}

}

void init()

{

temp=0;

aa=0;

cout=0;

IE=0X8A;

TMOD=0x15;

TH1=0x3c;

TL1=0xb0;

TH0=0;

TL0=0;

TR1=1;

TR0=1;

}

void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge) {

P0=0x20;

P2=table[shiwan];

delay(5);

P0=0x10;

P2=table[wan];

delay(3);

P0=0x08;

P2=table[qian];

delay(3);

P0=0x04;

P2=table[bai];

delay(3);

P0=0x02;

P2=table[shi];

delay(3);

P0=0x01;

P2=table[ge];

delay(3);

}

void xtimer1() interrupt 3 {

TH1=0x3c;

TL1=0xb0;

aa++;

}

void xtimer0() interrupt 1 {

cout++;

}

void delay(uint z)

{

uint i,j;

for(i=0;i

for(j=0;j<110;j++); }

相关主题
文本预览
相关文档 最新文档