CAP功能测频率

  • 学习3875次

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。

发表评论

关闭菜单