您好,欢迎访问三七文档
频率计实验报告一、实验目的掌握单片机、数字译码和显示单元的组成和工作原理学习及演示任务,增强劝阻实验创新能力二、实验要求1、被测频率fx小于110Hz采用测周法,显示频率XXX。XXX;fx大于110Hz采用测频法,显示频率XXXXXX;2、可利用键盘分段测量和自动分段测量;3、可完成单脉冲测量,输入脉冲宽度范围是100微秒--0.1秒;三、设计目的三、基本原理所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定的时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=T/N。其中脉冲形成电路的作用是将被测信号变成脉冲信号。其重复频率等于被测频率f,时间基准信号发生器提供基准的时间脉冲信号。若其周期为1S,则门控电路的输出信号持续时间也等于1S,门闸电路由标准秒信号进行控制。当秒信号来到时,门闸开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时,门闸关断。计数器停止计数,由于计数器计得的脉冲数N是在1S时间内的累计数,所以被测频率等于NNZ。四,实验设计分析使用数码管显示控制最简单,根据设计要求显示格式XXXX。可以准确的显示频率大小,又由于数码管简单便宜且满足设计要求,所以选着数码管显示比较合理。选择AT89C51作为单片机芯片,选用两位8段共阴极LED数码管实现频率显示,利用8279作I/O口扩展,连接数码管和键盘。通过定时器1计时方式,定时器0计数方式,定时每秒钟对外部频率计数,单片机的时钟一般需要多相时钟,所以时钟电路由振荡器和分频器组成。AT89C51内部有一个用于构成振荡器的可控高增益反向放大器。两个引脚-1-XTAL1和XTAL2分别是该放大器的输入端和输出端。在片外跨接一晶振和两个匹配电容C1、C2如图4.3所示,就构成一个自激振荡器。振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率。匹配电容C1、C2要根据石英晶体振荡器的要求选取。当晶振频率为12MHz时,C1C2一般选30pF左右。上述电路是靠AT89C51单片机内部电路产生振荡的。也可以由外部振荡器或时钟直接驱动AT89C51。本设计采用内部电路产生振荡。系统原理框图选择AT89C51作为单片机芯片,选用两位8段共阴极LED数码管实现频率显示,利用8279作I/O口扩展,连接数码管和键盘。通过定时器1计时方式,定时器0计数方式,定时每秒钟对外部频率计数,把计数值通过8279芯片在数码管上显示。如图4.1所示。时钟电路和复位电路1.时钟电路单片机的时钟一般需要多相时钟,所以时钟电路由振荡器和分频器组成。AT89s52内部有一个用于构成振荡器的可控高增益反向放大器。两个引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。在片外跨接一晶振和两个匹配电容C1、C2如图4.3所示,就构成一个自激振荡器。振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率。匹配电容C1、C2要根据石英晶体振荡器的要求选取。当晶振频率为12MHz时,C1C2一般选30pF左右。上述电路是靠AT89s52单片8279P3P2P3.48051数据图4.1系统原理框图启动键晶振电路复位电路四位位数码管-2-机内部电路产生振荡的。也可以由外部振荡器或时钟直接驱动AT89s52。本设计采用内部电路产生振荡。五,实验要求实现基本电路设计单片机最小系统模块包括主控单元和基本外围电路,具体如图3-2所示。采用外部5V电源,AT89C51为主控芯片,P0口采用74LS373驱动,采用11.0592HZ晶振,手动高电平复位方式。通过P3.4采集外部输入频率,实时扫描键盘输入,控制输出采集频率。数码管显示电路设计数码管显示电路由4位八段共阴数码及8279芯片及74HS138芯片组成,共阴数码管在应用时将公共极COM接到地,当某一字段发光二极管的阴极为高电平时,相应字段就点亮。当某一字段的阴极为低电平时,相应字段就不亮。8279是专用键盘、显示接口芯片,单个芯片就能完成键盘输入和LED显示控制两种功能。可以为64键的接触方式按键阵列提供扫描接口,能自动消除按键抖动以及n键同时按下的保护。通过数码管显示,可以简单而准确的实现显示频率。采用芯片不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。频率发生电路设计频率发生电路是由4个74LS393芯片以及晶振电路产生600HZ、300HZ、150HZ、75HZ、4种不同的频率,电路设计简单,产生频率稳定。电源电路设计本电源电路是通过变压器,把外部接入的22V电源转变为5V电源,采用7805使电源稳定。程序流程图由于C语言编程容易,且Keil软件是目前最流行开发MCS-51系列单片机的软件。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境-3-(uVision)将这些部分组合在一起。KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。所以我们使用Keil软件进行编程。根据设计项目所需功能,我们先进行初始化,在待机状态下,采集频率。然后把采集的频率进行十进制转换,然后检测是否有键按下,若键0按下,则数码管显示所采集的频率,再按下键0时则不显示。系统实现所有功能,其程序框图如图4-1所示。主程序、/*三:频率计设计要求:定时器8初始化采集频率频率转换数码管显示YN键0按下开始-4-1:被测频率fx小于110Hz采用测周法,显示频率XXX。XXX;fx大于110Hz采用测频法,显示频率XXXXXX;2:可利用键盘分段测量和自动分段测量;3:可完成单脉冲测量,输入脉冲宽度范围是100微秒--0.1秒;4:自由发挥其他功能.*/#includereg52.h#defineuintunsignedint#defineuncharunsignedcharsbitenter=P3^4;sbitstart=P3^0;uncharcodetable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uncharcodetable2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uintt,a,b,temp;floattt;longnn;//声明函数voiddelay();voidinit();-5-voiddisplay(long);voidexamf();voidexamt();voidscan();////**********************************主函数*******************////voidmain(){init();while(1){examf();examt();if(nn=110)display(tt);else{display(nn);}}}//*******************函数的定义***************************voiddelay(){-6-uinti,j;for(i=0;i++;i10)for(j=0;j++;j10);}voidinit(){t=0;TMOD=0x15;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TH0=0x00;TL0=0x00;EA=1;ET1=1;ET0=1;TR1=1;TR0=1;IE=0x8a;}-7-voidtimer0()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t++;}voidexamf(){if(t==20){t=0;a=TH0;b=TL0;TH0=0x00;TL0=0x00;nn=a*256+b;}}voidexamt(){intx,y;if((TH0==0x00)&&(TL0==0x01)){TH0=0x00;-8-TL0=0x00;x=TH1-(65536-50000)/256;y=TL1-(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;tt=0.000001*(256*x+y);}}/**floatexamt(){if(t==20){t=0;a=TH0;b=TL0;TH0=0x00;TL0=0x00;nn=a*256+b;}*/-9-voiddisplay(longh){uintsw,wan,qian,bai,shi,ge;sw=h/100000;wan=h%100000/10000;qian=h%10000/1000;bai=h%1000/100;shi=h%100/10;ge=h%10;//if(sw!=0){P0=table1[sw];P2=0xdf;delay();P2=0xff;P0=table1[wan];P2=0xef;delay();P2=0xff;P0=table1[qian];P2=0xf7;delay();-10-P2=0xff;P0=table1[bai];P2=0xfb;delay();P2=0xff;P0=table1[shi];P2=0xfd;delay();P2=0xff;P0=table1[ge];P2=0xfe;delay();P2=0xff;}voidscan(){//检查第四行键盘P1=0x7f;-11-temp=P1;temp=P1&0x0f;while(temp!=0x0f){delay();temp=P1;temp=P1&0x0f;while(temp!=0x0f){temp=P1;switch(temp){case0x7e:enter=1;//表示[4,4]按下break;case0x7d:enter=1;//表示[4,3]按下break;case0x7b:enter=1;//表示[4,2]按下break;case0x77:enter=1;//表示[4,1]按下break;}while(temp!=0x0f){temp=P1;temp=temp&0x0f;-12-}}}//检查第三排键盘/*P3=0xbf;temp=P3;temp=P3&0x0f;while(temp!=0x0f){delay();temp=P3;temp=P3&0x0f;while(temp!=0x0f){temp=P3;switch(temp){case0xbe:num=1;//表示[3,4]按下break;case0xbd:num=6;//表示[3,3]按下break;case0xbb:num=3;//表示[3,2]按下break;case0xb7:num=4;//表示[3,1]按下break;-13-}while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}//检查第二行键盘P3=0xdf;temp=P3;temp=P3&0x0f;while(temp!=0x0f){delay();temp=P3;temp=P3&0x0f;while(temp!=0x0f){temp=P3;switch(temp){case0xde:num=1;//表示[2,4]按下break;case0xdd:num=6;//表示[2,3]按下-14-break;case0xdb:num=3;//表示[2,2]按下break;case0xd7:num=4;//表示[2,1]按下break;}while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}//检查第一行键盘P3=0xef;temp=P3;temp=P3&0x0f;while(temp!=0x0f){delay();temp=P3;temp=P3&0x0f;while(temp!=0x0f){-15-temp=P
本文标题:频率计实验报告
链接地址:https://www.777doc.com/doc-4358064 .html