1第一章频率计数器概述1.1简介频率计数器是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。本数字频率计将采用定时、计数的方法测量频率,采用一个四位共阴极数码管显示器动态显示4位数。测量范围从1Hz—9999Hz的方波、用单片机实现自动测量功能。基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。1.2频率测量仪的设计思路与频率的计算频率测量仪的设计思路主要是:对信号分频,测量一个或几个被测量信号周期中已知标准频率信号的周期个数,进而测量出该信号频率的大小,其原理如右图1所示。若被测量信号的周期为,分频数m1,分频后信号的周期为T,则:T=m1Tx。由图可知:T=NTo(注:To为标准信号的周期,所以T为分频后信号的周期,则可以算出被测量信号的频率f。)由于单片机系统的标准频率比较稳定,而是系统标准信号频率的误差,通常情况下很小;而系统的量化误差小于1,所以由式T=NTo可知,频率测量的误差主要取决于N值的大小,N值越大,误差越小,测量的精度越高。1.3基本设计原理基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间图1.1频率测量原理图2间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等于1s。闸门电路由标准秒信号进行控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。3第二章系统设计2.1频率计数器系统硬件组成频率计数器系统硬件主要由AT89C51单片机、定时电路NE555、LED数码管等元器件组成。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。NE555是美国Signetics公司1972年研制的用于取代机械式定时器的中规模集成电路,因输入端设计有三个5kΩ的电阻而得名。数码管是一种半导体发光器件,其基本单元是发光二极管。图2.1系统框图AT89C51单片机单片机晶振电路单片机复位电路方波信号产生电路四位共阴极数码管显示电路4第三章硬件电路设计3.1频率计数器电路图设计方波信号产生电路NE555的Q脚接TO计数器,以使T0完成对方波的计数功能。AT89C51单片机PO.0-P0.7口接数码管的显示段,P2.0-P2.3接四段的数码管选择口。XTAL1和XTAL2接上12MHZ的晶振。即振荡周期=1/12us;时钟周期=1/6us;机器周期=1us。图3.1设计频率计数器系统原理图3.2NE555方波产生信号电路图:P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78RST9P3.0(RXD)10P3.1(TXD)11P3.2(INT0)12P3.3(INT1)13P3.4(T0)14P3.5(T1)15P3.6(WR)16P3.7(RD)17XTAL218XTAL119GND20(A8)P2.021(A9)P2.122(A10)P2.223(A11)P2.324(A12)P2.425(A13)P2.526(A14)P2.627(A15)P2.728PSEN29ALE/PROG30EA/VPP31(AD7)P0.732(AD6)P0.633(AD5)P0.534(AD4)P0.435(AD3)P0.336(AD2)P0.237(AD1)P0.138(AD0)P0.039VCC40U1AT89C51Y112MHzC230C330COM1R12R23R34R45R56R67R78R89RP11KVCCR110KVCCVCC+C110uFQ19012Q29012Q39012Q49012....abcdefgdp1H2H3H4HSMG17LED1R102.2kR112.2kR122.2kR132.2kP27P24P25P26edcdpgfab1H2H3H4HafbeddpcgP24P25P26P27321P1POWERVCC112233445566S1P34....abcdefgdp1H2H3H4HSMG27LED25H6H7H8HafbeddpcgP20P21P22P23Q59012Q69012Q79012Q89012R142.2kR152.2kR162.2kR172.2kP20P21P22P231H2H3H4H5H6H7H8HTRIG2Q3R4CVolt5THR6DIS7VCC8GND1U3555VCCRt110kC4104C510412J2CON212J3CON2P34Q19013R21kR3220VCC5所产生方波公式:T1=0.693(RA+RB)*CT2=0.693RB*CF=1.433/(RA+2RB)*C图3.2NE555方波信号产生电路原理图6第四章软件设计4.1程序流程图设计图4.1系统程序流程图4.2程序设计内容(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。定时器初始化启动定时器计数器计时1s计算计数器T0的计数计算后将T0清零,继续计数结束开始将T0的计数值显示到数码管7(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时5ms,共定时200次,即可完成1秒的定时功能。4.3源程序设计(1)设置定时器工作方式,开中断和定时器:TMOD=0x15;//设置定时器启动模式TH0=0;TL0=0;TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;TR0=1;//启动定时器ET0=1;ET1=1;//启动两个中断EA=1;//开中断由前面可知工作方式寄存器TMOD的值和TH0、TL0的值,ET0是T0溢出中断允许位,所以ET0=1表示允许T0中断;要引入中断,所以必须开总中断,所以EA=1;TR0是T0定时器运行控制位,置1表示启动T0。(2)TO计数子程序:voidt0(void)interrupt1using0{T0count++;}中断号1(3)T1定时子程序:voidt1(void)interrupt3using0{8TH1=(65536-5000)/256;TL1=(65536-5000)%256;timecount++;if(timecount==200){TR0=0;timecount=0;flag=1;}P2=0xff;P0=displaycode[dispbuf[dispcount]];P2=displaybit[dispcount];dispcount++;if(dispcount==4){dispcount=0;}}9第五章总结与展望频率计数器是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,会被经常使用到。通过本次毕业设计,不但加深我对在课程上所学到的单片机理论知识的认识和理解,重新让自己认识到了这门学科的在应用方面的广阔前景,并且通过知识与应用于实践的结合更加丰富了自己的知识。扩展了知识面,不但掌握了本专业的相关知识,而且对其他专业的知识也有所了解,而且较系统的掌握单片机应用系统的开发过程,因而自身的综合素质有了全面的提高。10参考文献[1]孙安青编著.AT89S51单片机实验及基础教程.桂林电子科技大学,2003年[2]江晓安编著.数字电路.西安电子科技大学出版社,2002年[3]杨振江编著.单片机原理与实践指导.中国电力出版社,2008年[4]谭浩强编著.C程序设计.北京:清华大学出版社,2002年[5]江晓安编著.数字电子技术.西安电子科技大学出版社,2002年[6]郝建国编著.单片机在电子电路中的应用.北京:清华大学出版社,2006年[7]王振红编著.综合电子设计与实践.北京:清华大学出版社,200611程序代码程序代码:#includeAT89X52.Hunsignedcharcodedisplaybit[]={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,9unsignedchardispbuf[4]={0,0,0,0};//数据缓冲区,j就是屏幕显示的缓冲数据unsignedchartemp[4];//显示速度分成显示字符的缓冲区unsignedchardispcount;//显示位数的定位unsignedcharT0count;//to计数器的溢出次数unsignedchartimecount;//定时的次数bitflag;unsignedlongx;voidmain(void){unsignedchari;TMOD=0x15;//设置定时器启动模式TH0=0;TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;TR0=1;//启动定时器ET0=1;ET1=1;//启动两个中断EA=1;//开中断while(1)12{if(flag==1){flag=0;x=T0count*65536+TH0*256+TL0;//显示初始化0for(i=0;i4;i++){temp[i]=0;}i=0;while(x/10){temp[i]=x%10;x=x/10;i++;}temp[i]=x;for(i=0;i4;i++){dispbuf[i]=temp[i];}timecount=0;T0count=0;TH0=0;TL0=0;TR0=1;}}13}voidt0(void)interrupt1using0{T0count++;}voidt1(void)interrupt3using0{TH1=(65536-5000)/256;TL1=(65536-5000)%256;timecount++;if(timecount==200){TR0=0;timecount=0;}P2=0xff;P0=displaycode[dispbuf[dispcount]];P2=displaybit[dispcount];dispcount++;if(dispcount==4){dispcount=0;}}