基于单片机的频率计设计文档格式.docx
《基于单片机的频率计设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的频率计设计文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。
在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。
本数字频率计将采用定时、计数的方法测量频率,采用一个四位共阴极数码管显示器动态显示4位数。
测量范围从1Hz—9999Hz的方波、用单片机实现自动测量功能。
基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
(2)频率测量仪的设计思路与频率的计算
频率测量仪的设计思路主要是:
对信号分频,测量一个或几个被测量信号周期中已知标准频率信号的周期个数,进而测量出该信号频率的大小,其原理如右图1所示。
图1.1频率测量原理图
若被测量信号的周期为,分频数m1,分频后信号的周期为T,则:
T=m1Tx。
由图可知:
T=NTo
(注:
To为标准信号的周期,所以T为分频后信号的周期,则可以算出被测量信号的频率f。
)
由于单片机系统的标准频率比较稳定,而是系统标准信号频率的误差,通常情况下很小;
而系统的量化误差小于1,所以由式T=NTo可知,频率测量的误差主要取决于N值的大小,N值越大,误差越小,测量的精度越高。
(3)基本设计原理
所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。
若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。
其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。
时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等于1s。
闸门电路由标准秒信号进行控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。
秒信号结束时闸门关闭,计数器停止计数。
由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。
频率计数器系统硬件组成
频率计数器系统硬件主要由AT89C51单片机、定时电路NE555、LED数码管等元器件组成。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
NE555是美国Signetics公司1972年研制的用于取代机械式定时器的中规模集成电路,因输入端设计有三个5kΩ的电阻而得名。
数码管是一种半导体发光器件,其基本单元是发光二极管。
图2.1系统框图
频率计数器系统设计流程
图2.5基于Proteus的单片机系统设计流程
频率计数器电路图设计
运行Proteus的ISIS后出现程序主窗口界面,鼠标左键单击窗口左侧的元器件工具栏的component.按钮,接着再点击窗口左侧的元器件选择区的PickDivices.按钮,弹出如图1所示的PickDevices窗口,再在Categ栏里点击MicroprocessorICs项后,在Results栏里会出现各种类型的CPU器件,找到AT89C51后双击,AT89C51就被添加到当前窗口左侧的元器件列表区了。
用同样的方法依次把NE555、数码管、晶振以及多个电阻、电容也添加到器件列表区里。
然后再依次点击列表区里的器件,单击左键把他们放到绘图区,右键选中元件,并编辑其属性,合理布局后,进行连线。
连线时当鼠标的指针靠近一个对象的引脚时,跟着鼠标的指针rICs就会出现一个“×
”提示符号,点击鼠标左键即可画线了,需要拐弯时点击一下即可,在终点再点击确认一下就画出了一段导线,所有导线画完后,点击工具栏的Inter-sheeTerminal.按钮,添加上电源和接地符号,原理图的绘制就完成了。
频率计数器电路图
图Proteus设计频率计数器系统原理图
图Proteus仿真结果图
参考文献
[1]孙安青编著.AT89S51单片机实验及基础教程.桂林电子科技大学,2003年
[2]江晓安编著.数字电路.西安电子科技大学出版社,2002年
[3]杨振江编著.单片机原理与实践指导.中国电力出版社,2008年
[4]谭浩强编著.C程序设计.北京:
清华大学出版社,2002年
[5]江晓安编著.数字电子技术.西安电子科技大学出版社,2002年
[6]郝建国编著.单片机在电子电路中的应用.北京:
清华大学出版社,2006年
[7]王振红编著.综合电子设计与实践.北京:
清华大学出版社,2006年
附录A程序代码
程序代码:
#include<
AT89X52.H>
unsignedcharcodedisplaybit[]={0xfe,0xfd,0xfb,0xf7};
//四位选择
unsignedcharcodedisplaycode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
//0,1,2,3,4,5,6,7,8,9
unsignedchardispbuf[4]={0,0,0,0};
//数据缓冲区,j就是屏幕显示的缓冲数据
unsignedchartemp[4];
//显示速度分成显示字符的缓冲区
unsignedchardispcount;
//显示位数的定位
unsignedcharT0count;
//to计数器的溢出次数
unsignedchartimecount;
//定时的次数
bitflag;
unsignedlongx;
voidmain(void)
{unsignedchari;
TMOD=0x15;
//设置定时器启动模式
TH0=0;
TL0=0;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
//启动定时器
ET0=1;
ET1=1;
//启动两个中断
EA=1;
//开中断
while
(1)
{if(flag==1)
{flag=0;
x=T0count*65536+TH0*256+TL0;
//显示初始化0
for(i=0;
i<
4;
i++)
{temp[i]=0;
}
i=0;
while(x/10)
{temp[i]=x%10;
x=x/10;
i++;
temp[i]=x;
{dispbuf[i]=temp[i];
timecount=0;
T0count=0;
}
voidt0(void)interrupt1using0
{T0count++;
voidt1(void)interrupt3using0
{TH1=(65536-5000)/256;
timecount++;
if(timecount==200)
{TR0=0;
flag=1;
P2=0xff;
P0=displaycode[dispbuf[dispcount]];
P2=displaybit[dispcount];
dispcount++;
if(dispcount==4)
{
dispcount=0;
}
忽略此处..