STC12C5608AD测脉冲宽度
扫描二维码
随时随地手机看文章
/******************************************/
//PCA初始化函数
void PCA_Init (void)
{ //CIDL --- CPS2 CPS1CPS0 ECF
CMOD = 0x80;//空闲时关闭PCA,计数时钟为Fosc/12,关闭计数器溢出中断CF
//CF CR - - - - CCF1 CCF0
CCON = 0x00;//PCA控制寄存器初始化//PCA定时器停止//清除CF标志//清除模块中断标志//复位PCA寄存器
CCAPM0 = 0x21;//16位捕获模式,上升沿触发,关闭捕获中断CCF0
//CCAPM0 = 0x10;//16位捕获模式,下降沿触发,关闭捕获中断CCF0
CCAP0L = 0x00;//清零
CCAP0H = 0x00;
CL = 0x00; //清PCA计数器
CH = 0x00;
EPCAI = 1;//允许PCA模块中断,此句与STC12C5A60S不同
// EA = 1;
CR = 1; //启动PCA计数器计数
}
/******************************************/
//PCA中断服务函数 ,测脉冲宽度,
//50Hz上升沿=20000mS/2=10000(12MHz)
//50Hz上升沿=20000mS/2/2=5000(6MHz)
/******************************************/
void PCA_Int(void) interrupt 6
{
if (CCF0==1) //PCA模块0中断
{
CCF0 = 0; // 清CCF中断标志
if(Last_Capture_Data == 0) // 说明是第一个上升沿
{
Last_Capture_Data = CCAP0H; //获得捕捉数据的高8位
//高8位<<8+低8位构成16位整数
Last_Capture_Data = (Last_Capture_Data << 8) + CCAP0L;
CCAPM0=0x11;//转为下降沿中断
}
else // 说明是第二个上升沿
{
CCF0 = 0; // 清CCF中断标志
New_Capture_Data = CCAP0H; //获得捕捉数据的高8位
//高8位<<8+低8位构成16位整数
New_Capture_Data = (New_Capture_Data << 8) + CCAP0L;
g_Period = New_Capture_Data - Last_Capture_Data; //计数值单位为us
length_sum+=g_Period; // 得到周期,6MHz6MHZ时脉冲个数1000
//累计平均
PCA_t++;
if(PCA_t==4)//累加4次
{
length=length_sum>>2;//算出脉冲宽度。50Hz时:晶振16M=13333,晶振6M=5000
length=length/10;
PCA_t=0;
length_sum=0;//累计清0
}
Last_Capture_Data=0; //为下一次捕捉设定初始条件
CCAPM0 = 0x21; //转为上升沿中断
CCAP0L = 0x00;//清零
CCAP0H = 0x00;
CL = 0x00; //清PCA计数器
CH = 0x00;
Capture_over = 1;//捕获完成标志位
}
}
}