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。