📄 pca_capture.c
字号:
/*===============================================================*/
/*函数名称: PCA_Capture.c */
/*函数功能: 主函数,调用各模块 */
/*基本思想: 正负边沿均捕捉脉冲 */
/*修改记录: 无修改记录 */
/*编写作者: t483-4-19chenyong */
/*编写日期: 2007-4-14 */
/*===============================================================*/
#include"common.h"
#include"PCA.h"
#include<math.h>
xdata uint PCA0_Value[12],i;
xdata ulong sum0,sum1,x,y;
uchar number=0;
float value;
bit isnewdata;
/*===============================================================*/
/* CAPPn----------------------------------------------上升沿捕捉*/
/* CAPNn----------------------------------------------下降沿捕捉*/
/* ECCFn--------------------------------------------允许捕捉中断*/
/*===============================================================*/
void PCA0_Initial()
{ //PCA CEX0配置为正负边沿均捕捉
PCA0CPM0 = 0x31; //正负边沿触发模式,CEX0捕捉中断使能
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
}
void PCA_Initial()
{
PCA0MD=0x08; //PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40; //启动PCA计数器
EIE1|=0x08; //PCA中断使能
}
float PCA_Capture()
{
//把捕捉端口配置到P0.0
if(isnewdata) //捕捉十次
{
isnewdata=0;
if(number>=12)
{
sum0=PCA0_Value[1]+PCA0_Value[3]+PCA0_Value[5]+PCA0_Value[7]+PCA0_Value[9];
sum1=PCA0_Value[2]+PCA0_Value[4]+PCA0_Value[6]+PCA0_Value[8]+PCA0_Value[10];
if(sum0<sum1)
{
value=sum0;
value=(float)value*0.2;
value=(float)value/3.999892398;
}
else
{
value=sum1;
value=(float)value*0.2;
value=(float)value/3.999892398;
}
// value=sum0<sum1? x:y;
// value=sum;
// value=(float)value*0.2;
// value=(float)value/3.999892398;
number=0;
}
}
return(value);
}
/*
捕捉思想:在中断程序中放个静态变量,电平的跳变间隔就是当前的捕捉值与上次捕捉
值之差。
*/
void PCA_ISR(void) interrupt 9 using 1
{
static xdata uint temp_count=0;
if(CCF0)
{
PCA0_Value[number] = PCA0CPL0+PCA0CPH0*256-temp_count;
temp_count = PCA0CPL0+PCA0CPH0*256;
number++;
CCF0=0;
}
isnewdata=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -