当前位置:
文档之家› 基于51单片机的频率计的设计
基于51单片机的频率计的设计
• 测量一个信号的频率有两种方法:第一种是计数法,用基 准信号去测量被测信号的高电平持续的时间,然后转换成 被测信号的频率。第二种是计时法,计算在基准信号高电 平期间通过的被测信号个数。 • 根据设计要求测量 10HZ~100MHZ 的正弦波信号,首先要 将正弦信号通过过零比较转换成方波信号。如果用第一种 方法,当信号频率超过 1KHZ 的时候测量精度将超出测量 极限要求,所以当被测信号的频率高于 1KHZ 的时候需要 将被测信号进行分频处理。如果被测信号频率很高需要将 被测信号进行多次分频直到达到设计的精度要求。
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,这时 就满足要求了。 106 10i 其中n为计得的脉冲个数,i为分频的次数。 • 最后得到的频率 F
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
基于51单片机的频率计的设计
指导老师:曹新亮 通信12级 王妍静
一.方案的设计与比较
• 1.方案一: • 本设计是基于MCS-51单片机的频率计。被测信号经过信号转换电路从 而将其转换成同频率的方波信号,当频率过大时将进行分频处理,利 用单片机控制数据选择模块进行数据选择,最终将结果显示在1602液 晶显示屏上 • 2.方案二: • 本方案采用单片机程序处理输入信号并且将结果直接送往液晶显示, 为了提高系统的稳定性,输入信号前进行放大整形,在通过A/D转换器 输入单片机系统,采用这种方法可大大提高测试频率的精度和灵活性, 并且能极大的减少外部干扰,采用VDHL编程设计实现的数字频率计, 除被测信号的整形部分、键输入部分和数码显示部分以外,其余全部 在一片FPGA芯片上实现,整个系统非常精简,而且具有灵活的现场可 更改性。 • 3.方案三: • 采用频率计专用模块,即大规模集成电路将计数器、锁存器、译码、位 和段驱动,量程及小数点选择等电路集成在一块芯片中,该方案在技 术上是可行的,可以简化电路的设计,当对于设计要求中的某些指标, 采用专用模块来完成比较困难,即扩展极为不便。
• 硬件电路主要分为信号转换电路、分频电路、数据选择电路、单片机 系统和显示电路五部分。其总体电路图如下图所示
•
3.1 电平转换电路:
• 要将正弦信号转换成方波信号可以用过零比较电路实现。正弦信号通 过LM833N与零电平比较,电压大于零的时候输出LM833N的正电源 +5V,电压小于零的时候输出负电源0V。具体电路如下图所示
•
其计数工作示意图如下图所示
被测脉冲
启动计数
停止计数,读出计 数个数
基准脉冲T0
N个脉冲
主程序流程图如下图所示
开始
初始化数据选择 信号
系统初始化
读出计数个数 n 其计数工作 示意图如下图所示
Y n<=500 变换 数 据选 择 通道 ,计 算分频次数i
N 显示结果
• • • • • • • • • • • • • • • • • • • • • • • • •
void init_LCD() //初始化LCD { unsigned char i; 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++) delay(); WR_COM=0x0c; for(i=0;i<50;i++) delay(); } /************************************************************************************************** / void init_cgram() { unsigned char i; //;设置自定义字符 WR_COM=0x40; for(i=0;i<24;i++) { WR_DAT=CGRAM_TABLE[i];
3.3数据选择电路:
根据设计要求,要根据计数脉冲个数来选择分频次数,可以用74151 来选择分频次数,74151的选择控制信号由单片机的I/O口来控制。数 据选择电路如下图所示。
3.4单片机系统:
单片机采用AT89C51,采用12MHZ的晶振频率。单片机的P3.2口接被 处理后的被测信号,P0口接液晶显示器的数据输入端,ALE,RD, WR,P0.0,P0.1通过外接控制电路接液晶显示器的控制端。单片机 系统的电路如下图所示。
• 以上三种方案比较:第一种方案具有设计复杂度小、电 路简洁、功能实用且成本低廉等特点,其稳定性较好基 本能满足设计要求。方案二采用单片机处理能较高要求, 但成本提高且设计复杂。方案三采用专用频率计设计模 块固然设计简单且稳定但系统可扩展性能较差。 • 综上所述,本课题采用第一种设计方案。
二.设计原理与总体方案
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
} for(i=0;i<40;i++) delay();
} /************************************************************************************************** / 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(); if(y>1)y=1; WR_COM=(y*0x40+x)|0x80; delay(); delay(); while(*s!=0) { WR_DAT=*s; s++; delay(); delay(); } }
• 根据设计要求用单片机的内部定时器0产生基准信号,由INTO输入被测 信号,通过定时方式计算被测信号的高电平持续时间。并通过单片机计 算得出结果,最后由1062液晶显示器显示测量结果。 • 频率计的系统设计框架如下图所示
被测信号
信号转换 (过零比较)
分频处理
AT89C51 液晶显示
数据选择 器
三.硬件设计
•
3.2 分频电路:
• 分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个 数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10, 达到十分频的作用。如果当频率很高时需要多次分频只需将多片 74HC4017级联就可以了 • 74HC4017时序图如下图所示
系统分频电路如下图所示
• • • • • • • • • • • • • • • • • • • • • • • • • • •
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; sprintf(buff,"f=%5.2fKHZ",m); } 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, //;月 0x0F,0x09,0x09,0x0F,0x0,0x09,0x0F,0x00}; // ;日 void delay() //延时子程序 { unsigned char i; for(i=0;i<250;i++); }
• • • • • • • • • • • • • • • • • • • •
• • • • • •
主程序: #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是分频次数 float f,m; //浮点变量 char buff[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++;