数字频率计设计
生产实习(2)报告
数字频率计设计
院 系 :专 业: 年级(班级)
姓名及学号:指导教师: 完成日期:
信息科学与工程学院 测控技术与仪器 13级1304班 李波(130401413)
2017年 01月 09日
目 录
第一章 需求分析报告 ................................................................................................................................. 1
1.1 课题背景意义................................................................................................................................... 1
. ........................................................................................................................................... 1 1.2 设计任务
第二章 概念设计报告 ................................................................................................................................. 3
. ........................................................................................................................................... 3 2.1 方案论证
2.2 电子技术法测量频率工作原理 . .................................................................................................. 3 2.3方案设计指标 . ................................................................................................................................... 4 第三章 硬件技术设计报告 ........................................................................................................................ 5
3.1控制器概述 ........................................................................................................................................ 5 3.2 LCD1602A液晶屏概述 . ................................................................................................................... 6 3.3硬件焊接与调试 ............................................................................................................................... 7 第四章 软件技术设计报告 ........................................................................................................................ 8
4.1程序设计思路 . ................................................................................................................................... 8 4.2程序分析 . ............................................................................................................................................ 9 4.3误差分析 . .......................................................................................................................................... 13 第五章 操作手册 ........................................................................................................................................ 17
5.1数字频率计简介 ............................................................................................................................. 17 5.2数字频率计使用步骤 .................................................................................................................... 18 第六章 总结 ................................................................................................................................................. 19
6.1实验结果 . .......................................................................................................................................... 19 6.2结论 . ................................................................................................................................................... 20 参 考 文 献 . ............................................................................................................................................ 21 附录1 系统原理图 ....................................................................................................................................... 22 附录2 系统PCB 图 ....................................................................................................................................... 23 附录3 程序清单 . ........................................................................................................................................... 24
数字频率计设计
第一章 需求分析报告
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率计在教学、科研、测量仪器、工业控制等方面都有较广泛的应用。在传统的生产制造中,频率计被广泛应用在于生产测试中。例如可以通过使用频率计迅速发现有故障的晶振产品,确保产品质量。在计量实验室中,频率计被用来对各种电子测量设备的本地振荡器进行校准。在无线通讯测试中,频率计既可以被用来对无线通讯基站的主时钟进行校准,还可以被用来对无线电台的跳频信号和频率调制信号进行分析。在电阻、电容测量中,通过555定时器,将不同电阻和定容值转换成不同的频率输出,通过测量频率即可间接的测量电阻值和电容值。
1.1 课题背景意义
传统的频率计通常采用组合电路和时序电路等大量的硬件电路构成,产品不但体积较大,运行速度慢,而且测量低频信号时不宜直接使用。频率信号抗干扰性强、易于传输,可以获得较高的测量精度。同时,频率测量方法的优化也越来越受到重视。随着微电子技术和计算机的迅速发展,特别是单片机的出现和发展,使传统的电子测量仪器在原理、功能、耗电、可靠性等方面都发生了重大的变化。目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。为适应实际工作的需要,本文考虑以单片机(IAP15F2K61S2)为控制平台和一个LCD1602A 显示器作为显示部件设计的一种频率计,整个设计采用定时、计数的方法测量频率,不但切实可行,而且体积小、成本低、低功耗、精度高、可自动量程转换、具有存储功能、设计简单,大大降低了设计成本和实现复杂度。频率计的软件部分的单片机控制程序,是以keilu4作为开发工具用C 语言编写而成,而频率计的实现则是选用Proteus 仿真软件来模拟和测试,最后通过综合调试,能实现所有要求的功能,完全满足本次设计的要求。
1.2 设计任务
(1)设计频率测量电路;
(2)测量范围: 10Hz~10KHz。为保证精度分为三个频段; (3)10Hz~100Hz, 100Hz~1KHz, 1KHz~10KHz;
(4)当信号频率超过规定频段上限时,设有超量程报警提示; (5)输入波形:低频函数信号发生器输出的方波,幅度为 5V; (6)测量精度:σ ≤±1%;
(7)显示:要求显示保留小数点后一位,即 99.9Hz, 999.9Hz, 9.99KHz;响应时间小于等于 12 秒;
(8)具有存储上次测频结果的功能; (9)扩展要求:实现量程的自动切换
第二章 概念设计报告
2.1 方案论证
对于频率测量的方案取决于测量频率的范围和测量任务。例如,在实验室中研究频率对谐振回路、电阻值、电容的损耗角或其他被研究的电参量的影响时,能将频率测到
±1⨯10-2量级的精确度或稍高一点就足够啦;对于广播发射机的频率测量,其精确度达到±1⨯10-5量级;对于单边带通信机,则应优于±1⨯10-7量级。由此可见,对频率的测量,不同的侧量对象与任务,其测量精度要求悬殊。测试方法是否简单,所使用的仪器是否可以低廉,完全取决于测量的精度。对于本文要求,测量精度≤±1%,响应时间小于12秒有两种测频方案。
方案一:电子计数法测量频率
根据频率的定义,如某一信号在T 秒时间内重复变化了N 次,则可知该信号的频率为f x =N/T。利用单片机内部的T0定时功能来设定不同的定时时间,在10Hz~5KHz范围内定时时间为10s,在5KHz~10KHz范围内定时定时时间为1s。利用T1计数功能对外部频率进行计数,最后利用公式计算出所测量的频率。此方法编程简单易懂,易于实现。通过误差分析,采用电子技术法测量频率,当所测频率在10Hz~10KHz范围内,测量误差最大为1%,满足题目要求。
方案二:电子计数法测量周期
频率等于周期的倒数,即T=1/fx ,可以通过测量某一信号的周期间接的测量该信号的频率。同样利用单片机内部的T1作为计数功能,与方案一不同的是,T1所记的数是一个周期内所记的脉冲数N1。利用公式T x =N1*T0(T0为记一个数所利用的时间)计算信号的周期,然后利用f x =1/Tx ,即可测出信号的频率。由于一次的计数的个数有限,当频率低于20Hz 时,一次计数难以实现,需要二次计数循环方可实现,增加了程序的复杂性。其次,当测量频率过高时,测周法的误差较大。
综上所述,本文采用方案一电子技术法测量频率。
2.2 电子技术法测量频率工作原理
测频工作原理,利用IAP15F2K61S2单片机内部的定时/计数器T0,和定时/计数器T2结合完成,在初始化IAP15F2K61S2时,把定时/计数器T1设置为计数方式,计数的信号来源于单片机的引脚T1,定时/计数器T0设置为定时方式。测频时,先启动T1的定时过程,同
时启动T0的计数过程,当T0定时结束时,停止T1的计数过程。之后通过读取T1的计数值N,就可以知道在T1所设定的时间t 内,通过计算可以得到输入信号的频率为f= N /t。首先,将T0定时时间设置为1S 时,如果定时结束读取的N 值小于5000时,说明输入信号的频率f5KHz。此时调用1s 测频程序,即将T0定时时间设置为1S,定时结束读取N 值,利用公式:fx=N/T计算所测频率值,送到LCD1602A 液晶屏显示,同时所测结果进行存储。这样,系统即可完成一次频率的测量,同时实现量程的自动切换。当所测量的频率超过45KHz 时,超过数字测频计的量程,控制器通过液晶屏显示****.**来提醒超量程。方案的流程图如图2-1所示。
图2-1 方案流程图
2.3方案设计指标
通过对数字频率计系统的反复调试,可以实现对10Hz~50KHz范围频率的测量,并且测量精度σ ≤±1%,通过软件实现量程的自动切换,显示结果精确到小数点后一位,即99.9Hz、999.9Hz、9.999KHz和19.999KHz。还可以实现对测量的结果进行存储并显示的功能。
第三章 硬件技术设计报告
3.1控制器概述
随着科技水平的不断进步,CPU的器件的成本不断在降低,其集成也在不断地提高,各种机电设备已经或正在嵌入CPU 系统。单片机的种类繁多,其中包括STC89C51RC 系列,例如:STC89C51RC、STC89LE52RC 等;STC89C51RD+系列,例如STC89C54RD+、STC89LE54RD+等;STC15系列,例如:STC15F2K60S2、STC15L2K60S2等。STC89C51RC/STC89C51RD+系列的单片机加密性强、抗干扰性超强、超低功耗、在系统可编程,无需编程器,无需仿真器等。STC15系列单片机超强抗干扰,无法机密;采用STC 第八代加密技术;不需要外部晶振和外部复位电路;可省掉外部EEPROM,利用IAP 技术;ISP/IAP,在线可编程,无需编程器和仿真器;高速8通道10A/D转换器;高速高可靠性等。
IAP15F2K61S2系列单片机是STC 生产的单时钟/机器周期的单片机,是高速、高可靠性、低功耗、超强抗干扰的新一代单片机。采用STC 第八代加密技术,无法解密,指令代码完全兼容传统的8051单片机,但速度块8-12倍。内部集成高精度R/C时钟(±0.3%),±1%温漂,常温下温漂±0.6%,ISP编程时5MHz~35MHz宽范围可设置,可彻底省略掉外部昂贵的晶振和外部复位电路(内部一集成高可靠复位电路,ISP 编程时8级复位电压可选)。3路CCP//PWM/PCA,8路高速10位AD 转换器(30万次/秒),内置2k 字节容量SRAM,2组超高速异步串行通信端口(UART1/UART2,可在5组管脚之间进行切换,分时复用可用作5组串口使用),1组高速同步同步串行通信端口SPI,针对多串行通行端口通信、电机控制、强干扰场合。IAP15F2K61S2单片机的引脚图和主要参数下图所示。
图3-1 IAP15F2K61S2引脚和主要参数
3.2 LCD1602A液晶屏概述概述
工业字符型液晶,能够同时够同时显示16x02即32个字符。(16列2行))。1602液晶也叫1602字符型液晶,它是一种专门用来门用来显示字母、数字、符号等的点阵型液晶模液晶模块。它由若干个5X7或者5X11等点阵字符位组成位组成,每个点阵字符位都可以显示一个字符字符,每位之间有一个点距的间隔,每行之间也有间隔有间隔,起到了字符间距和行间距的作用,正因正因为如此所以它不能很好地显示图形(用自定义定义CGRAM,显示效果也不好)。LCD1602是指显是指显示的内容为16X2, 即可以显示两行,每行16个字符液晶模块(显示字符和数字)个字符。
目前市面上字符液晶绝大多绝大多数是基于 HD44780 液晶芯片的, 控制原控制原理是完全相同的, 因此基于 HD44780 写的控制程序控制程序可以很方便地应用于市面上大部分的字分的字符型液晶。
LCD1602实物图如图3-11所示。
图3-2 LCD1602A实物图
1602液晶模块内部的字符发字符发生存储器(CGROM)已经存储了160个不同个不同的点阵字符图形,这些字符有:阿拉伯数字、英文英文字母的大小写、常用的符号、和日文假名文假名等,每一个字符都有一个固定的代码,比如大写如大写的英文字母“A”的代码是01000001B((41H),显示时模块把地址41H 中的点阵字符图形显图形显示出来,我们就能看到字母“A”。因为1601602识别的是ASCII
码,试验可以用ASCII 码直接赋直接赋值,在单片机编程中还可以用字符型常量型常量或变量赋值,如'A’。以下是1602的16
进制ASCII
码表地址:
图3-3 1602的16进制ASCII 码表地址
3.3硬件焊接与调试
本题目硬件电路比较简单简单,只需要一片IAP15F2K61S2单片机作为控作为控制器和一块LCD1602A 作为显示电路。控制器控制器与液晶屏的连接方式是:控制器的P2口与1602的D0~D7相连,作为数据口;控制口RS、R/W、ERS 分别于控制器P00、P01、P02相连相连。实物焊接与调试图如下图所示。
图3-5 测频页面 图3-4 初始化页面
如上图3-4所示为程序初始序初始化页面,按下开关首先在液晶屏的第一行第一行显示当天时间:2017-01-01,第二行显示:DFMDFM:LFZ。延时一段时间后,对液晶屏显示重显示重新定义,界面如
图3-5所示,液晶屏第一行用来行用来显示实时的测频值,第二行第一部分用来
分用来计时功能,第二部分用来显示前一次的测频值。。
第四章 软件技术设计报告
4.1程序设计思路
软件部分主要完成定时、计数、十六进制转换成BCD 码显示、量程自动切换、超量程报警等功能。总体流程图如图4-1所示。
图4-1 程序流程图
如上图所示为程序流程图,程序有一个主函数和多个子函数组成,大致分为液晶屏LCD1602A 初始化函数,T0、T1定时器初始化函数,粗略测频函数,1s精确测频函数,10s精确测频函数,显示函数和频率存储函数。
图4-2 测量9.90KHz 频率的信号
程序软件调试如下图所示。如图4-2所示为实际仿真的结果,当输入矩形脉冲信号的频率为9.90KHz 时,数字频率计输出显示的结果为9.877KHz,测量精度为
σ=(9.90-9.876)/9.90*100%=0.24%
σ=(11.4-11.4)/1.4*100%=0.0%
图4-3 测量11.4Hz 频率的信号
4.2程序分析
4.2.1
测频程序分析
CePin2()//测量5KHz~45KHz范围的频率
{
}
程序分析:测频程序首先是等待50ms 定时是否结束,当一次定时结束后,对定时器益处标志软件清零,重新打开定时器,重新装载定时器计数初值。检测是否定时时间已经到1s 钟,如果不到,继续等待,如果已经定时1s 钟,重新设置量程切换标志值,并读取计数器计数值,根据公式:f=N/T转化成频率送到液晶屏显示,同时显示前一次测量频率的结果。最后重新装载计数器计数初值。
4.2.2液晶屏显示程序分析
void Display2_frequency()
{
while(TF0==0);//等待定时 TF0=0;//通过软件对定时器益处标志进行清零 TR0=1;//定时器开始计时 TL0=0xb0;//重装定时器的计数初值 TH0=0x3c;//定时时间为50ms js++;//累计定时50ms 次数 if(js==20)//定时1s 是否结束 { } QieHuan=0;//量程切换标志 js=0; jsz=TH1*256+TL1;//16进制计数脉冲数转换为10进制计数脉冲数 frequency=jsz;//将计数脉冲转换为信号频率 CunChu2[Cjs2]=jsz;//将当前测得的频率之存储在数组中 Cjs2++; Display2_frequency();//将当前测得的频率值显示在液晶屏上 Display2_CunChu();//将上次测得的频率值显示在液晶屏上 Cxs2++; TH1=0;//重装计数器的计数初值 TL1=0;
if (frequency>45000)
{
//超量程显示程序 LCD1602_write_com(0x80+5);//数字从第一行第六位开始显示 LCD1602_write_word("***.**");//如果超量程,屏幕上显示此字符 return;
}
if (frequency>=10000)//如果所测评率大于10000Hz,则以KHz 为单位显示结果 {
LCD1602_write_com(0x80+5);//从第一行第六个格开始写数据
LCD1602_write_data(frequency/10000 + 0x30);//取出十位数 LCD1602_write_data((frequency%10000)/1000 + 0x30);//取出个位数 LCD1602_write_data('.');//写小数点 LCD1602_write_data(frequency%1000/100 + 0x30);//取出小数点后第一位 LCD1602_write_data(frequency%100/10 + 0x30); //取出小数点后第二位 LCD1602_write_data(frequency%10 + 0x30); //取出小数点后第三位 LCD1602_write_word("kHz ");//写单位
}
else
{
LCD1602_write_com(0x80+5); LCD1602_write_data(frequency/1000 + 0x30); LCD1602_write_data('.'); LCD1602_write_data(frequency%100/10 + 0x30); LCD1602_write_data(frequency%10 + 0x30); LCD1602_write_word("kHz ");
}
}
程序分析:以上即是显示高频部分的显示函上,它可以根据测量结果的位数,调用显示函数的不同部分,充分利用屏幕有限的空间,而且又美观。除了具有显示显示功能,还具有提示报警功能,即当所测频率超出上限时,显示屏通过显示“***.**”来提示测试者所测频率超量程。
4.2.3量程自动切换程序分析
主函数循环部分:
while(1)
{
switch(QieHuan)
{
case 0:CeZhou();
break;
case 1:CePin1();
break;
case 2:CePin2();
break;
}
}
CeZhou()//粗略测频函数
{
。。。。。。。
if(frequency
{
QieHuan=1;
}
else if(frequency>5000)
QieHuan=2;
}
。。。。。。
}
CePin1()//10秒精确测频函数部分:
{
if(js==201)
{
QieHuan=0;
} } js=0; jsz=TH1*256+TL1; frequency=jsz; 。。。。。。
CePin2()//1秒精确测频函数部分:
{
if(js==20)
}
程序分析:以上程序即是实现量程自动切换功能的函数,该功能有四部分函数共同完成,主要是通过一个函数切换标志来完成的。首先通过函数初始化函数切换标志变量
QieHuan=0使主函数直接调用cezhou()函数,通过侧周函数粗略测出的频率范围,重新定义函数切换标志变量的值(QinHuan=1或2),通过switch()语句调用cepin1()函数或cepin2()函数,但是无论调用那个函数,调用结束后都会将函数切换标志变量重新赋值为0,使主函数再次重新调用cezhou()函数。这样,不仅实现了循环测量的功能,还能实现量程的自动切换功能。虽然软件编程相对手动切换量程复杂一些,但是既节省的硬件成本,又使数字测频计系统便于操作。 { } QieHuan=0; js=0; jsz=TH1*256+TL1; 。。。。。。
4.3误差分析
在测量中,误差分析计算是必不可少的。理论上讲,不管对什么无力量进行测量,不管采用什么样的测量方法,只要进行测量,就可能有误差的存在。误差分析的目的就是找出引起测量误差的主要原因,从而有针对性地采取有效措施,减小测量误差,提高测量精确度。虽然电子技术法测量频率的方法有很多优点,但这种测量方法也存在着测量误差。下面来分析电子计数法测量频率的误差。
由误差传递公式ε=∑j =1m ∂f εj 可对测频公式f x =N/T求得: ∂x j ∆f x ∆N ∆T =- (4-1) f x N T
从式(4.1)可以看出:电子计数法引起频率测量相对误差由计数器计数脉冲相对误差和标准时间相对误差两部分组成。因此,对这两种相对误差可以分别加以讨论,然后相加得到总的频率测量相对误差。
1. 量化误差——±1误差
在测频时,主们的开启时刻与计数脉冲之间的时间关系是不相关的,即他们在时间轴上的相对位置时随机的。如下图所示。
图4-4 量化误差
由图4-4可得:
T =NT x +∆t 1-∆t 2=(N +
∆N =∆t 1-∆t 2 (4-2) T x ∆t 1-∆t 2) T x T x
经过对式(4-2)讨论可得∆N 的取值只有3个可能值,即∆N =0,∆N =1或∆N =-1,所以,脉冲计数最大绝对误差即为±1误差。
∆N =±1 (4-3)
联系式(4.3)和式f x =N/T,可写出脉冲计数最大相对误差为:
∆N 11 (4-4) =±=±N N f x T
式中,fx 为被测信号频率,T为闸门时间。由式(4-4)不难得到结论:脉冲技术相对误
差与被测信号频率与定时时间成反比。被测信号频率越高,定时时间越宽,此项相对误差
越小。
2. 闸门时间误差(标准时间误差)
如果闸门时间不准,造成闸门启闭时间或长或短,显然要产生测频误差。闸门信号T 是通过晶振信号分频得到的。设晶振频率为f c (周期为T c ),分频系数为m,所以有
T=mTc =m/fc (4-5) 由误差合成定理,对式(4-5)进行微分,得
df dT =-c (4-6) T f c
考虑到相对误差定义中使用的时增量符号∆,所以用增量符号代替上使中为分符号,改写为
∆f ∆T =-c (4-7) T f c
式(4.7)表明,闸门时间相对误差在数值上等于晶振频率的相对误差。 结论:计数法测频的总误差为
∆f x ∆f 1=±(+c ) (4-8) f x f x T f c
其关系曲线如图4-5所示。
图4-5 计数器测频时的误差曲线
从图中可见,在f x 一定时,闸门时间T 选的越长,测量准确度越高。而当T 选定后,
f x 越高,则±1
误差对测量结果的影响越小,测量准确度越高。
3. 本文的误差分析
由于晶振的误差与±1误差相差较大,在这里可忽略不计。
1)10s 精确测频误差分析
1∆N 11~±=±1%~±0.002% =±=±5000⨯10N f x T 10⨯10
2)1s精确测频误差分析
1∆N 11~±=±0.02%~±0.01% =±=±10000⨯1N f x T 5000⨯1
由以上误差分析可得,无论是1s 精确测频还是10s 精确测频,其测量精度均满足 σ ≤±1%要求。
第五章 操作手册
5.1数字频率计简介
该数字频率计硬件主要由要由IAP15F2K61S2高速、高可靠性、低功耗、、超强抗干扰的新一代单片机和控制简单,经济实惠的济实惠的工业字符型液晶LCD1602A。没有多余的多余的按键等电路。软件采用最常用的c 语言进编程编程。编程软件采用的是keilu4,该软件占用内占用内存小,操作方便,此外该软自身还具有强大的仿真的仿真功能。该数字频率计的软件仿真采用pro proteus7.8,该软可以对很多元器件进行仿真,也可也可以对功能强大的各种单片机进行编程仿真程仿真,此外该软件还可以与keilu4联合对单片机进行
片机进行单步仿真。各部分实物图如下图所示所示。
图5-1 IAP15F2K61S2单片机
图5-2 数字频率计应用软件
该数字频率计量程为:10Hz
10Hz~45KHz,当被测频率在10Hz~1000Hz范围范围内,以 赫兹(Hz)为单位进行显示,精确到小数点后小数点后第一位,例如:12.8Hz,
123.4Hz。当被测频
被测频率在1KHz~45KHz范围内,以千赫兹(KHz)为单位进为单位进行显示,精确到小数点后第三位,例如例如:4.982KHz,42.638KHz。该数字频率计拥有自拥有自动切换量程功能,不需要手动切换量程量程。当被测频率超出数字频率计被测频率上限时,,显示屏将显示 ***.**KHz,提示工作人员,,被测频率已经超量程。输入波形为方波,幅度为度为 5V。测量精度σ ≤±1%。此外该频率计还率计还具有存储功能。
5.2数字频率计使用步骤
第一步:安装单片机与液晶显示模块;
第二步:连接电源线与程序下载线;
第三步:通过STC 下载器使单片机与电脑建立连接;
第四步:选择单片机型号(IAP15F2K61S2)和晶振频率(12MHz);
第五步:将调好的程序下载到单片机里
第六步:将信号发生器与单片机P3.5管脚相连,同时使信号发生器与单片机共地; 第七步:通过信号发生器给单片机输入任意频率,液晶屏上即可显示测频结果。
图5-3 数字频率计实物图
注意事项:
1、由于该数字频率采用电子计数法测量信号的频率,为了保证测量频率的精度,在测量频率低于5KHz 的矩形脉冲信号时需要等待10s,在测量频率高于5KHz 且低于45KHz 的矩形脉冲信号时只需等待1s 即可。
2、由于单片机所测矩形脉冲峰值电压有限,本电路没有设计限幅电路,在测量信号的频率时,一定要保证所测信号的峰值电压小于等于5v。如果电压过高,可能会对控制器造成损害。
第六章 总结
6.1实验结果
1)下图所示是数字测频计对13.6Hz 的输入信号进行测量,测频计输出频率为13.7Hz,测量精度σ1=((13.7-13.6)/13.6)*100%=0.7%
图6-1 13.6Hz信号的实际测量值实验图
2)下图所示是数字测频计对1.346KHz 的输入信号进行测量,测频计输出频率为
1.349KHz,测量精度σ2=((1.349-1.346)/1.346)*100%=0.2%
图6-2 1.346KHz信号的实际测量值实验图
3)下图所示是数字测频计对8.123KHz 的输入信号进行测量,测频计输出频率为
8.103KHz,测量精度σ3=((8.103-8.123)/8.123)*100%=0.2%
1%,符合课题要求。
图6-3 8.123KHz信号的实际测量值实验图
4) 下图所示是数字测频计对48.379KHz 的输入信号进行测量,由于48.379KHz 超出数字频率计量程,屏幕上显示***.**Hz,以提示所测频率超量程。
图6-4 48.378KHz信号的实际测量值实验图
6.2结论
通过软件仿真与硬件调试,均能实现对10Hz~45KHz范围信号的测量,并通过LCD1602A 液晶显示屏显示测量结果。液晶屏的第二行第一部分显示测量低频的时的响应时间,第二部分显示前一次的测量结果。通过理论计算与实验结果的验证,均能使测量精度σ ≤±1%。在不同的范围内以不同的单位形式显示测量结果。此外还实现了量程自动切换功能。
参 考 文 献
[1] 张杰,杨艳丽,马莉莉,张立倩. 基于单片机C 语言的数字频率计设计.内蒙古农业大学 学报,2007,28-2
[2] 岳亮. 基于单片机的频率计设计.科技资讯,2003:15-007.
[3] 尹国光. 基于单片机的数字频率计的设计和仿真.经验与交流,2008,4.
[4] 沈亚钧.基于单片机的数字频率计设计.山西电子技术,2012,05:0014-03.
[5] 肖春芳,韩绪鹏. 基于单片机控制的数字频率计设计.电子设计工程,2012:20-01
[6] 陈尚松,郭庆,黄新.电子测量与仪器.北京:电子工业出版社,2012,7.
附录
1 系统原理图
附录2 系统PCB 图
附录3 程序清单
1 //作者:李波
2 //单片机:IAP15F2K61S2
3 //内部晶振:12MHz
4 //完成时间:2017-01-06
5 #include
6 #define uchar unsigned char
7 #define uint unsigned int
8 unsigned long price=1230;
9 unsigned long frequency;
10 unsigned int js;
11 unsigned int jsz; //暂时存储
12 unsigned int QieHuan=0;
13 //定时变量设置
14 unsigned int sj;
15 unsigned int shi;
16 unsigned int fen;
17 unsigned int miao;
18 unsigned int haomiao;//每
19 //存储显设置
20 unsigned int CunChu1[20]=0;
21 unsigned int CunChu2[20]=0;
22 unsigned int Cjs1=2;
23 unsigned int Cxs1=0;
24 unsigned int Cjs2=2;
25 unsigned int Cxs2=0;
26 #define LCD1602_PORT P2
27 sbit LCD1602_RS = P0^0;
28 sbit LCD1602_RW = P0^1;
29 sbit LCD1602_EN = P0^2;
30 //**************************************************** 31 //MS
32 //**************************************************** 33 void delay_ms(unsigned int t)
34 {
35 1 int j;
36 1 for( ;t!=0; t--)
37 1 for (j=0;j
38 1 }
39 //**************************************************** 40 //MS
41 //**************************************************** 42 void LCD1602_delay_ms(unsigned int n) T1在1秒内的计数值 50毫秒 延时函数(12M晶振下测试) 延时函数(12M晶振下测试)
43 {
44 1 unsigned int i,j;
45 1 for(i=0;i
46 1 //for(j=0;j
47 1 for(j=0;j
48 1 }
49 //**************************************************** 50 //写指令
51 //**************************************************** 52 void LCD1602_write_com(unsigned char com)
53 {
54 1 LCD1602_RS = 0;
55 1 LCD1602_delay_ms(5);
56 1 LCD1602_EN = 1;
57 1 LCD1602_PORT = com;
58 1 LCD1602_delay_ms(5);
59 1 LCD1602_EN = 0;
60 1 }
61 //**************************************************** 62 //写数据
63 //**************************************************** 64 void LCD1602_write_data(unsigned char dat)
65 {
66 1 LCD1602_RS = 1;
67 1 LCD1602_delay_ms(5);
68 1 LCD1602_PORT = dat;
69 1 LCD1602_EN = 1;
70 1 LCD1602_delay_ms(5);
71 1 LCD1602_EN = 0;
72 1 }
73 //**************************************************** 74 //连续写字符
75 //**************************************************** 76 void LCD1602_write_word(unsigned char *s)
77 {
78 1 while(*s>0)
79 1 {
80 2 LCD1602_write_data(*s);
81 2 s++;
82 2 }
83 1 }
84
85 void Init_LCD1602()
86 {
87 1 LCD1602_EN = 0;
88 1 LCD1602_RW = 0; //设置为写状态
89 1 LCD1602_write_com(0x38); //显示模式设定
90 1 LCD1602_write_com(0x0c); //开关显示、光标有无设置、光标闪烁设置
91 1 LCD1602_write_com(0x06); //写一个字符后指针加一 92 1 LCD1602_write_com(0x01); //清屏指令
93 1 }
94 //显示频率1
95 void Display1_frequency()
96 {
97 1 if (frequency>=10000)
98 1 {
99 2 LCD1602_write_com(0x80+5);
100 2 LCD1602_write_data(frequency/10000 + 0x30);
101 2 LCD1602_write_data('.');
102 2 LCD1602_write_data((frequency%10000)/1000 + 0x30); 103 2 LCD1602_write_data(frequency%1000/100 + 0x30);
104 2 LCD1602_write_data(frequency%100/10 + 0x30);
105 2 LCD1602_write_word("kHz ");
106 2 }
107 1 else if (frequency>=1000)
108 1 {
109 2 LCD1602_write_com(0x80+5);
110 2 LCD1602_write_data(frequency/1000 + 0x30);
111 2 LCD1602_write_data(frequency%1000/100 + 0x30);
112 2 LCD1602_write_data(frequency%100/10 + 0x30);
113 2 LCD1602_write_data('.');
114 2 LCD1602_write_data(frequency%10 + 0x30);
115 2 LCD1602_write_word("Hz ");
116 2 }
117 1 else if (frequency>=100)
118 1 {
119 2 LCD1602_write_com(0x80+5);
120 2 LCD1602_write_data(0x20);
121 2 LCD1602_write_data(frequency%1000/100 + 0x30);
122 2 LCD1602_write_data(frequency%100/10 + 0x30);
123 2 LCD1602_write_data('.');
124 2 LCD1602_write_data(frequency%10 + 0x30);
125 2 LCD1602_write_word("Hz ");
126 2 }
127 1 else
128 1 {
129 2 LCD1602_write_com(0x80+5);
130 2 LCD1602_write_data(0x20);
131 2 LCD1602_write_data(0x20);
132 2 LCD1602_write_data(frequency%100/10 + 0x30); 133 2 LCD1602_write_data('.');
134 2 LCD1602_write_data(frequency%10+ 0x30);
135 2 LCD1602_write_word("Hz ");
136 2 }
137 1 }
138 //存储显示1
139 void Display1_CunChu()
140 {
141 1 if (CunChu1[Cxs1]>=10000)
142 1 {
143 2 LCD1602_write_com(0x80+0x40+8);
144 2 LCD1602_write_data(CunChu1[Cxs1]/10000 + 0x30); 145 2 LCD1602_write_data('.');
146 2 LCD1602_write_data((CunChu1[Cxs1]%10000)/1000 + 0x30); 147 2 LCD1602_write_data(CunChu1[Cxs1]%1000/100 + 0x30); 148 2 LCD1602_write_data(CunChu1[Cxs1]%100/10 + 0x30); 149 2 LCD1602_write_word("kHz ");
150 2 }
151 1
152 1 else if (CunChu1[Cxs1]>=1000)
153 1 {
154 2 LCD1602_write_com(0x80+0x40+8);
155 2 LCD1602_write_data(CunChu1[Cxs1]/1000 + 0x30); 156 2 LCD1602_write_data(CunChu1[Cxs1]%1000/100 + 0x30); 157 2 LCD1602_write_data(CunChu1[Cxs1]%100/10 + 0x30); 158 2 LCD1602_write_data('.');
159 2 LCD1602_write_data(CunChu1[Cxs1]%10 + 0x30); 160 2 LCD1602_write_word("Hz ");
161 2 }
162 1 else if (CunChu1[Cxs1]>=100)
163 1 {
164 2 LCD1602_write_com(0x80+0x40+8);
165 2 LCD1602_write_data(0x20);
166 2 LCD1602_write_data(CunChu1[Cxs1]%1000/100 + 0x30); 167 2 LCD1602_write_data(CunChu1[Cxs1]%100/10 + 0x30); 168 2 LCD1602_write_data('.');
169 2 LCD1602_write_data(CunChu1[Cxs1]%10 + 0x30); 170 2 LCD1602_write_word("Hz ");
171 2 }
172 1 else
173 1 {
174 2 LCD1602_write_com(0x80+0x40+8);
175 2 LCD1602_write_data(0x20);
176 2 LCD1602_write_data(0x20);
177 2 LCD1602_write_data(CunChu1[Cxs1]%100/10 + 0x30); 178 2 LCD1602_write_data('.');
179 2 LCD1602_write_data(CunChu1[Cxs1]%10+ 0x30); 180 2 LCD1602_write_word("Hz ");
181 2 }
182 1 }
183 //显示频率2
184 void Display2_frequency()
185 {
186 1 if (frequency>45000) //超出显示量程
187 1 {
188 2 LCD1602_write_com(0x80+5);
189 2 LCD1602_write_word("---.--");
190 2 return;
191 2 }
192 1 if (frequency>=10000)
193 1 {
194 2 LCD1602_write_com(0x80+5);
195 2 LCD1602_write_data(frequency/10000 + 0x30);
196 2 LCD1602_write_data((frequency%10000)/1000 + 0x30); 197 2 LCD1602_write_data('.');
198 2 LCD1602_write_data(frequency%1000/100 + 0x30); 199 2 LCD1602_write_data(frequency%100/10 + 0x30); 200 2 LCD1602_write_data(frequency%10 + 0x30); 201 2 LCD1602_write_word("kHz ");
202 2 }
203 1
204 1 else
205 1 {
206 2 LCD1602_write_com(0x80+5);
207 2 LCD1602_write_data(frequency/1000 + 0x30); 208 2 LCD1602_write_data('.');
209 2 LCD1602_write_data(frequency%1000/100 + 0x30); 210 2 LCD1602_write_data(frequency%100/10 + 0x30); 211 2 LCD1602_write_data(frequency%10 + 0x30); 212 2 LCD1602_write_word("kHz ");
213 2 }
214 1 }
215 //存储
216 void Display2_CunChu()
217 {
218 1 if (CunChu2[Cxs2]>45000) //超出显示量程
219 1 {
220 2 LCD1602_write_com(0x80+0x40+8);
221 2 LCD1602_write_word("---.--"); 2显示
222 2 return;
223 2 }
224 1 if (frequency>=10000)
225 1 {
226 2 LCD1602_write_com(0x80+0x40+8);
227 2 LCD1602_write_data(CunChu2[Cxs2]/10000 + 0x30);
228 2 LCD1602_write_data((CunChu2[Cxs2]%10000)/1000 + 0x30); 229 2 LCD1602_write_data('.');
230 2 LCD1602_write_data(CunChu2[Cxs2]%1000/100 + 0x30); 231 2 LCD1602_write_data(CunChu2[Cxs2]%100/10 + 0x30); 232 2 LCD1602_write_data(CunChu2[Cxs2]%10 + 0x30); 233 2 LCD1602_write_word("kHz ");
234 2 }
235 1
236 1 else
237 1 {
238 2 LCD1602_write_com(0x80+0x40+8);
239 2 LCD1602_write_data(CunChu2[Cxs2]/1000 + 0x30); 240 2 LCD1602_write_data('.');
241 2 LCD1602_write_data(CunChu2[Cxs2]%1000/100 + 0x30); 242 2 LCD1602_write_data(CunChu2[Cxs2]%100/10 + 0x30); 243 2 LCD1602_write_data(CunChu2[Cxs2]%10 + 0x30); 244 2 LCD1602_write_word("kHz ");
245 2 }
246 1 }
247 //定时计数器初始化
248 Init_timer()
249 {
250 1 TMOD=0x51;//T0
251 1 TL0=0xb0;
252 1 TH0=0x3c;
253 1 TL1=0x0;
254 1 TH1=0x0;
255 1 TR0=1;
256 1 TR1=1;
257 1 EA=1;
258 1 }
259 //时间显示函数
260 void Display_shijian()
261 {
262 1 LCD1602_write_com(0x80+0x40+2);
263 1 LCD1602_write_data(miao/10+0x30);
264 1 LCD1602_write_data(miao%10+0x30);
265 1 }
266 //定时函数 定时,T1计数,工作方式01
267 DingShi()
268 {
269 1 miao++;
270 1 Display_shijian();
271 1 }
272 //测量频率,满足哪种测频函数
273 CeZhou()
274 {
275 1 if(TF0==1)
276 1 {
277 2 TF0=0;
278 2 TR0=1;
279 2 TL0=0xb0;
280 2 TH0=0x3c;
281 2 js++;
282 2 if(js==21)
283 2 {
284 3 js=0;
285 3 jsz=TH1*256+TL1;
286 3 frequency=jsz;
287 3 if(frequency
288 3 {
289 4 QieHuan=1;
290 4 }
291 3 else if(frequency>5000)
292 3 {
293 4 QieHuan=2;
294 4 }
295 3
296 3 TH1=0;
297 3 TL1=0;
298 3 js=0;
299 3 sj=0;
300 3 miao=0;
301 3 }
302 2 }
303 1 }
304 //被测频率小于
305 CePin1()
306 {
307 1 while(TF0==0);
308 1 TF0=0;
309 1 TR0=1;
310 1 TL0=0xb0;
311 1 TH0=0x3c; 5kHz
312 1 js++;
313 1 sj++;
314 1 if(sj==20)
315 1 {
316 2 sj=0;
317 2 DingShi();
318 2 }
319 1 if(js==201)
320 1 {
321 2 QieHuan=0;
322 2 js=0;
323 2 jsz=TH1*256+TL1;
324 2 frequency=jsz;
325 2 CunChu1[Cjs1]=jsz;
326 2 Cjs1++;
327 2 if(Cjs1==19)
328 2 {
329 3 Cjs1=0;
330 3 }
331 2 Display1_frequency();
332 2 Display1_CunChu();
333 2 Cxs1++;
334 2 if(Cxs1==19)
335 2 {
336 3 Cxs1=0;
337 3 }
338 2 TH1=0;
339 2 TL1=0;
340 2 }
341 1 }
342
343 //被测频率大于
344 CePin2()
345 {
346 1 while(TF0==0);
347 1 TF0=0;
348 1 TR0=1;
349 1 TL0=0xb0;
350 1 TH0=0x3c;
351 1 js++;
352 1 if(js==20)
353 1 {
354 2 QieHuan=0;
355 2 js=0;
356 2 jsz=TH1*256+TL1; 5kHz
357 2 frequency=jsz;
358 2 CunChu2[Cjs2]=jsz;
359 2 Cjs2++;
360 2 if(Cjs2==19)
361 2 {
362 3 Cjs2=0;
363 3 }
364 2 Display2_frequency();
365 2 Display2_CunChu();
366 2 Cxs2++;
367 2 if(Cxs2==19)
368 2 {
369 3 Cxs2=0;
370 3 }
371 2 TH1=0;
372 2 TL1=0;
373 2 }
374 1 }
375
376 void main()
377 {
378 1 Init_LCD1602(); //初始化
379 1 LCD1602_write_com(0x80); //指针设置 380 1 LCD1602_write_word(" 2017 01 01 "); //
381 1 LCD1602_write_com(0x80+0x40); //指针设置 382 1 LCD1602_write_word(" DFM:LFZ ");
383 1 delay_ms(6000);
384 1 LCD1602_write_com(0x80); //指针设置 385 1 LCD1602_write_word("Freq:000.00Hz "); 386 1 LCD1602_write_com(0x80+0x40); //指针设置 387 1 LCD1602_write_word("T:00 Cc:000.00Hz "); 388 1 delay_ms(100);
389 1 Init_timer();
390 1 js=0;
391 1 sj=0;
392 1 while(1)
393 1 {
394 2 switch(QieHuan)
395 2 {
396 3 case 0:CeZhou();
397 3 break;
398 3 case 1:CePin1();
399 3 break;
400 3 case 2:CePin2();
401 3 break; LCD1602
402 3 }
403 2 }
404 1 }
C51 COMPILATION COMPLETE. 5 WARNING(S), 0 ERROR(S)