STC12C5608AD单片机带有CAP功能,可以利用CAP功能测量信号的频率。原理是测量两次上升沿或者下降沿的时间,这个时间就是信号的周期,周期的倒数就是频率了。下面是实现的程序:
#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();
}
}
|