单片机课程设计(数字频率计).doc
单片机原理与应用课程设计报告一、任务技术指标根据单片机课程所学内容,结合其他相关课程知识,设计一个数字频率计,以加深对单片机知识的理解,本设计以MCS-51系列单片机为核心,采用常用电子器件设计。利用单片机的定时器和计数器实现对方波信号的频率测量,闸门时间可选0.1秒、1秒、10秒,采用六位LED显示测量的频率。二、总体设计思想1、基本原基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等于1s。闸门电路由标准秒信号进行控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。本系统采用测量频率法,可将频率脉冲直接连接到AT89C51的T0端,将T/C1用做定时器。T/C0用做计数器。在T/C1定时的时间里,对频率脉冲进行计数。在1S定时内所计脉冲数即是该脉冲的频率。见图1:图1测量时序图由于T0并不与T1同步,并且有可能造成脉冲丢失,所以对计数器T0做一定的延时,以矫正误差。具体延时时间根据具体实验确定。2、系统框图本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有分频器、显示器等器件。可分为以下几个模块:放大整形模块、秒脉冲产生模块、换档模拟转换模块、单片机系统、LCD显示模块。 图2系统框图三、具体设计1.总体设计电路图3频率计原理图2.模块设计(1)、硬件系统构成:本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有分频器、显示器等器件。可分为以下几个模块:放大整形模块、秒脉冲产生模块、换档模拟转换模块、单片机系统、LCD显示模块。系统框图如下图2:图2系统框图(2)、AT89C51单片机及其引脚说明:89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器, 一个5中断源两个优先级的中断结构,一个双工的串行口, 片上震荡器和时钟电路。引脚说明:·VCC:电源电压·GND:地·P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。·P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。·P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓冲能驱动4个TTL逻辑门电路。当向P2口写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的多种特殊功能,具体如下表1所示:端口引脚第二功能P3.0RXD (串行输入口)P3.1TXD(串行输出口)P3.2 (外部中断0)P3.3(外部中断1)P3.4T0(定时器0)P3.5T1(定时器1)P3.6(外部数据存储器写选通)P3.7(外部数据存储器都选通)表1 P3口的第二功能·RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。·ALE/:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。当在Flash编程时还可以作为编程脉冲输出()。一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。·:程序存储允许时外部程序存储器的读选通信号。当AT89C52执行外部程序存储器的指令时,每个机器周期两次有效,除了当访问外部数据存储器时,将跳过两个信号。·/VPP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,必须同GND相连接。需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。当执行内部编程指令时,应该接到VCC端。·XTAL1:振荡器反相放大器以及内部时钟电路的输入端。·XTAL2:振荡器反相放大器的输出端。在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合D触发器CD4013,分频器CD4060,模拟转换开关CD4051,计数器74LS90等数字处理芯片,主要控制两大硬件模块,量程切换以及显示模块。下面还将详细说明。 (3)、信号调理及放大整形模块: 放大整形系统包括衰减器、跟随器、放大器、施密特触发器。它将正弦输入信号Vx整形成同频率方波Vo,幅值过大的被测信号经过分压器分压送入后级放大器,以避免波形失真。由运算放大器构成的射级跟随器起阻抗变换作用,使输入阻抗提高。同相输入的运算放大器的放大倍数为(R1+R2)/R1,改变R1的大小可以改变放大倍数。系统的整形电路由施密特触发器组成,整形后的方波送到闸门以便计数。由于输入的信号幅度是不确定、可能很大也有可能很小,这样对于输入信号的测量就不方便了,过大可能会把器件烧毁,过小可能器件检测不到,所以在设计中采用了这个信号调理电路对输入的波形进行阻抗变换、放大限幅和整形,信号调理部分电路具体实现电路原理图和参数如下图4: 图4 信号放大模块电路图(4)、时基信号产生电路:CD4013-双上升沿D触发器 ,引脚及功能见如下图5:图5 D触发器引脚及功能图 CD4013 由两个相同的、相互独立的数据型触发器构成。每个触发器有独立的数据置位复位时钟输入和 Q及Q非输出。此器件可用作移位寄存器,且通过将Q非输出连接到数据输入,可用作计数器和触发器。在时钟上升沿触发时,加在D 输入端的逻辑电平传送到Q输出端。置位和复位或复位线上的高电平完成。 CD4060-14位二进制串行计数器,引脚及功能见如下图6: CD4060 由一震荡器和14极二进制串行计数器位组成,震荡器的结构可以是RC或晶振电路。CR为高电平时,计数器清零且振荡器使用无效,所有的计数器位均为主从触发器 CP1非(和 CP0)的下降沿计数器以二进制进行计数,在时钟脉冲线上使用施密特触发器对时钟上升和下降时间无限制。 图6 进制串行计数器引脚及功能图 时基信号的产生原理: 本电路采用32768HZ晶体震荡器,利用CD4060芯片经过14级分频得到2HZ的信号(32768/214),在经过CD4013双D触发器经过二分频得到0.5HZ的方波,即输出秒脉冲信号使单片机进行计数。(5)、显示模块1602基本技术:1)、主要功能A、 40通道点阵LCD 驱动;B、 可选择当作行驱动或列驱动;C、 输入/输出信号:输出,能产生20×2个LCD驱动波形;输入,接受控制器送出的串行数据和控制信号,偏压(V1V6); D、 通过单片机控制将所测的频率信号读数显示出来。2)、技术参数2.1)极限参数表2:名 称符 号标 准 值单 位MINTYPEMAX电路电源VDD - VSS-0.37.0VLCD驱动电压VDD - VEEVDD - 13.5VDD + 0.3V输入电压VIN-0.3VDD + 0.3V静电电压-100V工作温度-20+70°C储存温度-30+80°C表2 极限参数表2.2) 电参数表3:名 称符 号测 试 条 件标 准 值单位MINTYPEMAX输入高电平VIH-2.2VDDV输入低电平VIL-0.30.6V输出高电平VOHIOH = 0.2mA2.4-V输出低电平VOLIOL = 1.2mA-0.4V工作电流IDDVDD = 5.0V2.0mA液晶驱动电压VDD- VEETa = 0°C4.9VTa = 25°C4.7Ta = 50°C4.5表3 电参数表3)、时序特性表4:项 目符 号测试条件标 准 值单位MINTYPEMAX允许时间周期TCYCE5.1a 5.1b1000ns允许脉冲宽度,高电平PWEH450-ns允许上升和下降时间tEr tEf-25ns地址建立时间tAS140-ns数据延迟时间tDDR-320ns数据建立时间tDSW195-ns数据保持时间tH10-nsDATA HOLD TIMEtDHR20-ns地址保持时间tAH10-ns表4 时序特性表4)、引脚和指令功能4.1)模块引脚功能表5:引 线 号符 号名 称功 能1Vss接地0V2VDD电路电源5V±10%3VEE液晶驱动电压保证VDD-VEE=4.55V电压差4RS寄存器选择信号H:数据寄存器 L:指令寄存器5R/W读/写信号H:读 L:写6E片选信号下降沿触发,锁存数据7|14DB0|DB7数据线数据传输表5 模块引脚功能表4.2)寄存器选择功能表6:RSR/W操 作00指令寄存器(IR)写入01忙标志和地址计数器读出10数据寄存器(DR)写入11数据寄存器读出表6 寄存器功能选择表4.3) 指令功能 格式:RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0共11种指令:清除,返回,输入方式设置,显示开关,控制,移位,功能设置,CGRAM地址设置,DDRAM地址设置,读忙标志,写数据到CG/DDRAM,读数据由CG/DDRAM。5)、显示位与DD RAM 地址的对应关系表7: 显 示 位 序 号1 2 3 4 5 40 DD RAM 地 址(HEX)第 一 行00 01 02 03 04 . 27第 二 行40 41 42 43 44 . . 67表7 显示位与DD RAM地址关系表(6)、软件设计1)、主程序main流程图图7 主程序流程图(2)、程序 /*简易数字频率计:T1定时计器,T0计数器,由P34(/T0)口输入待测频率*/*T1定时1S,在这1S内T1的计数值就是待测的频率值。*/#include<reg52.h>/头文件#include<intrins.h>/头文件#define uchar unsigned char/宏定义#define uint unsigned int/宏定义sfr16 DPTR=0x82;/定义DPTRbit status_F=1;/状态标志位uint aa, qian, bai,shi,ge,bb,wan,shiwan; /定义变量uchar cout;unsigned long temp;/定义长整型变量/*数码管显示0-9*/uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/*子函数声明*/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; /初始化P0口init();/调用定时器,计数器初始化while(1)if(aa=19)/定时20*50MS=1Saa=0;/定时完成一次后清0status_F=1;/完成计数 TR1=0; /关闭T1定时槛,定时1S完成delay(46); /延时较正误差TR0=0;/关闭T0DPL=TL0; /计数量的低8位DPH=TH0;/计数量的高8位temp=DPTR+cout*65535; /计数值放入变量shiwan=temp%/;wan=temp%/10000;qian=temp%10000/1000;/显示千位bai=temp%1000/100;/显示百位shi=temp%100/10;/显示十位ge=temp%10;/显示个位display(shiwan,wan,qian,bai,shi,ge); /调用显示函数/*定时器,计数器初始化*/void init()temp=0;/变量赋初值aa=0;cout=0;IE=0X8A;/开中断,T0,T1中断TMOD=0x15;/T1为定时器工作于方式1,T0为计数器工作于方式1TH1=0x3c;/定时器赋高8初值 , 12M晶振TL1=0xb0;/定时器赋低8初值 , 12M晶振TH0=0;/计数器赋高8初值初值TL0=0;/计数器赋低8初值TR1=1;/开定时器1TR0=1;/开计数器0/*显示子函数*/void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge)P0=0xdf;/P0口是位选 1101 1111 改成 1111 1101 =0XDFP2=tableshiwan;/显示shiwan位delay(5);P0=0xef;/P0口是位选 1110 1111 改成 1111 1110 =0XFEP2=tablewan;/显示wan位delay(3);P0=0xf7;/P0口是位选 1111 01111 改成 0111 1111=0X7F P2=tableqian;/显示千位delay(3);P0=0xfb;/P0口是位选 1111 1011 改成 1011 1111=0XBFP2=tablebai;/显示百位delay(3);P0=0xfd; /P0口是位选 1111 1101 改成 1101 1111 =0XDFP2=tableshi;/显示十位delay(3);P0=0xfe;/P0口是位选 1111 1110 改成 1110 1111 =0XEFP2=tablege;/显示个位delay(3);/*定时中断子函数*/void xtimer1() interrupt 3TH1=0x3c;/定时器赋高8初值TL1=0xb0;/定时器赋低8初值aa+;/*计数器中断子函数*/void xtimer0() interrupt 1 cout+;/*延时子函数。延时1MS*/void delay(uint z)uint i,j;for(i=0;i<z;i+)for(j=0;j<110;j+);/j上限为1253.仿真结果与分析此间易频率计的特点是由于加入了延时补偿,对于低频率脉冲能够准确计数,对于较高频率,则频率越高,误差越大。但总体来讲,误差相对较小。(1).在13257HZ,测量结果是准确的,如图8所示1HZ,1KHZ,3257HZ的仿真图:图8 1HZ,1KHZ,3257HZ的仿真图(2)在3258HZ9.5KHZ的时候测量有误差并且慢慢减少。在3258HZ时候达到最大误差0.03069%,如图9。9.5KHZ时候达到最小误差0.01368%。如图10:图9 测量3258HZ的仿真结果图10 测量95013HZ的仿真结果(3)从9.6KHZ999.7629KHZ,测量误差越来越大,在9.6KHZ为0.01458%,在999.7629KHZ时为0.0237%图11 测量9.6KHZ、 999.7629KHZ的仿真结果四、结论在单片机应用系统设计时,必须先确定该系统的技术要求,这是系统设计的依据和出发点,整个设计过程都必须围绕这个技术要求来工作。在设计时遵循从整体到局部也即自上而下的原则。把复杂的问题分解为若干个比较简单的、容易处理的问题,分别单个的加以解决。将总任务分解成可以独立表达的子任务,这些子任务再向下分,直到每个子任务足够简单,能够直接而容易的实现为止。在程序调试时应按各个功能模块分别调试。在程序设计时,正确合理的设计是非常重要的,正确的程序设计包括程序的结构是否合理,一些循环结构和循环指令的使用是否恰当,能否使用较少的循环次数或较快的指令,是否能把某些延迟等待的操作改为中断申请服务,能否把某些计算方法和查表技术适当简化等。另外程序的设计要具有可扩展性,程序的结构要标准化,便于阅读、修改和扩充。通过本次课程设计,我更加地了解和掌握单片机的基本知识和基本的编写程序,也更加深入地了解单片机这么课程,掌握汇编语言的设计和调试方法。对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的。在设计过程中,得到了我的指导老师的悉心指导与帮助,在此一并表示衷心的感谢。参考资料1 张毅坤,陈善久.单片微型计算机原理及应用.西安电子科技大学出版社,2002. 2 张友德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000. 3 张毅刚,彭善元,董继承.单片机原理及应用.高等教育出版社,2003.