基于89C51的等精度频率计LCD1602显示Word格式文档下载.docx
《基于89C51的等精度频率计LCD1602显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于89C51的等精度频率计LCD1602显示Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
二关键词:
频率计等精度单片机分频
三设计原理与总体方案:
测量一个信号的频率有两种方法:
第一种是计数法,用基准信号去测量被测信号的高电平持续的时间,然后转换成被测信号的频率。
第二种是计时法,计算在基准信号高电平期间通过的被测信号个数。
根据设计要求测量10HZ~100MHZ的正弦信号,首先要将正弦信号通过过零比较转换成方波信号,然后变成测量方波信号。
如果用第一种方法,当信号频率超过1KHZ的时候测量精度将超出测量极度要求,所以当被测信号的频率高于1KHZ的时候需要将被测信号进行分频处理。
如果被测信号频率很高需要将被测信号进行多次分频直到达到设计的精度要求。
根据设计要求用单片机的内部T0产生基准信号,由INTO输入被测信号,通过定时方式计算被测信号的高电平持续时间。
通过单片机计算得出结果,最后有1062液晶显示器显示测量结果。
等精度频率计的系统设计框架如下图1所示。
图1等精度频率计系统设计框图
四硬件设计:
硬件电路主要分为信号转换电路、分频电路、数据选择电路、单片机系统和显示电路五部分。
其总体电路图如图2所示。
图2总体电路图
4.1电平转换电路:
要将正弦信号转换成方波信号可以用过零比较电路实现。
正弦信号通过LM833N与零电平比较,电压大于零的时候输出LM833N的正电源+5V,电压小于零的时候输出负电源0V。
具体电路如图3所示。
图3信号转换电路
4.2分频电路:
分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10,达到十分频的作用。
如果当频率很高是需要多次分频只需将多片74HC4017级联就可以了。
74HC4017时序图如图4所示,系统分频电路如图5所示。
图4 74HC4017时序图
图5 分频电路
4.3数据选择电路:
根据设计要求要根据计数脉冲个数来选择分频次数,可以用74151来选择分频次数,74151的选择控制信号有单片机的I/O口来控制。
数据选择电路如图6所示。
图6 数据选择电路
4.4单片机系统:
单片机采用AT89C51,采用12MHZ的晶振频率。
单片机的P3.2口接被处理后的被测信号,P0口接液晶显示器的数据输入端,ALE,RD,WR,P0.0,P0.1通过外接控制电路接液晶显示器的控制端。
单片机系统的电路如图7所示。
图7 单片机系统
4.5显示电路:
显示电路由1602组成,其电路如图8所示。
图8 显示电路
五软件设计:
等精度频率计的软件设计主要由主程序、分频选择程序、液晶显示程序组成。
5.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,这时就满足要求了。
最后得到的频率f=
其中n为计得的脉冲个数,i为分频的次数。
5.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。
其示意图如图9所示,主程序流程图如图10所示。
图9计数工作示意图
图10主程序流程图
5.3程序清单:
5.3.1主程序:
#include<
reg51.h>
stdio.h>
lcd.c>
math.h>
sbitp32=P3^2;
main()
{unsignedintperiod,k,j,i=0;
floatf,m;
charbuff[30];
init_LCD();
P2=0x00;
while
(1)
{
TMOD=0X09;
TH0=0;
TL0=0;
while(p32==1);
TR0=1;
while(p32==0);
TR0=0;
period=TH0*256+TL0;
while(period<
=500)/*判断是否分频及计算分频次数*/
{P2++;
i++;
period=period*10;
if(i==6)
{P2=0x00;
break;
}
}
k=pow(10,i);
/*10的i次方*/
f=(1000000.0/(2*period))*k;
if(f<
1000)
sprintf(buff,"
f=%5.2fHZ"
f);
else
{m=f/1000.0;
f=%5.2fKHZ"
m);
lcdprintf(0,0,buff);
5.3.2显示子程序:
#include<
lcd.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;
i<
250;
i++);
voidinit_LCD()
WR_COM=0x38;
//设置为8位数据总线,16*2,5*7点阵
100;
i++)
delay();
WR_COM=0x01;
//清屏幕
50;
WR_COM=0x06;
//光标移动,显示区不移动,读写操作后AC加1
WR_COM=0x0c;
/**************************************************************************************************/
voidinit_cgram()
//;
设置自定义字符
WR_COM=0x40;
24;
WR_DAT=CGRAM_TABLE[i];
40;
voidPutChar(chart)
WR_DAT=t;
voidclr_lcd()
voidlcdprintf(charx,chary,char*s)
//clr_lcd();
if(y>
1)y=1;
WR_COM=(y*0x40+x)|0x80;
while(*s!
=0)
WR_DAT=*s;
s++;
六调试:
等精度频率计的调试比较简单,在电平转换前的输入端输入标准的正弦信号,把编译好的程序指定到Proteus中的单片机中。
运行Proteus即可在显示器中观测到显示结果。
当然我们在调试过程中也遇到了不少的困难。
首先我们用4017来作为十分频器,但是没有注意到4017是CMOS型的,而我们系统所用的是TTL电平,所以最后改用了74HC4017;
在刚开始的时候当输入某个频率时输出显示为零,或者为负数,最后发现是输出的数据类型定义错了,因为最大要测量10MHZ的频率,所以要定义输出数据类型为longint型,否则输出将产生溢出显示负数。
七结束语:
本设计所设计的频率计有有较高的精度,频率范围较高,有较强的实用价值。
当然本设计只是基于各种理想的实验条件下得出的结论,设计当中不可避免的存在一些问题。
例如在信号转换的电路中只是粗略的将正弦信号转换成方波信号,而没有对输出信号进行进一步的处理;
在信号经过分频后也没有对信号进行处理,这将降低测量的精度。
如果在以上两个地方加入相关的处理电路,系统的精度将得到进一步的提高。
八参考文献:
【1】李群芳肖看编著.单片机原理、接口及应用-嵌入式系统技术基础.北京.清华大学出版社.2005
【2】康华光主编.电子技术基础-数字部分(第四版).北京.高等教育出版社.2000
【3】康华光主编.电子技术基础-模拟部分(第五版).北京.高等教育出版社.2006