1602液晶频率计的设计(Proteus仿真图和程序).docx
基于51单片机的1602液晶频率计设计一、Proteus仿真图:二、程序代码最大测量65536Hz的频率计/原理:TO定时IS,Tl计数include<REG5I.H>#include<INTRINS.H>#defineucharunsignedchar#defineuintunsignedintuintcount=0;uintnm=0;ucharFw,Fq,Fb,Fs,Fg;#defineDataPortPOsbitLCM.RS=P20;sbitLCM.RW=P2a1;sbitLCM.EN=P22;ucharcodestrO="-Testfrequency-");ucharcodestrl="F=OOOOOHz");/ucharcodestr2=":voiddelay(unsignedintk)(unsignedintij;for(i=0;i<k;i+)fr(j=0<121+)(;)/=/*函数名:VoidWaiIFOrEnable(VOid)作用:检测忙碌信号*/=/voidWaitForEnable(Void)DataPort=Oxff;1.CM-RS=O;1.CM-RW=I;_nop_();1.CM_EN=1;.nopj);.nopj);While(DataPort&0x80);delay(5);1.CM-EN=O;)/=/*函数名:voidWriteCommandLCM(ucharCMD.ucharAtlribc)作用:写命令到LCM*/=/voidWriteCommandLCM(ucharCMD,ucharAttribc)(if(Attribc)WaitForEnable();1.CM-RS=O;1.CM-RW=O;_nop_();DataPort=CMD;-110P-();1.CM-EN=I;_nop_();.nopj);1.CM-EN=O;/=/*函数名:VOidWriteDataLCM(uchardataW)作用:写数据*/=/voidWriteDataLCMCuchardataV)WaitForEnabIeO;1.CM-RS=I;1.CM-RW=O;.nopj);DataPort=dataW;-11op-0;1.CM-EN=I;.nopj);-11op-();1.CM-EN=O;)/=/*函数名:voidInitLcdO作用:LCM初始化*/=/voidInitLcdOWriteCommandLCM(0x38,1);WriteComnandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteComnandLCM(0x06,1);WriteCommandLCM(OxOc,1);/=/*函数名:voidDisplayOneChar(ucharX,ucharY,ucharDData)作用:显示指定坐标的一个字符*/=/voidDisplayOneCharCucharX,ucharY,ucharDData)Y&=1;X=15;if(Y)X=0x40;X=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/=/*函数名:voidDisplayListChar(ucharX,ucharY,ucharcode*DData作用:显示指定坐标的一串字符*/=/voidDisp1ayListChar(ucharX,ucharY,ucharcode*DData)ucharListLength=O;Y&=Oxl;X&=OxF;while(X<=15)(DisplayOneChar(X,Y,DDataListLength);1.istLength+;X+;)/=/*函数名:VOidmain(VOid)作用:主函数*/=/=/*函数名:voiddisplay()作用:显示函数*/=/voiddisp1ay()Fw=Count/10000+0x30;Fq=count/1000%10+0x30;Fb=countl00%10+0x30;Fs=countl0%10+0x30;Fg=count%10+0x30;DiSPlayOneChar(2,FW);DiSPIayOneChar(3,1,Fq);DiSPIayOneehar(4,1,Fb);DiSPIayoneChar(5,1,FS);DiSPlayOneChar(6,1,Fg);)voidInitTime(Void)(TMoD=OX51;/TO为定时器工作于方式1,Ti为计数器工作于方式1THO=OX4C;定时器50ms赋高8初值,12M晶振TLo=OXO0;/定时器50ms赋低8初值,12M晶振TRO=1;开定时器1THI=0;计数器赋高8初值初值TLI=0;计数器赋低8初值TRl=1;开计数器0ETO=I;EA=I;)voidtimeo(void)interrupt1(THo=OX4C;定时器50ms赋高8初值TLo=OXo0;/定时器50ms赋低8初值nm=nm+l;if(nm=IO)(TRl=O;关闭Tl定时器,定时IS完成TRo=0;关闭To)/=/*函数名:VOidmain(VOid)作用:主函数*/=/voidmain(void)(chari;uinttemp,templ;delay(500);/LCM初始化设置lnitLcd();InitTime();for(i=15;i>=0;i)DiSPIayLiStChar(i,0,str);显示第一行字符DiSPlayLiSlChar(i,1,strl);显示第二行字符delay(100);1while(l)(if(nm=10)定时10*50MS=500ms(temp=TLl;tempI=THl;COUnI=2*(IemPI*256+iemp);定时2乘以500ms=100Omsdisplay();THl=计数器赋高8初值初值TLI=0;计数器赋低8初值nm=0;TRl=I;TRO=I;