CAP功能测频率
扫描二维码
随时随地手机看文章
STC12C5608AD单片机带有CAP功能,可以利用CAP功能测量信号的频率。原理是测量两次上升沿或者下降沿的时间,这个时间就是信号的周期,周期的倒数就是频率了。下面是实现的程序:
/***************************************************名称:CAP功能测量信号频率*主频:12MHz*作者:Ration*时间:2013年12月7日(整理)*版权:版权归《单片机学习网》所有,传播请保持完整性*************************************************/#include//调用头文件,可以上官方下载STC12C5608AD下载头文件unsignedcharcounter=0;unsignedcharout_data[2]={0x00};voidUART_Init(){TMOD=0x22;TH1=0xF3;TL1=0xF3;//设置波特率为2400TH0=0XEC;//12M下的值TL0=0XEC;SCON=0X50;TR1=1;TR0=1;}voidCAP_Init(){CMOD=0X04;//ECF=1;开PCA中断标志CCAPM1=0X11;//CAPN0=1;下降沿捕获。ECCF0=1;开捕获中断。CL=0;CH=0;//PCA计数器清零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捕获产生的中断{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)//死循环{tmp=out_data[1]<<8;tmp+=out_data[0];dat=50000/tmp;//计算频率值send232byte(dat>>8);send232byte(dat);delay();}}
程序中,T1定时器用作串口波特率发生器,用于发送频率值给串口,T0用于PCA的时钟发生器,设置20us中断一次,所以,测得的值tmp*20就是周期,单位微秒,换算成频率,即1/tmp*20/1000000,即50000/tmp。