1、目录一、设计目的2二、设计要求2三、总体设计2二、系统设计7图1411三、数字频率计的设计与仿真12四 、数字频率计的仿真14五、设计总结17一、设计目的 本应用系统设计的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。二
2、、设计要求 利用单片机的定时器/计数器定时和计数,计算出频率,用LED数码管显示出来。三、总体设计本课题设计的是一种以单片机为主控制的频率计。该频率计首先是以信号放大整形后的方波对不同频率范围的信号直接由接口电路送给单片机, 由单片机的计数器对其进行计数,最后通过显示电路显示数值。数字频率计主要由以下几部分组成:(1)时基电路;(2)逻辑控制电路;(3)可控制的显示电路。因为单片机内部振荡频率很高, 所以一个机器周期的量化误差相当小, 可以提高低频信号的测量的准确性。 本课题主要是以单片机AT89C52 为核心, 通过计数电路, 以及软件程序的编写, 实现脉冲频率的显示。整体设计思路可用框图1
3、 表示。框图中各部分的作用及所采用的器件说明如下:待测信号 否停止译码 AT89C52单片机 有效位判断?是数据显示电路 图1 设计思路框图3.1控制电路 如图2,控制电路是整机电路设计成败的关键。它逻辑性强,时序关系配合得当。控制电路的作用是:产生一锁存保持信号,使1S内的计数结果显示一段时间,以便观察,下一步输出零锁存,通过按键使计数器的原纪录数据清零,准备下次计数。控制电路产生的锁存信号应在1S计数结束,零信号应在锁存信号产生后产生。在实际应用中,选用74LS08实现,其引脚如图2.2所示。 图2 逻辑控制电路 3.2 单片机部分 本次设计采用了AT89C52 单片机, AT89C52是
4、低电压, 高性能CMOS8 位单片机, 片内含8kbyte 的可反复擦写的只读程序存储器。如图3所示 图3 AT89C52引脚图系统板上硬件连线 :(1)把“单片机系统”区域中的P0.0P0.3与共阳极数码管驱动器74LS47的A、B、C、D引脚相连,再把驱动器与“动态数码显示”区域中ABCDEFG端口用7芯排线连接。(2 把“单片机系统”区域中的P2.0P24与“动态数码显示”区域中的1、2、3、4、5端口用5芯排线连接。 (3)把“单片机系统”区域中的P3.5(T1)端子用导线连接到“频率源”区域中的端子上。 (4) 把P1.0、P1.2与按键连接。3.3 数据显示电路数据显示电路由限流电
5、路和7段数码管组成, 采用器件LED 显示器。LED 显示器的结构由发光二极管构成a、b、c、d、e、f和g 七段, 并由此得名。本设计中采用了六个七段数码管进行数据显示, 将五个数码管串接起来进行显示, 显示数据即是对频率计的测量结果。如图4所以: 图4 显示电路图其流程框图如图5所示。开 始拆解采集数据置段码、位选码值位选码送P2口段选码送P0口 图5 LED动态显示流程图3.4 软件设计流程图本设计中软件流程如图6 所示。数据显示部分完成信号的周期测后,将数据拆解成各个为,然后送出显示。开始 入口 频率计数 系统初始化 显示 图6 软件设计流程图四、各部分电路设计一、频率测量原理在电子技
6、术中, 频率是最基本的参数之一, 并且与许多电参量的测量方案、测量结果都有十分密切的关系,本次设计的频率测量系统以单片机AT89C52 为核心, 采用C语言和直接测量方法, 成功地实现了,高精度的数字频率计的设计和仿真。4.1.1 测量频率的原理在共定时20次,即可完成1秒的定时功能。测量过程中定时/计数器T0和T1的工作方式设置,由图可知,T1是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T1,最大计数值为fOSC/24,由于fOSC12MHz,因此:T1的最大计数频率为0.5mHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T0工作在定时状态下,每定时1
7、秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。T0工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,4.1.2 直接测频法频率测量的基本原理如图7所示。计数器显示 控制过程时间闸门晶体振荡放大整形 图7 直接测频法的原理框图 图中晶体振荡提供了测量的时间基准,经放大整形后的测量信号进入计数器进行计数,再由显示电路显示数据结果。 二、系统设计4.2.1 功能实现 本次采用单片机设计的数字频率计主要实现以下几个功能:(1)用5位数码管显示HZ、KHZ 2个频段的待测脉冲信号的频率值。(2)频率测量范围从1HZ65
8、KHZ。(3)能测量正弦波,三角波,锯齿波等多种波形信号的频率值。4.2.2 硬件部分设计 由于输入的信号幅度是不确定、可能很大也有可能很小,这样对于输入信号的测量就不方便了,过大可能会把器件烧毁,过小可能器件检测不到,所以在设计中采用了这个信号调理电路对输入的波形进行阻抗变换、放大限幅和整形。频率计由单片机AT89C52 、信号预处理电路、测量数据显示电路所组成,其中信号预处理电路包括待测信号放大、波形变换和波形整形。系统硬件实现框图如图8所示。待测电路放大电路波形变换、整形 单片机 显示电路 图8 系统硬件实现框图 4.2.3 信号处理电路 信号放大电路对比选择方案一:用运算放大器实现小信
9、号放大、大信号限幅,用集成芯片,电路简单,容易实现。但运算放大器对电源要求要高一些,现有条件有限无法满足,而且普通运算放大器如LM358不适用于较高频率。方案二:采用三极管对信号放大限幅,可实现较小信号放大,如图9两级放大电路。能达到基本要求,并且上限频率高。不过也要求用9V以上电源,并且由于有隔直流电容存在,对低频信号有较大影响。方案三:用单个三极管放大、限幅。不需要电容,而且5V电源足以。三极管基射极用被测信号实现偏压,所以不能测量较小信号,信号峰值电压最低0.8V。测量电路简单易于实现。通过以上三种方案对可知方案三最适宜,电路如图10。 图9 放大电路 图10 放大电路 三极管采用共发射
10、极方式,主要作用是放大非常弱的输入脉冲信号,一般通过它的放大后,其电压可以达到4伏以上。4.2.4 单片机AT89C52在实际的设计中,将AT89C52的P1口设置为接收数据及控制位端口,将P3口设置为第二功能。P3.5用于直接测频率时脉冲信号的计数端;P3.4用于定时。将P0口和P2口设置为发送数据端口。P0口的各引脚接到RP1的输入端,用于段驱动;P2口用于位驱动。单片机复位端(RST)可采用内部软件复位,也可采用外部手动复位,实际操作也很方便。这里采用外部手动复位,为图11。且晶体振荡器电路如图12所示: 图11 复位电路 图12 晶体振荡器电路 4.2.5 测量数据显示电路如图13所示
11、。一般而言,数据显示有静态显示和动态显示两种。所谓静态显示,就是当显示器显示某一个字符时,相应的发光二极管恒定地导通和截止。它的优点是显示稳定,显示亮度大;缺点是使用的数码管数量少。正是因为它的这个缺点和本设计的要求,数字频率计的显示电路选择了采用动态扫描显示。所谓动态显示,就是LED显示器一位一位地轮流电亮(扫描)。对于每一位LED显示器来说,每隔一段时间点亮一次。LED 显示器的亮度既与导通电流有关,也与LED显示器点亮时间和间隔时间的比例有关。通过调整LED显示器的导通电流和时间比例参数,可以实现较高亮度且稳定的显示。具体工作过程是:LED显示器采用共阳极动态显示形式。频率计数结果存放在
12、89C52的存储单元中,通过P0口接到74LS47上,控制6位LED的段选码;通过P2口控制6位LED的位选码。RP1是8位总线驱动器。另外,由于51单片机的P0口没有上拉电阻,在将P0口设置为输出端时,必须考虑在段驱动的每一段位上接入上拉电阻,使LED显示管能够工作。 图13 测量数据显示电路4.2.6 硬件电路工作过程首先讨论定时器/计数器的工作。当时,定时器工作在定时方式。加1计数器对脉冲f进行计数,每来一个脉冲计数器加1,直到计数器计满溢出。由上图可以看出,脉冲是振荡器时钟频率的12分频,即脉冲频率为时钟频率的1/12。显然,一个计数脉冲的周期为一个机器周期。计数器计数的是机器周期脉冲
13、的个数,从而实现定时。可知,定时器的定时时间不仅与加1计数器的初值(计数器中的起始值,即计数长度)有关,而且还与系统振荡器时钟频率有关。当控制信号时,定时器工作在计数方式。加1计数器对来自输入引脚T0和T1的外部信号脉冲计数。4.2.6 直接测频法的工作流程74HC14显示AT89C52 T0P3.0 图14 前置放大器完成信号放大、电平平移的任务,被测的交流信号被放大、平移成脉冲直流信号,再经74HC14反相器整形成矩形脉冲。方波信号被送到与门的一个输入端,与门的另一个输入端连接1s门控信号,实际制作中连接AT89C52的8脚(P1.7)。8脚电平的高低可通过指令加以控制。AT89C52外接
14、晶振12MHz,该晶振的频率稳定性很重要,因为它也是门控信号的时间基准。内置计数器可通过软件设置对振荡频率的l2分频进行计数/定时,这里将T1置为方式1计数状态,GATE=0,即D3D2D1D0=0101(表1、表3所示),待测脉冲信号通过T1引脚输入单片机进行计数。T0置为方式1定时状态,GATE=0。即D7D6D5D4=1001(如图12、表2、表3所示),并将其初值置为TH1=D8H,TL1=EF,这样每产生一次定时器T0溢出中断,这里采用查询方式,设置标志位当计数。当计数次数为次时,历时1s。1s后关闭闸门,然后进行显示。 表1 定时器/计数器方式控制寄存器TMODD7D6D5D4D3
15、D2D1D0GATE M1M0 GATE M1M0定 时 器 T1定 时 器 T0表2 M1和M2方式选择位对应关系M1 M0工作方式 功 能 说 明0 1 方式0 13位计数器0 1 方式1 16位计数器1 0 方式2 自动再装入计数初值,8位计数器1 1 方式3定时器T0:分成两个8位计数器;定时器T1:停止计数三、数字频率计的设计与仿真电路的基本功能是实现电子产品开发设计的技术和功能,使电路具有某种特定功能,必须进行电路的设计和制作。设计是是某一电路具有某种功能,制作则是设计过程的电路实物化。4.3.1电路设计的内容和方法电路设计一般包括:拟定性能指标,电路的预设计,实验和修改设计等环节
16、。衡量设计的标准是:工作稳定可靠,能达到所要求的性能指标,并留有适当的余量;电路简单,成本低;所采用的元器件品种少、体积小;便于测试和维修。电路设计的基本方法为:借鉴设计法、近似设计法、分解组合设计法。1、电路设计的基本内容电路设计的基本内容主要包括以下几个方面:电路设计的技术的先结条件。选择合适的元器件的种类。设计电路原理图。接线图、安装图、装配图。制定电机和电子元器件明细表。画出电路的总布局图。设计电路板、接线板以及安装零件。编写程序和计算说明书。2、电路设计的基本方法(1)借鉴设计法接到设计任务或确定设计目标后,进行调查研究,选取可以借用或借鉴的实用电路。一般情况下,有许多原理和技术上可
17、以借用的电路,设计人员得对电路进行改进和元件调整,以适应设计需要。借用的电路已经经过实践和时间的考验,更有工程价值,这样做不仅可以缩短设计周期,而且新设计的电路在技术,性能,成本等各方面都得到提高;这样才会被工程上接受。(2)近似设计法近似设计法是电路设计的又一种方法。在实际应用中,理论可以给设计者一个清晰的思路,但理论与实际不同。在电路设计中,由于元件受多方因素的影响,往往采取“定性分析、定量估算、实验调整”的方法,所以只需进行粗略计算,帮助近似确定电路参数的取值范围,参数的具体确定借助于实验调整和计算机仿真来完成。(3)分解、组合设计法在设计电路时,电子线路按照功能的不同可以划分为各个子模
18、块,各模块参照具体电路进行设计,然后组合统调。由功能电路组合成大系统时,由于子模块之间存在负载效应的影响,而使电子产品整体性能下降。因此,在由大系统分解为子系统时,不仅要注意功能分解,而且还要合理分配性能指标。4.3.2电路设计的步骤1课题分析根据论文的要求,先弄清楚论文要实现的功能和原理,再确定电路的基本形式,根据论文的可行性作出估计和判断,确定论文的技术关键解决的问题。2设计方案论证选题不管那种(除了调查研究之外)都要论证它的可行性。论证分立论和驳论两种。3总体方案的选择根据任务书提出的任务、要求和性能指标,用具有一定功能的单元电路组成一个整体,来实现各项功能,满足设计题目提出的要求和技术
19、指标。4单元电路的设计与确定在确定总体方案、画出详细框图之后,便可进行单元电路设计。在电路结构简单,成本低,性能强的基础上,根据设计要求和总体方案的原理框图来确定各单元电路要求。设计每一个单元的电路图根据相关资料确定单元电路的结构形式。根据设计要求,调整元件,估算参数来选择元器件,。5总电路图画法总电路图的一般方法如下:根据信号的流向,从左到右或从上到下按信号流向依次画出各单元电路。尽量把总电路图画在一张图样上电路中所有连线都要表示清楚,各元件间的绝大多数连线应在图样上直接画出。符号应标准化。先画草图,调整好布局和连线后,再画出正式的总电路图。5审图由于有些问题考虑不周,各种计算可能出现错误,
20、所以,在画出总电路图并计算全部参数之后,要进行全面审查。 四 、数字频率计的仿真 根据电路图,各单元电路之间的连接关系,以及用哪些元器件进行仿真,由于是初学者经验不足,没有实际应用过,单凭看资料很难掌握它们内容。设计时难免考虑不周、出现差错,单是纸上谈兵,想使自己设计的电路完美无误是不可能的,所以,必须进行仿真。在仿真过程中会遇到问题要善于理论联系实际,深入思考,分析原因,找出解决问题的办法。通过前面总的设计框图,我们初步搭建了数字频率计设计的框架结构。下面仿真结果如图15所以: 图15 系统仿真电路图输入信号为1HZ时,仿真如下: 图16 系统仿真图输入信号为100HZ时,仿真如下:图17
21、系统仿真图输入信号为500HZ时,仿真如下:图18 系统仿真图输入信号为50KHZ时,仿真如下:图19 系统仿真图输入信号为65536HZ时,仿真如下:图20 系统仿真图输入信号为556.5HZ时,仿真如下:图21 系统仿真图从以上的仿真结果可以得出:在所测量的频率范围,频率越小仿真结果越精确,频率越高就会出现一定的误差,当频率超过65536HZ时,就仿真不出其正确结果。五 减小误差措施及扩展方面 减小误差措施(1)选用频率较高和稳定性好晶振。如选12MHZ的晶振,稳定性好的晶振可以减小误差。(2)用程序定时必定会引入时差,对频率测量造成一定影响,可通过仿真不断调整程序定时初值设置,减少误差。
22、扩展方面(1)由于单片最高可测频率受片机限制,不超过500KHZ,为实现高频率测量,可在单片机测量信号输入端接分频器,如74ls74。可以实现量程转换。 五、设计总结1、设计过程中遇到的问题及解决方法问题一:如何用单片机定时器实现1s定时?解决办法:单片机定时器零最大定时时间为65536us,截取50ms,循环20次即为1s。问题二:如何用硬件电路控制被测信号输入时间在1s内?解决办法:从单片机引出控制端,接74ls04的一端,输入信号接另一端。定时开始,是控制端输出保持高电平状态,1s后归零,即达到测量目的。问题三 :如何实现信号的预处理?解决办法:预处理电路包括三极管、斯密特触发器,能完成
23、对信号的放大、限幅、整形滤波等功能。是输入信号达到单片机要求。2、设计体会 课程设计是一项综合性很强的工作。是实践与理论的结合。要求我们对单片机的工作原理有一个基础的认识,并涉及到模拟电子、数字电子、proteus仿真等知识,同时也是实践能力的锻炼。实物的制作要比理论困难得多,由于是初次动手制作,所以就更困难了。首先要确定设计方案,更具设计方案选着所需原件,开始对各个元件一无所知,而且它们并不像书上那么简单,所以只能在网上一个一个查找了解它们的用法 。其次是根据仿真图布局实物电路,焊接电路板段初学者也是一项艰难的任务,只用多练习,才能提高焊接水平。最后就是调试,在软件上仿真成功,并不代表实物一
24、步成功,所以要不断调试使其达到预期目的。只有经过不懈的努力,才能取得胜利的果实。万事开头难。几经调试不成功,有一种让人崩溃的感觉,不够坚持才有希望。此次课程设计不仅让我学到了更多的知识,而且明白了实践的重要,毅力的可贵。3、对设计的建议 做实物前应在软件上仿真,之后用面包板搭接线路看是否得到预期效果,然后再根据仿真图焊接电路。软件仿真图要反复实验、改进,应使所需连线最少,这样有利于硬件焊接。 #include#include#define uchar unsigned char#define uint unsigned intsbit key0=P10;sbit key1=P12;sbit l
25、ed17=P17;uint num , pinlv;uchar a ,b ,c ,d ,e ,a1 ,b1 ,c1, d1 ,e1;void delayms(xms)uint i, j;for(i=xms;i0;i-) for(j=110;j0;j-);uint time1()uchar i;TH1=0;TL1=0;for(i=0;i20;i+) TH0=15536/256; TL0=15536%256; led17=1; TR0=1; while(TF0); TF0=0; led17=0; TR0=0; pinlv=TH1; pinlv=10000) wei1(a1,a); wei1(b1,
26、b); wei1(c1,c); wei1(d1,d); wei1(e1,e); else if(num1=1000) wei1(b1,b); wei1(c1,c); wei1(d1,d); wei1(e1,e); else if(num1=100) wei1(c1,c); wei1(d1,d); wei1(e1,e); else if(num1=10) wei1(d1,d); wei1(e1,e); else wei1(e1,e); uint keyscan() if(key0=0) delayms(10); if(key0=0) time1(); num=pinlv; return(num)
27、; void keyscan1() if(key1=0) delayms(10); if(key1=0) P0=0; P2=5; void main() TMOD=0x51; EA=0;TR1=1; while(1) keyscan(); a=num/10000; a1=1; b=num%10000/1000; b1=2; c=num%10000%1000/100; c1=3; d=num%10000%1000%100/10; d1=4; e=num%10000%1000%100%10; e1=5; display(num); keyscan1(); #include#include#defi
28、ne uchar unsigned char#define uint unsigned intsbit key0=P10;sbit key1=P12;sbit led17=P17;uint num ,pinlv;void delayms(xms)uint i, j;for(i=xms;i0;i-) for(j=110;j0;j-);uint time1()uint i;TH1=0;TL1=0;for(i=0;i20;i+) TH0=15536/256; TL0=15536%256; led17=1; TR0=1; while(TF0); TF0=0; led17=0; TR0=0; pinlv
29、=TH1; pinlv=10000) a=num1/10000; P0=a; P2=1; b=num1%10000/1000;P0=b; P2=2; c=num1%10000%1000/100;P0=c; P2=4; d=num1%10000%1000%100/10; P0=d; P2=8; e=num1%10000%1000%100%10; P0=e; P2=32; else if(num1=1000) b=num1/1000;P0=b; P2=2; c=num1%1000/100;P0=c; P2=4; d=num1%1000%100/10; P0=d; P2=8; e=num1%1000
30、%100%10; P0=e; P2=32; else if(num1=100) c=num1/100;P0=c; P2=4; d=num1%100/10; P0=d; P2=8; e=num1%100%10; P0=e; P2=32; else if(num1=10) d=num1/10; P0=d; P2=8; e=num1%10; P0=e; P2=32; else P0=e; P2=32; void main() TMOD=0x51; EA=0;TR1=1; while(1) keyscan(); display(num); #include#define uchar unsigned
31、char#define uint unsigned intsbit key0=P10;sbit key1=P12;sbit led17=P17;uint num ,pinlv;void delayms(xms)uint i, j;for(i=xms;i0;i-) for(j=110;j0;j-);uint time1()uint i;TH1=0;TL1=0;for(i=0;i20;i+) TH0=15536/256; TL0=15536%256; led17=1; TR0=1; while(TF0); TF0=0; TR0=0;led17=0; pinlv=TH1; pinlv=pinlv8;
32、 pinlv=pinlv|TL1; return(pinlv); uint keyscan() if(key0=0) delayms(10); if(key0=0) time1(); num=pinlv; return(num); void display(uint num1) uchar a ,b ,c ,d ,e ; a=num1/10000; P2=1; P0=a; b=num1%10000/1000;P2=2;P0=b; c=num1%10000%1000/100; P2=4;P0=c; d=num1%10000%1000%100/10; P2=8;P0=d; e=num1%10000
33、%1000%100%10; P2=16;P0=e; void main() TMOD=0x51; EA=0;TR1=1; while(1) keyscan(); display(num); #include#include#define uchar unsigned char#define uint unsigned intsbit key0=P10;sbit key1=P12;sbit led17=P17;uint num ,pinlv;void delayms(xms)uint i, j;for(i=xms;i0;i-) for(j=110;j0;j-);uint time1()uint
34、i;TH1=0;TL1=0;for(i=0;i20;i+) TH0=15554/256; TL0=15554%256; TR0=1;led17=1; while(TF0); TF0=0; led17=0; TR0=0; pinlv=TH1; pinlv=pinlv8; pinlv=pinlv|TL1; return(pinlv); uint keyscan() if(key0=0) delayms(10); if(key0=0) while(key0); time1(); num=pinlv; return(num); void display(uint num1) uchar a ,b ,c
35、 ,d ,e ; a=num1/10000; P2=1; P0=a; b=num1%10000/1000;P2=2;P0=b; c=num1%10000%1000/100; P2=4;P0=c; d=num1%10000%1000%100/10; P2=8;P0=d; e=num1%10000%1000%100%10; P2=16;P0=e; void main() TMOD=0x51; EA=0;TR1=1; while(1) keyscan(); display(num); if(key1) delayms(8); if(key1) while(key1); num=0; P0=0; P2=16;