当前位置:首页 > 单片机 > 单片机
[导读]/******************************************///PCA初始化函数void PCA_Init (void){ //CIDL --- CPS2 CPS1CPS0 ECF CMOD = 0x80;//空闲时关闭PCA,计数时钟为Fosc/12,关闭计数器溢出中断CF//CF CR - - - -

/******************************************/

//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;//捕获完成标志位

}

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭