基于单片机的简单频率计课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机原理与接口技术》课程设计报告
频率计
目录
测试数据处理,图表及现象描述 (10)
1
2
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倍,但控制电路也较复杂。

脉冲平均周期测频法,此法在测高频时精度较高,但在测低频信号时精度较低。

多周期同步测频法,此法的优点是,闸门时间与被测信号同步,消除了对被测信号计数产生的±1个字误差,测量精度大大提高,且测量精度与待测信号的频率无关,达到了在整个测量频段等精度测量。

功能描述:
由于水平有限,本次设计采用相对简单的M法和T法两种方法测量简单方波的频率或脉宽(由于是输入简单方波信号,省去了被测输入信号通过脉冲形成电路进行放大与整形这个步骤)。

利用AT89C51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数或脉宽计时,计数(计时)的频率结果通过5位八段LED数码管显示器显示出来。

设计指标:
M法由于T0、T1对外部脉冲信号的最高计数频率为振荡频率的1/24,而振荡频率为12MHz,得M法最高计数频率为500KHz,而本设计设定最高计数频率即为500KHz。

误差要求尽量小。

T法仅设定能测的外部脉宽范围为65536×20us,以使定时计数器在不产生溢出中断的情况下进行测量。

本设计的频率测量误差要求尽量小,实践证明误差控制在1/100范围内。

2频率计的硬件电路设计
原理介绍
图2-1 数字式频率计原理框图
由上图可以看出,待测信号经过放大整形电路后得到一个待测信号的脉冲信号,然后通过计数器计数,可得到需要的频率值,最后送入译码显示电路中显示出来。

但是控制部分相对重要,它在整个系统的运行中起至关重要的作用。

本设计控制电路和计数器电路以AT89C51为核心,译码显示电路采用单片机静态显示计数来显示,采用5位七段LED数码管显示器。

下面分节介绍各部
分硬件电路:
控制、计数电路
单片机作为控制系统和计数器,是本次设计的最重要的部分,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位0口与寄存器74LS164的A,B端口连接,串行输出待显示的数据。

口接移位寄存器74LS164的CLK(第8引脚),输出同步时钟信号。

P3.5口(即T1)输入脉冲信号。

T法主要使用管脚为、、以及。

其具体使用方法如下:
口接开关用于控制何时输出显示脉宽时间。

P3..0口与寄存器74LS164的A,B端口连接,串行输出待显示的数据。

口接移位寄存器74LS164的CLK(第8引脚),输出同步时钟信号。

P3.5口(即T1)输入脉冲信号。

译码显示电路
显示电路采用静态显示方式。

频率测量结果经过译码,通过89C51 的串行口送出。

串行口工作于模式0 ,即同步移位寄存器方式。

这时从89C51 的RXD(P3.
0) 输出数据,送至串入并出移位寄存器74164 的数据输入口A 和B ;从TXD( P3.
1) 输出时钟,送至74164 的时钟输入口CP。

74164 将串行数据转换成并行数据,进行锁存。

74164 输出的8 位并行数据送至8 段L ED ,实现测量数据的显示。

使用这种方法主程序可不必扫描显示器,从而单片机可以进行下一次测量。

这种方法也便于对显示位数进行扩展。

串行输入
7段LED并行输出
74LS164
3 频率计的软件设计与调试
软件设计介绍
本设计过程使用到的软件有:WA VE软件模拟器,keil uVision2,protuse。

软件设计过程:
在keil uVision2中输入所编程序,保存为以.c为后缀的文件,新建项目,加入刚保存的文件,编译,调试到程序编译不显示错误。

在option for target项中output中选中creat hex files ,重新编译程序,软件生成以.hex为后缀的文件。

在protuse软件中画出所设计的电路模拟图,加载入前面生成的以. Hex为后缀的文件,运行,观察,调试数码管显示的数值,并与设置的输入信号频率作比较,调试,分析误差产生原因,改进程序与电路图。

使用伟福软件编译所设计的c程序,调试到正确无误。

并最终通过硬件来验证所设计的频率计是否达到先前设定的设计指标。

图示:
Keil软件程序设计
Protuse软件模拟
Protuse是数字电路模拟常用的工具,方便易用,如图是工作窗口:
程序框图
M 法
:
开始
初始化程序,初始化数组、中间量 延时子程序、数码管显示函数
T
法:
开始
初始化程序且TH1=0,TL1=0
延时程序,数码管显示函数
注:以上两流程图均只表示出程序设计的简单流程,并且只表示出处理一次测量的过程,多次测量重复以上步骤即可。

具体细节或某些中间变量的赋值和对程序流程的影响详细见程序注释。

功能实现具体过程
M 法具体过程:T0定时50ms ,T1对方波的计数,数值串行输出和静态显示三大部分内容,此外还要附加延时程序以使静态显示数值稳定等。

具体描述如下:
① T0 实现50ms 定时:
② 采用12 MHz 的晶体的情况下,
一秒的定时已超过了定时器可提供
的最大定时值。

为了实现一秒的定时,采用定时和计数相结合的方法实现。

选用定时/计数器T0作定时器,工作于方式1产生50 ms 的定时,定时完成所得的计数值乘以20即为所测信号频率。

③ T1计数部分:
④ 将定时器/计数器的方式寄存器TMOD ,用软件赋初值51H ,即01010001B 。

这时定时器/计数器1采用工作方式1,方式选择位C /T 设为1,即设T1为16位计数器。

定时器/计数器O 采用工作方式1,C /T 设为0,即设TO 为16位定时器。

⑤ 计算计数初值:设计数初值为m ,本设计采用12 MHz 的晶振。


器周期=12×(1/晶振频率),得等式3616105010)2(--⨯=⨯-m 。

⑥ 所以计数初值m=15536。

⑦ 当定时器/计数器T1设定为计数方式时,其计数脉冲是来源T1端口的外部事件。

当T1端口上出现由“1”(高电平)到“0”(低电平)的负跳变脉冲时,计数器则加1计数。

计算机是在每个机器周期的S5P2状态时采样T1端口,当前一个机器周期采样为1且后一个机器周期采样为0时,计数器加1计数。

计算机需用两个机器周期来识别1次计数,因而最大计数速率为振荡频率的1/24。

在采用12 MHz 晶振的情况下,单片机最大计数速度为0.5 MHz 即500 kHz 。

⑧ 另外,此处对外部事件计数脉冲的占空比(即脉冲的持续宽度)无特殊要
求,但必须保证所给出的高电平在其改变之前至少被采样1次,即至少保持1个完整的机器周期。

由此可见,从T1口输入脉冲信号,T1可实现对脉冲个数的计数。

⑨ 数值串行输出和静态显示
此部分用到了单片机的串行输出口与.串行口控制寄存器SCON 设置为0x00,即工作方式0—同步移位寄存器输入输出方式。

串行数据(计数值)通过RXD 输出,而TXD 用于输出移位时钟,作为5个74LS164的同步信号,74LS164用于扩展并行输出口,这种方式下,收发的数据为8位,低位在前,五起始位、奇偶校验位及停止位,波特率固定为振荡频率的1/12。

发送过程中,当执行一个数据写入发送缓冲器SBUF 的指令时,串行口把SBUF 中的8为数据以1/12的波特率从RXD ()端输出,发送完毕置中断标志TI=1,传送过程中将8位数据由低
位到高位一位一位顺序通过RXD 输出,并在TXD 脚上输出osc f
/12的移位时钟。

通过编码0~9和error(错误)的代号E(即当超出量程显示E),并根据所得计数值的各位数值,向单片机外部依次串行输出各位的编码,通过74LS164的并行输出并且依靠人眼的视觉暂留现象能够在5位7段LED 上同时显示各位的数值。

具体程序编写,详见本论文附上的程序及程序注释。

T 法具体过程:由INT1输如方波脉冲信号,T1对方波信号的高电平部分计时,计时结果串行输出和静态显示三大部分,与M 法一样,还要附加延时程序以使静态显示数值稳定等。

具体描述如下:
① 由INT1输如方波脉冲信号
方波信号通过INT1管脚输入检测,此处该管脚相当于对信号的监测,通过软件
方式告之单片机哪段时间输入信号为高电平,哪段时间为低电平。

以便控制T1计时的开始和停止。

② T1对方波信号的高电平部分计时
通过查询方式,
当信号输入管脚INT1为
1(即高电平)时进行计时,设置TMOD 值为0x90,即T1为方式1的16位定时器(也可设置为计数器,效果一样),且T1受GATE 位的影响:因为GATE=1,只有INT1为高电平且由软件使TR1置一时,才能启动定时器工作。

正因为如此,测量高电平脉宽显得精确可控。

定时器计时结束则可将数值输出显示。

③ 计时结果串行输出和静态显示
此部分内容同M 法一致,详见M 法的功能实现描述。

测试数据处理,图表及现象描述
根据设计的程序连接好硬件电路,使用伟福硬件仿真器和实验台进行测量。

数据处理:
a. 将输入方波的频率由小到大进行变化,并读出静态显示出的测量值与示波器
显示的测量值,比较二者的差别,分析误差随输入信号频率的变化情况及误差来源,提出改进方案。

b. 过程中要求对同一频率的输入方波进行多组测量,取平均值f 或T(频率或周
期)。

软硬件连接图如下:
M 法
T法
现象描述:
M法:示波器显示数值与静态显示的数值十分吻合,误差相当小,一般在1~10Hz 内。

本测量在低频段的相对测量误差较大。

增大T可以提高测量精度,但在低频段仍不能满足要求。

T法:在低频和高频时误差较大,在1KHz到一定范围内误差很小。

理论上T 法在低频段精度高。

但此次设计中反映的现象却相反。

初步分析为计时程序误差太大,不够合理。

一个是采用的是查询方式,不易控制计时器何时开始计时和结束,另外的按键延时等,误差较大。

总体而言的误差分析:
(1)单片机计数速率的限制引起误差。

被测信号频率越高,测量误差越大,且所测信号频率不能超过480 kHz。

这是因为采用的是12 MHz的晶振,单片机最大计数速度为500 kHz,所以当被测信号越接近500 kHz时,测量结果与实际频率的误差就越大。

而当被测信号大于500 kHz时,频率计将测不出信号频率。

(2)
(3)(2)原理上存在±1误差。

由于该设计是在计数门限时间一秒内的频率信号脉冲数,所以定时开始时的第一个脉冲和定时时间到时的最后一个脉冲信号是否被记录,存在随机性。

这种误差对测量频率低的信号影响较大。

由于D触发器必须在信号的上升沿才翻转,故T0对信号脉冲个数不存在±1%误差,而T1计时为信号信号周期的整数倍,则存在对T1计数的±1%误差,故测量精度与被测频率无关.但若取计时时间大于(实际最小时间约为,误差则小于0.001%;若对低频信号f测量,则计时时间远大于,故误差极小.但是在高频端分频时,由于软件中断、延时等原因,会导致脉宽的测量误差增大,而频率测量误差较小(保持在%).
误差改进措施:
a.选用频率较高和稳定性好的晶振。

如选24 kHz的晶振可使测量范围扩大,
稳定性好的晶振可以减小误差。

b.测量频率较高的信号时,可先对信号进行分频,再进行测量。

c.改进T法计时程序,从根本上减小误差。

d.
4 讨论
本次设计实现了用两种方法对外部未知频率的方波信号的测量。

M法测量的设计达到了高范围(500KHz,在LED管位数足够的情况下,改进程序的显示程序部分即可)与高精度(1~10hz一般情况下);T法设计由于部分程序的缺陷并未能实现很好的测量频率的效果,仅能测量一定范围的频率。

未达到设计目标的原因详见误差分析部分。

此次设计还有很大不足,尤其是在信号的对象选择上,信号要求是方波信号。

未能对任意未知波形信号进行分析测量。

在今后的时间里,我们小组会继续探索单片机设计数字频率计的设计,加上信号预处理电路,改进信号频率的测量方法,提高信号显示的精度,拓展本次设计未能实现的各项频率计应当具备的要求,如可选量程,科学计数显示等等。

5 心得与建议
通过此次设计,我们小组的成员都受到了极大的锻炼,对团队合作的重要性有了深刻认识,虽然我们面对的是一个相对简单的课题,但由于初次进行基于单片机的课题设计,所以在设计过程中,我们遇到了一些困难,也经历了一次又一次的困惑,最初我们尝试着完美化我们的设计,以实现更多的功能和提高可操纵性,却没有从最基本的内容一步步做起,没有将核心部分放在首位。

正如老师讲的,正确的顺序是先把核心部分做好,就像盖房子一样,先打地基——定时计数是我们这次设计的核心,然后再一步一步扩展,完善功能,向上盖房子。

生活实际中确实如此,做任何事,没有打好基础,最终就不能有很好的发展。

学习也是如此,对于工科的我们数学、物理等就是我们的基础,往往发展的瓶颈就在基础部分。

今后,我们小组的成员会吸收此次设计实践收获的宝贵经验,更加努力地,更加坚定地在电子科技上一步一步脚踏实地地学习进步。

6 附录
M法
#include<>
#define uchar unsigned char
#define uint unsigned int
uint numl,numh,f;
code uchar k[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02,0x9e};
void init()
void send(uchar b) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void send(uchar b) //串行输出静态显示函数部分一
{
SBUF=b;
while(!TI);//发送结束标志
TI=0;
}
void display(uint x)//串行输出静态显示函数部分二
{
if(x>65536)//根据THI,TH0共16位,计时范围定为65536us
{
send(0x00);
send(0x00);//0x00表示该位不显示字符
send(0x00);
send(0x00);
send(k[10]);//程序最大测量定时定为65536,大于此范围则显示“E",指示error。

}
else if((x<=65536)&&(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]);
}
else if((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]);
}
else if((x<1000)&&(x>99))
{
send(0x00);
send(0x00);
send(k[x/100]);
send(k[x%100/10]);
send(k[x%100%10]);
}
else if((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]);
}
}
void main()
{
init();//初始化/*void display_us(uint x)
while(1)
{
if(I==0)// 外部输入为低电平,T1不计时
{
num=0;
TR1=0;
if((TH1==0)&&(TL1==0))
num=0;//非计数部分标志为num=0,不予显示
else
{
numh=TH1;
numl=TL1;
num=1;//低电平时,把上次计数值输出,并标志为num=1,给予显示
}
TH1=0;
TL1=0;//恢复初值,以备下次计
}
else TR1=1;//外部输入为高电平,T1输入为高电平那段计时
if(d==0)//由控制是否输出显示
{
if(num==1)//根据显示与否的标志即是否有num=1,为1则输出
{
f=(numh<<8)+numl;
f=f*2;//信号周期宽度
display(f);
delay(10);
}
}
}
}。

相关文档
最新文档