您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的频率计的设计
基于51单片机的频率计的设计指导老师:曹新亮通信12级王妍静一.方案的设计与比较•1.方案一:•本设计是基于MCS-51单片机的频率计。被测信号经过信号转换电路从而将其转换成同频率的方波信号,当频率过大时将进行分频处理,利用单片机控制数据选择模块进行数据选择,最终将结果显示在1602液晶显示屏上•2.方案二:•本方案采用单片机程序处理输入信号并且将结果直接送往液晶显示,为了提高系统的稳定性,输入信号前进行放大整形,在通过A/D转换器输入单片机系统,采用这种方法可大大提高测试频率的精度和灵活性,并且能极大的减少外部干扰,采用VDHL编程设计实现的数字频率计,除被测信号的整形部分、键输入部分和数码显示部分以外,其余全部在一片FPGA芯片上实现,整个系统非常精简,而且具有灵活的现场可更改性。•3.方案三:•采用频率计专用模块,即大规模集成电路将计数器、锁存器、译码、位和段驱动,量程及小数点选择等电路集成在一块芯片中,该方案在技术上是可行的,可以简化电路的设计,当对于设计要求中的某些指标,采用专用模块来完成比较困难,即扩展极为不便。•以上三种方案比较:第一种方案具有设计复杂度小、电路简洁、功能实用且成本低廉等特点,其稳定性较好基本能满足设计要求。方案二采用单片机处理能较高要求,但成本提高且设计复杂。方案三采用专用频率计设计模块固然设计简单且稳定但系统可扩展性能较差。•综上所述,本课题采用第一种设计方案。二.设计原理与总体方案•测量一个信号的频率有两种方法:第一种是计数法,用基准信号去测量被测信号的高电平持续的时间,然后转换成被测信号的频率。第二种是计时法,计算在基准信号高电平期间通过的被测信号个数。•根据设计要求测量10HZ~100MHZ的正弦波信号,首先要将正弦信号通过过零比较转换成方波信号。如果用第一种方法,当信号频率超过1KHZ的时候测量精度将超出测量极限要求,所以当被测信号的频率高于1KHZ的时候需要将被测信号进行分频处理。如果被测信号频率很高需要将被测信号进行多次分频直到达到设计的精度要求。•根据设计要求用单片机的内部定时器0产生基准信号,由INTO输入被测信号,通过定时方式计算被测信号的高电平持续时间。并通过单片机计算得出结果,最后由1062液晶显示器显示测量结果。•频率计的系统设计框架如下图所示AT89C51液晶显示被测信号信号转换(过零比较)分频处理数据选择器三.硬件设计•硬件电路主要分为信号转换电路、分频电路、数据选择电路、单片机系统和显示电路五部分。其总体电路图如下图所示•3.1电平转换电路:•要将正弦信号转换成方波信号可以用过零比较电路实现。正弦信号通过LM833N与零电平比较,电压大于零的时候输出LM833N的正电源+5V,电压小于零的时候输出负电源0V。具体电路如下图所示•3.2分频电路:•分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10,达到十分频的作用。如果当频率很高时需要多次分频只需将多片74HC4017级联就可以了•74HC4017时序图如下图所示系统分频电路如下图所示3.3数据选择电路:根据设计要求,要根据计数脉冲个数来选择分频次数,可以用74151来选择分频次数,74151的选择控制信号由单片机的I/O口来控制。数据选择电路如下图所示。3.4单片机系统:单片机采用AT89C51,采用12MHZ的晶振频率。单片机的P3.2口接被处理后的被测信号,P0口接液晶显示器的数据输入端,ALE,RD,WR,P0.0,P0.1通过外接控制电路接液晶显示器的控制端。单片机系统的电路如下图所示。3.5显示电路:显示电路由1602组成,其电路如下图所示四.软件设计:频率计的软件设计主要由主程序、分频选择程序、液晶显示程序组成。•4.1频率计的算法设计:•根据设计要求频率范围是10HZ~100MHZ,当频率为10HZ时,T=100000us,高电平为50000us,0.1%的误差为100us,由单片机产生的基准频率为1MHZ,T0=1us,最大误差为1us,计数个数为50000(方式1),满足设计要求。当频率增加到1KHZ时,产生的误差刚刚能达到设计要求,这时计数个数为500。当频率大于1KHZ时(即计数个数小于500)就需要将被测频率分频后再测量,如当频率为10KHZ时,先计算计得的脉冲数等于50,小于了500,所以将10KHZ的信号10分频得到1KHZ,这时就满足要求了。•最后得到的频率其中n为计得的脉冲个数,i为分频的次数。inF1021064.2主程序•主程序首先对系统环境初始化,设置分频选通信号P2=0x00,选通0通道。设置T0工作方式,采用硬件启动方式,GATE=1,当INT0和TR0同时为1时启动计时,计数方式为方式1(16位),TH0和TL0都置零。当外部中断INT0=1时等待,当外部中断为0时启动T0即TR0=1,当INT0一直为0时就等待,一旦INT0=1就启动计数同时等待,当INT0为0时跳出并关闭T0即TR0=0。这样就计得高电平期间基准脉冲个数,当脉冲个数小于500时就选择10分频信号,即P2自加1,同时记录分频一次;如果分频后脉冲个数还小于500则再次分频,直到计数个数大于500•其计数工作示意图如下图所示被测脉冲INT0基准脉冲T0等待启动T0,TR0=1启动计数停止计数,读出计数个数N个脉冲主程序流程图如下图所示开始初始化数据选择信号系统初始化读出计数个数n其计数工作示意图如下图所示n=500变换数据选择通道,计算分频次数iY显示结果N•主程序:•#includereg51.h//头文件•#includestdio.h•#includelcd.c•#includemath.h•sbitp32=P3^2;//P3^2作为信号输入端•main()•{unsignedintperiod,k,j,i=0;//period,为定时器计数总值,i是分频次数•floatf,m;//浮点变量•charbuff[30];•init_LCD();//初始化LCD•P2=0x00;//选通D0路信号•while(1)•{•TMOD=0X09;//配置定时器0为工作方式1,即16位定时器,并硬件启动•TH0=0;//装定时器初值为0•TL0=0;•while(p32==1);//执行完这条语句后信号电平状态为低电平•TR0=1;//使能TR0;•while(p32==0);//等待信号高电平到来,如果高电平来了则定时器开始计时,如果没来,则继续循环等待。•while(p32==1);//等待信号高电平结束后,如果低电平,则定时器停止计时•TR0=0;//关闭定时器•period=TH0*256+TL0;//计算定时器装的总值•while(period=500)/*判断是否分频及计算分频次数*/即频率是否大于1KHZ•{P2++;•i++;•period=period*10;•if(i==6)•{P2=0x00;•break;•}•}•k=pow(10,i);/*10的i次方*/•f=(1000000.0/(2*period))*k;•if(f1000)•sprintf(buff,f=%5.2fHZ,f);•else•{m=f/1000.0;•sprintf(buff,f=%5.2fKHZ,m);•}•lcdprintf(0,0,buff);•}•}•显示子程序:•#includelcd.h•charcodeCGRAM_TABLE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//;年•0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00,//;月•0x0F,0x09,0x09,0x0F,0x0,0x09,0x0F,0x00};//;日•voiddelay()//延时子程序•{•unsignedchari;•for(i=0;i250;i++);•}•voidinit_LCD()//初始化LCD•{•unsignedchari;•WR_COM=0x38;//设置为8位数据总线,16*2,5*7点阵•for(i=0;i100;i++)•delay();•WR_COM=0x01;//清屏幕•for(i=0;i50;i++)•delay();•WR_COM=0x06;//光标移动,显示区不移动,读写操作后AC加1•for(i=0;i50;i++)•delay();•WR_COM=0x0c;•for(i=0;i50;i++)•delay();•}•/**************************************************************************************************/•voidinit_cgram()•{•unsignedchari;•//;设置自定义字符•WR_COM=0x40;•for(i=0;i24;i++)•{•WR_DAT=CGRAM_TABLE[i];•}•for(i=0;i40;i++)•delay();•}•/**************************************************************************************************/•voidPutChar(chart)•{•WR_DAT=t;•delay();•delay();•}•voidclr_lcd()•{•WR_COM=0x01;•delay();•delay();•}•voidlcdprintf(charx,chary,char*s)•{•//clr_lcd();•if(y1)y=1;•WR_COM=(y*0x40+x)|0x80;•delay();•delay();•while(*s!=0)•{•WR_DAT=*s;•s++;•delay();•delay();•}•}
本文标题:基于51单片机的频率计的设计
链接地址:https://www.777doc.com/doc-4757984 .html