STC12C5608AD單片機(jī)帶有CAP功能,可以利用CAP功能測(cè)量信號(hào)的頻率。原理是測(cè)量?jī)纱紊仙鼗蛘呦陆笛氐臅r(shí)間,這個(gè)時(shí)間就是信號(hào)的周期,周期的倒數(shù)就是頻率了。下面是實(shí)現(xiàn)的程序:
/***************************************************名稱:CAP功能測(cè)量信號(hào)頻率*主頻:12MHz*作者:Ration*時(shí)間:2013年12月7日(整理)*版權(quán):版權(quán)歸《單片機(jī)學(xué)習(xí)網(wǎng)》所有,傳播請(qǐng)保持完整性*************************************************/#include//調(diào)用頭文件,可以上官方下載STC12C5608AD下載頭文件unsignedcharcounter=0;unsignedcharout_data[2]={0x00};voidUART_Init(){TMOD=0x22;TH1=0xF3;TL1=0xF3;//設(shè)置波特率為2400TH0=0XEC;//12M下的值TL0=0XEC;SCON=0X50;TR1=1;TR0=1;}voidCAP_Init(){CMOD=0X04;//ECF=1;開PCA中斷標(biāo)志CCAPM1=0X11;//CAPN0=1;下降沿捕獲。ECCF0=1;開捕獲中斷。CL=0;CH=0;//PCA計(jì)數(shù)器清零CCAP1L=0;CCAP1H=0;//捕獲寄存器清零EPCA_LVD=1;//開PCA中斷CR=1;}voidsend232byte(unsignedcharbytebuf){TI=0;SBUF=bytebuf;while(!TI);}voiddelay(){unsignedintx;for(x=0;x<65535;x++);}voidPCAIRQ(void)interrupt6{if(CCF1==1)//如果是PCA捕獲產(chǎn)生的中斷{CF=0;CCF1=0;out_data[0]=CCAP1L;out_data[1]=CCAP1H;CH=0;CL=0;}}voidmain(void){unsignedinttmp;unsignedlongdat;UART_Init();CAP_Init();EA=1;while(1)//死循環(huán){tmp=out_data[1]<<8;tmp+=out_data[0];dat=50000/tmp;//計(jì)算頻率值send232byte(dat>>8);send232byte(dat);delay();}}
程序中,T1定時(shí)器用作串口波特率發(fā)生器,用于發(fā)送頻率值給串口,T0用于PCA的時(shí)鐘發(fā)生器,設(shè)置20us中斷一次,所以,測(cè)得的值tmp*20就是周期,單位微秒,換算成頻率,即1/tmp*20/1000000,即50000/tmp。