CAP功能测频率
STC12C5608AD单片机带有CAP功能,可以利用CAP功能测量信号的频率。原理是测量两次上升沿或者下降沿的时间,这个时间就是信号的周期,周期的倒数就是频率了。下面是实现的程序:
/************************************************** ?* 名称:CAP功能测量信号频率 ?* 主频:12MHz ?* 作者:Ration ?* 时间:2013年12月7日(整理) ?* 版权:版权归《单片机学习网》所有,传播请保持完整性 ?*************************************************/ #include <stc12c5608ad.h>// 调用头文件,可以上官方下载STC12C5608AD下载头文件 unsigned char counter=0; unsigned char out_data[2]={0x00}; void UART_Init() { ?? ?TMOD=0x22; ?? ?TH1=0xF3; ?? ?TL1=0xF3;?? ??? ? //设置波特率为2400?? ? ?? ?TH0=0XEC;?? ??? ? //12M下的值 ?? ?TL0=0XEC; ?? ?SCON=0X50; ?? ?TR1=1; ?? ?TR0=1; } void CAP_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; } void send232byte(unsigned char bytebuf) { ??? TI=0; ??? ?SBUF=bytebuf; ?? ?while(!TI);?? ?? ??? ? } void delay() { ?? ?unsigned int x; ?? ?for(x=0;x<65535;x++);?? ? } void PCAIRQ(void) interrupt 6 {?? ? ? ?if(CCF1==1)? // 如果是PCA捕获产生的中断 ?{ ?? ??? ?CF=0; ?? ??? ?CCF1=0;?????????????? ? ?? ??? ?out_data[0]=CCAP1L; ?? ??? ?out_data[1]=CCAP1H; ?? ??? ?CH=0; ?? ??? ?CL=0;??? ? ?}?????? ? } void main(void) {?? ? ?? ?unsigned int tmp; ?? ?unsigned long dat; ?? ?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。