STC12C5608AD單片機帶有CAP功能,可以利用CAP功能測量信號的頻率。原理是測量兩次上升沿或者下降沿的時間,這個時間就是信號的周期,周期的倒數(shù)就是頻率了。下面是實現(xiàn)的程序:
/***************************************************名稱:CAP功能測量信號頻率*主頻:12MHz*作者:Ration*時間:2013年12月7日(整理)*版權(quán):版權(quán)歸《單片機學(xué)習(xí)網(wǎ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計數(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;//計算頻率值send232byte(dat>>8);send232byte(dat);delay();}}
程序中,T1定時器用作串口波特率發(fā)生器,用于發(fā)送頻率值給串口,T0用于PCA的時鐘發(fā)生器,設(shè)置20us中斷一次,所以,測得的值tmp*20就是周期,單位微秒,換算成頻率,即1/tmp*20/1000000,即50000/tmp。