基于单片机的简单频率计课程设计报告.docx
- 文档编号:25592609
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:22
- 大小:414.26KB
基于单片机的简单频率计课程设计报告.docx
《基于单片机的简单频率计课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的简单频率计课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
基于单片机的简单频率计课程设计报告
《单片机原理与接口技术》课程设计报告
频率计
1功能分析与设计目标0
2频率计的硬件电路设计3
2.1控制、计数电路3
2.2译码显示电路5
3频率计的软件设计与调试6
3.1软件设计介绍6
3.2程序框图8
3.3功能实现具体过程8
3.4测试数据处理,图表及现象描述10
4讨论11
5心得与建议12
6附录(程序及注释)13
1功能分析与设计目标
背景:
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
为了实现智能化的计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是将单片机用于频率计的设计当中。
用单片机来做控制电路的数字频率计测量频率精度高,测量频率的范围得到很大的提高。
题目要求:
用两种方法检测(△m,△T)要求显示单位时间的脉冲数或一个脉冲的周期。
设计分析:
电子计数式的测频方法主要有以下几种:
脉冲数定时测频法(M法),脉冲周期测频法(T法),脉冲数倍频测频法(AM法),脉冲数分频测频法(AT法),脉冲平均周期测频法(M/T法),多周期同步测频法。
下面是几种方案的具体方法介绍。
脉冲数定时测频法(M法):
此法是记录在确定时间Tc内待测信号的脉冲个数Mx,则待测频率为:
Fx=Mx/Tc
脉冲周期测频法(T法):
此法是在待测信号的一个周期Tx内,记录标准频率信号变化次数Mo。
这种方法测出的频率是:
Fx=Mo/Tx
脉冲数倍频测频法(AM法):
此法是为克服M法在低频测量时精度不高的缺陷发展起来的。
通过A倍频,把待测信号频率放大A倍,以提高测量精度。
其待测频率为:
Fx=Mx/ATo
脉冲数分频测频法(AT法):
此法是为了提高T法高频测量时的精度形成的。
由于T法测量时要求待测信号的周期不能太短,所以可通过A分频使待测信号
的周期扩大A倍,所测频率为:
Fx=AMo/Tx
脉冲平均周期测频法(M/T法):
此法是在闸门时间Tc内,同时用两个计数器分别记录待测信号的脉冲数Mx和标准信号的脉冲数Mo。
若标准信号的频率为Fo,则待测信号频率为:
Fx=FoMx/Mo
多周期同步测频法:
是由闸门时间Tc与同步门控时间Td共同控制计数器计数的一种测量方法,待测信号频率与M/T法相同。
以上几种方法各有其优缺点:
脉冲数定时测频法,时间Tc为准确值,测量的精度主要取决于计数Mx的误差。
其特点在于:
测量方法简单,测量精度与待测信号频率和门控时间有关,当待测信号频率较低时,误差较大。
脉冲周期测频法,此法的特点是低频检测时精度高,但当高频检测时误差较大。
脉冲数倍频测频法,其特点是待测信号脉冲间隔减小,间隔误差降低;精度比M法高A倍,但控制电路较复杂。
脉冲数分频测频法,其特点是高频测量精度比T法高A倍,但控制电路也
较复杂。
脉冲平均周期测频法,此法在测高频时精度较高,但在测低频信号时精度较低。
多周期同步测频法,此法的优点是,闸门时间与被测信号同步,消除了对被测信号计数产生的±个字误差,测量精度大大提高,且测量精度与待测信号的频率无关,达到了在整个测量频段等精度测量。
功能描述:
由于水平有限,本次设计采用相对简单的M法和T法两种方法测量简单方波的频率或脉宽(由于是输入简单方波信号,省去了被测输入信号通过脉冲形成电路进行放大与整形这个步骤)。
利用AT89C51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数或脉宽计时,计数(计时)的频率结果通过5位八段LED数码管显示器显示出来。
设计指标:
M法由于TO、T1对外部脉冲信号的最高计数频率为振荡频率的1/24,而振
荡频率为12MHz得M法最高计数频率为500KHz而本设计设定最高计数频率即为500KHz误差要求尽量小。
T法仅设定能测的外部脉宽范围为65536X20us,以使定时计数器在不产生溢出中断的情况下进行测量。
本设计的频率测量误差要求尽量小,实践证明误差控制在1/100范围内。
2频率计的硬件电路设计
原理介绍
图2-1数字式频率计原理框图
由上图可以看出,待测信号经过放大整形电路后得到一个待测信号的脉冲信号,然后通过计数器计数,可得到需要的频率值,最后送入译码显示电路中显示出来。
但是控制部分相对重要,它在整个系统的运行中起至关重要的作用。
本设计控制电路和计数器电路以AT89C51为核心,译码显示电路采用单片机静态显示计数来显示,采用5位七段LED数码管显示器。
下面分节介绍各部
分硬件电路:
2.1控制、计数电路
单片机作为控制系统和计数器,是本次设计的最重要的部分,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory的低电压,高性能CMOS8位微,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
所以本次设计采用AT89C51单片机。
89C51单片机,它提供下列标准特征:
4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
其引脚说明如下:
引脚说明:
•VCC:
电源电压。
•GND:
接地。
•P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。
程序校验时需要外接上拉电阻。
•P0口:
P0口是一带有内部上拉电阻的8位双向I/O口。
P0口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P0口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P0口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
•P1口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P1口的输出缓冲能驱动4个TTL逻辑门电路。
当向P1口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
•P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P3口同时具有AT89C51的多种特殊功能,P3.0的第二功能是串行输入口RXD,P3.1的第二功能是串行输出口TXD,P3.2的第二功能是外部中断0,
P3.3的第二功能是外部中断1,P3.4的第二功能是定时器T0,P3.5的第二功能是定时器T1,P3.6的第二功能是外部数据存储器写选通/WR,P3.7的第二功能是外部数据存储器读选通/RD。
M法主要使用管脚为P3.0、P3.1以及P35其具体使用方法如下:
P3..0口与寄存器74LS164的A,B端口连接,串行输出待显示的数据。
P3.1口接移位寄存器74LS164的CLK(第8引脚),输出同步时钟信号。
P3.5口(即T1)输入脉冲信号。
T法主要使用管脚为P2.0P3.0、P3.1以及P3.3。
其具体使用方法如下:
P2.0口接开关用于控制何时输出显示脉宽时间。
P3..0口与寄存器74LS164的A,B端口连接,串行输出待显示的数据。
P3.1口接移位寄存器74LS164的CLK(第8引脚),输出同步时钟信号。
P3.5口(即T1)输入脉冲信号。
2.2译码显示电路
显示电路采用静态显示方式。
频率测量结果经过译码,通过89C51的串行口送出。
串行口工作于模式0,即同步移位寄存器方式。
这时从89C51的RXD(P3.
0)输出数据,送至串入并出移位寄存器74164的数据输入口A和B;从TXD(P3.1)输出时钟,送至74164的时钟输入口CP。
74164将串行数据转换成并行数据,进行锁存。
74164输出的8位并行数据送至8段LED,实现测量数据的显示。
使用这种方法主程序可不必扫描显示器,从而单片机可以进行下一次测量。
这种方法也便于对显示位数进行扩展。
3频率计的软件设计与调试
3.1软件设计介绍
本设计过程使用到的软件有:
WAVE软件模拟器,keiluVision2,protuseo
软件设计过程:
在keiluVision2中输入所编程序,保存为以.c为后缀的文件,新建项目,加入刚保存的文件,编译,调试到程序编译不显示错误。
在optionfortarget项中output中选中creathexfiles,重新编译程序,软件生成以.hex为后缀的文件。
在protuse软件中画出所设计的电路模拟图,加载入前面生成的以.Hex为后缀的文件,运行,观察,调试数码管显示的数值,并与设置的输入信号频率作比较,调试,分析误差产生原因,改进程序与电路图。
使用伟福软件编译所设计的c程序,调试到正确无误。
并最终通过硬件来验证所设计的频率计是否达到先前设定的设计指标。
图示:
Keil软件程序设计
Protuse软件模拟
Protuse是数字电路模拟常用的工具,方便易用,如图是工作窗口:
电'.NTlTLtD-K^Pro!
1;宀鼻
Sli+i'Fl==YV)钿jEiI>Tl匕计心i进回:
6插代旳勺清式引知可丟闖)S^tiVi祥幻tH)
鶴船鐸■由嵐・"世£丨网
74LS1B*.IEC讪的苗I
3.2程序框图
注:
以上两流程图均只表示出程序设计的简单流程,并且只表示出处理一次测量的过程,多次测量重复以上步骤即可。
具体细节或某些中间变量的赋值和对程序流程的影响详细见程序注释。
3.3功能实现具体过程
M法具体过程:
T0定时50ms,T1对方波的计数,数值串行输出和静态显示三大部分内容,此外还要附加延时程序以使静态显示数值稳定等。
具体描述如
下:
1T0实现50ms定时:
2采用12MHz的晶体的情况下,一秒的定时已超过了定时器可提供的最大定时值。
为了实现一秒的定时,采用定时和计数相结合的方法实现。
选用定时/计数器T0作定时器,工作于方式1产生50ms的定时,定时完成所得的计数值乘以20即为所测信号频率。
3T1计数部分:
4将定时器/计数器的方式寄存器TMOD,用软件赋初值51H,即01010001B。
这时定时器/计数器1采用工作方式1,方式选择位C/T设为1,即设T1为16位计数器。
定时器/计数器0采用工作方式1,C/T设为0,即设TO为16位定时器。
5计算计数初值:
设计数初值为m,本设计采用12MHz的晶振。
机
器周期=12X(1/晶振频率),得等式(216m)10650103。
6所以计数初值m=15536。
7当定时器/计数器T1设定为计数方式时,其计数脉冲是来源T1端口的外部事件。
当T1端口上出现由“1”高(电平)到“0”低(电平)的负跳变脉冲时,计数器则加1计数。
计算机是在每个机器周期的S5P2状态时采样T1端口,当前一个机器周期采样为1且后一个机器周期采样为0时,计数器加1计数。
计算机需用两个机器周期来识别1次计数,因而最大计数速率为振荡频率的1/24。
在采用12MHz晶振的情况下,单片机最大计数速度为0.5MHz即500kHz。
8另外,此处对外部事件计数脉冲的占空比(即脉冲的持续宽度)无特殊要求,但必须保证所给出的高电平在其改变之前至少被采样1次,即至少保持1个完整的机器周期。
由此可见,从T1口输入脉冲信号,T1可实现对脉冲个数的计数。
9数值串行输出和静态显示
此部分用到了单片机的串行输出口P3.0与P3.1.串行口控制寄存器SCON设置为0x00,即工作方式0—同步移位寄存器输入输出方式。
串行数据(计数值)通过RXD输出,而TXD用于输出移位时钟,作为5个74LS164的同步信号,74LS164用于扩展并行输出口,这种方式下,收发的数据为8位,低位在前,五起始位、奇偶校验位及停止位,波特率固定为振荡频率的1/12。
发送过程中,当执行一个数据写入发送缓冲器SBUF的指令时,串行口把SBUF中的8为数据以1/12的波特率从RXD(P3.0)端输出,发送完毕置中断标志TI=1,传送过程中将8位数据由低位到高位一位一位顺序通过RXD输出,并在TXD脚上输出fosc/12的移位时钟。
通过编码0~9和error(错误)的代号E(即当超出量程显示E),并根据所得计数值的各位数值,向单片机外部依次串行输出各位的编码,通过74LS164的并行输
出并且依靠人眼的视觉暂留现象能够在5位7段LED上同时显示各位的数值。
具体程序编写,详见本论文附上的程序及程序注释。
T法具体过程:
由INtI输如方波脉冲信号,T1对方波信号的高电平部分计时,计时结果串行输出和静态显示三大部分,与M法一样,还要附加延时程序以使静态显示数值稳定等。
具体描述如下:
1由而输如方波脉冲信号
方波信号通过intT管脚输入检测,此处该管脚相当于对信号的监测,通过软件方式告之单片机哪段时间输入信号为高电平,哪段时间为低电平。
以便控制T1
计时的开始和停止。
2T1对方波信号的高电平部分计时
通过查询方式,当信号输入管脚而为1(即高电平)时进行计时,设置TMOD值为0x90,即T1为方式1的16位定时器(也可设置为计数器,效果一样),且T1受GATE位的影响:
因为GATE=1,只有INT1为高电平且由软件使TR1置一时,才能启动定时器工作。
正因为如此,测量高电平脉宽显得精确可控。
定时器计时结束则可将数值输出显示。
3计时结果串行输出和静态显示
此部分内容同M法一致,详见M法的功能实现描述。
3.4测试数据处理,图表及现象描述
根据设计的程序连接好硬件电路,使用伟福硬件仿真器和实验台进行测量。
数据处理:
a.将输入方波的频率由小到大进行变化,并读出静态显示出的测量值与示波器
显示的测量值,比较二者的差别,分析误差随输入信号频率的变化情况及误差来源,提出改进方案。
b.过程中要求对同一频率的输入方波进行多组测量,取平均值f或T(频率或周
期)。
软硬件连接图如下:
现象描述:
M法:
示波器显示数值与静态显示的数值十分吻合,误差相当小,一般在1~10Hz内。
本测量在低频段的相对测量误差较大。
增大T可以提高测量精度,但在低
频段仍不能满足要求。
T法:
在低频和高频时误差较大,在1KHz到一定范围内误差很小。
理论上T
法在低频段精度高。
但此次设计中反映的现象却相反。
初步分析为计时程序误差太大,不够合理。
一个是采用的是查询方式,不易控制计时器何时开始计时和结束,另外P2.0的按键延时等,误差较大。
总体而言的误差分析:
(1)单片机计数速率的限制引起误差。
被测信号频率越高,测量误差越大,且所测信号频率不能超过480kHz。
这是因为采用的是12MHz的晶振,单片机最大计数速度为500kHz,所以当被测信号越接近500kHz时,测量结果与实际频率的误差就越大。
而当被测信号大于500kHz时,频率计将测不出信号频率。
(2)
(3)
(2)原理上存在±1误差。
由于该设计是在计数门限时间一秒内的频率信号脉冲数,所以定时开始时的第一个脉冲和定时时间到时的最后一个脉冲信号是否被记录,存在随机性。
这种误差对测量频率低的信号影响较大。
由于D触发器必须在信号的上升沿才翻转,故T0对信号脉冲个数不存在±1%误差,而T1计时为信号信号周期的整数倍,则存在对T1计数的±%误差,故测量精度与被测频率无关•但若取计时时间大于0.1S(实际最小时间约为0.5S),误差则小于0.001%;若对低频信号f测量,则计时时间远大于0.1S,故误差极小•但是在高频端分频时,由于软件中断、延时等原因,会导致脉宽的测量误差增大,而频率测量误差较小(保持在0.01%).
误差改进措施:
a.选用频率较高和稳定性好的晶振。
如选24kHz的晶振可使测量范围扩大,稳定性好的晶振可以减小误差。
b.测量频率较高的信号时,可先对信号进行分频,再进行测量。
c.改进T法计时程序,从根本上减小误差。
d.
4讨论
本次设计实现了用两种方法对外部未知频率的方波信号的测量。
M法测量的设计达到了高范围(500KHz,在LED管位数足够的情况下,改进程序的显示程序部分即可)与高精度(1~10hz一般情况下);T法设计由于部分程序的缺陷并未能实现很好的测量频率的效果,仅能测量一定范围的频率。
未达到设计目标的原因详见误差分析部分。
此次设计还有很大不足,尤其是在信号的对象选择上,信号要求是方波信号。
未能对任意未知波形信号进行分析测量。
在今后的时间里,我们小组会继续探索单片机设计数字频率计的设计,加上信号预处理电路,改进信号频率的测量方法,提高信号显示的精度,拓展本次设计未能实现的各项频率计应当具备的要求,如可选量程,科学计数显示等等。
5心得与建议
通过此次设计,我们小组的成员都受到了极大的锻炼,对团队合作的重要性有了深刻认识,虽然我们面对的是一个相对简单的课题,但由于初次进行基于单片机的课题设计,所以在设计过程中,我们遇到了一些困难,也经历了一次又一次的困惑,最初我们尝试着完美化我们的设计,以实现更多的功能和提高可操纵性,却没有从最基本的内容一步步做起,没有将核心部分放在首位。
正如老师讲的,正确的顺序是先把核心部分做好,就像盖房子一样,先打地基——定时计数是我们这次设计的核心,然后再一步一步扩展,完善功能,向上盖房子。
生活实际中确实如此,做任何事,没有打好基础,最终就不能有很好的发展。
学习也是如此,对于工科的我们数学、物理等就是我们的基础,往往发展的瓶颈就在基础部分。
今后,我们小组的成员会吸收此次设计实践收获的宝贵经验,更加努力地,更加坚定地在电子科技上一步一步脚踏实地地学习进步。
6附录
M法
#include
#defineucharunsignedchar
#defineuintunsignedint
uintnuml,numh,f;
codeuchark[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02,0x9e};
voidinit()//初始化函数
{
SCON=0x00;//串行同步移位输出
TMOD=0x51;//T1计数,T0定时
ET0=1;//T0中断允许
TH0=(15535)/256;
TL0=(15535)%256;//T0定时50ms的初值
TH1=0;
TL1=0;
IT0=1;//T1计数的初值
TR0=1;
TR1=1;//开始计数、定时
EA=1;
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}//延时函数,delay(200);大约延时200ms.
voidsend(ucharb)//串行输出显示函数部分一
{
SBUF=b;
while(!
TI);//发送结束标志
TI=0;
}
voiddisplay(uintx)//串行输出显示函数部分二
if(x>99999)
{
send(0x00);//0x00表示该位不显示字符
send(0x00);
send(0x00);
send(0x00);
error。
send(k[11]);//程序最大测量频率定为100k,大于此范围则显示“E",指示}
elseif((x<100000)&&(x>9999))
{
send(k[x/10000]);send(k[x%10000/1000]);send(k[x%10000%1000/100]);send(k[x%10000%1000%100/10]);send(k[x%10000%1000%100%10]);
}
elseif((x<10000)&&(x>999)){
send(0x00);
send(k[x/1000]);
send(k[x%1000/100]);
send(k[x%1000%100/10]);
send(k[x%1000%100%10]);}
elseif((x<1000)&&(x>99)){
send(0x00);
send(0x00);
send(k[x/100]);
send(k[x%100/10]);
send(k[x%100%10]);}
elseif((x<100)&&(x>9))
{
send(0x00);
send(0x00);
send(0x00);
send(k[x/10]);send(k[x%10]);
}
else
{
send(0x00);
send(0x00);
send(0x00);
send(0x00);send(k[x%10]);
}
}
voidtimer_0()interrupt1//定时器T0中断
{
TH0=(15535)/256;TL0=(15535)%256;
TR1=0;
TR0=0;numh=TH1;numl=TL1;
TH1=0;
TL1=0;//恢复初始值待下一轮测量,并将结果赋值f=(numh<<8)+numl;
f=f*20;//20表示中断20次达到1s得到的频率值display(f);
delay(200);
TR0=1;
TR1=1;
}
voidmai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 简单 频率计 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)