当前位置:文档之家› 基于51单片机的频率计的设计

基于51单片机的频率计的设计

基于51单片机的频率计的设计
指导老师:曹新亮 通信12级 王妍静
.
一.方案的设计与比较
• 1.方案一: • 本设计是基于MCS-51单片机的频率计。被测信号经过信号转换电路从
而将其转换成同频率的方波信号,当频率过大时将进行分频处理,利 用单片机控制数据选择模块进行数据选择,最终将结果显示在1602液 晶显示屏上 • 2.方案二: • 本方案采用单片机程序处理输入信号并且将结果直接送往液晶显示, 为了提高系统的稳定性,输入信号前进行放大整形,在通过A/D转换器 输入单片机系统,采用这种方法可大大提高测试频率的精度和灵活性, 并且能极大的减少外部干扰,采用VDHL编程设计实现的数字频率计, 除被测信号的整形部分、键输入部分和数码显示部分以外,其余全部 在一片FPGA芯片上实现,整个系统非常精简,而且具有灵活的现场可 更改性。 • 3.方案三: • 采用频率计专用模块,即大规模集成电路将计数器、锁存器、译码、位 和段驱动,量程及小数点选择等电路集成在一块芯片中,该方案在技 术上是可行的,可以简化电路的设计,当对于设计要求中的某些指标, 采用专用模块来完成比较困难,即扩展极为不便。
• void init_cgram()
•{

unsigned char i;

//;设置自定义字符

WR_COM=0x40;

for(i=0;i<24;i++)

{

WR_DAT=CGRAM_TABLE[i];
.
•}

for(i=0;i<40;i++)

delay();
•}
• /************************************************************************************************** /
.
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,这时 就满足要求了。 • 最后得到的频率 F 106 10i 其中n为计得的脉冲个数,i为分频的次数。
2n
.
4.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

WR_COM=0x38; //设置为8位数据总线,16*2,5*7点阵

for(i=0;i<100;i++)

delay();

WR_COM=0x01; //清屏幕

for(i=0;i<50;i++)

delay();

WR_COM=0x06; //光标移动,显示区不移动,读写操作后AC加1

for(i=0;i<50;i++)
• float f,m; //浮点变量
• char buff[30];
• init_LCD(); //初始化LCD
• P2=0x00; //选通D0路信号
• while(1)
•{
• TMOD=0X09; //配置定时器0为工作方式1,即16位定时器,并硬件启动
• TH0=0;
//装定时器初值为0
• TL0=0;
• 测量一个信号的频率有两种方法:第一种是计数法,用基 准信号去测量被测信号的高电平持续的时间,然后转换成 被测信号的频率。第二种是计时法,计算在基准信号高电 平期间通过的被测信号个数。
• 根据设计要求测量10HZ~100MHZ的正弦波信号,首先要 将正弦信号通过过零比较转换成方波信号。如果用第一种 方法,当信号频率超过1KHZ的时候测量精度将超出测量 极限要求,所以当被测信号的频率高于1KHZ的时候需要 将被测信号进行分频处理。如果被测信号频率很高需要将 被测信号进行多次分频直到达到设计的精度要求。

if(y>1)y=1;

WR_COM=(y*0x40+x)|0x80;

delay();

delay();

while(*s!=0)

{

WR_DAT=*s;

s++;

delay();

delay();

}
•}
.
•}
• lcdprintf(0,0,buff);
•}
•}
• 显示子程序:
• #include <lcd.h>
• char code CGRAM_TABLE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,// ;年

0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //;月
• TR0=0;
//关闭定时器
• period=TH0*256+TL0; //计算定时器装的总值
• while(period<=500) /*判断是否分频及计算分频次数*/ 即频率是否大于1KHZ

{ P2++;
• i++;
.
• period=period*10;

if(i==6)
• {P2=0x00;
.
• 主程序:
• #include<reg51.h> //头文件
• #include<stdio.h>
• #include<lcd.c>
• #include<math.h>
• sbit p32=P3^2;
//P3^2作为信号输入端
• main()
• { unsigned int period,k,j,i=0; // period,为定时器计数总值,i是分频次数
• void PutChar(char t)
•{

WR_DAT=t;

delay();

delay();
•}
• void clr_lcd()
•{

WR_COM=0x01;

delay();

delay();
•}
• void lcdprintf(char x,char y,char *s)
•{

//clr_lcd();

.
3.2 分频电路:
• 分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个 数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10, 达到十分频的作用。如果当频率很高时需要多次分频只需将多片 74HC4017级联就可以了
• 74HC4017时序图如下图所示
.
系统分频电路如下图所示
• 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;
• sprintf(buff,"f=%5.2fKHZ",m);
• while(p32==1); //执行完这条语句后信号电平状态为低电平
• TR0=1;
//使能TR0;
• while(p32==0); //等待信号高电平到来,如果高电平来了则定时器开始计时,如果没来,则继续循 环等待。
• while(p32==1); //等待信号高电平结束后,如果低电平,则定时器停止计时
.
• 以上三种方案比较:第一种方案具有设计复杂度小、电 路简洁、功能实用且成本低廉等特点,其稳定性较好基 本能满足设计要求。方案二采用单片机处理能较高要求, 但成本提高且设计复杂。方案三采用专用频率计设计模 块固然设计简单且稳定但系统可扩展性能较差。
相关主题