×
单片机 > 单片机程序设计 > 详情

STC12C5608AD测脉冲宽度

发布时间:2020-06-03 发布时间:
|

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

//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; // 得到周期,6MHz 6MHZ时脉冲个数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;//捕获完成标志位

             

}         

 

 } 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析