📄 pca.c
字号:
#include "c8051F020.h"
//-----------------------------------------------------------------------------
// PCA接收发送脉冲功能模块
//-----------------------------------------------------------------------------
//
#define SAMPLES 500
void PCA0_Detect (void);
void PCA0_Init0 (void);
void PCA0_Init1 (void);
void PCA0_Init2 (void);
sbit PWM_OUT = P0^7; // 定义PWM输出端口引脚
unsigned int PWM ; // 使波形为高电平的PCA周期数
unsigned int Frequncy;
static int PCA0_flag = 0;
static int sample = 0;
xdata unsigned Pulse_catch[SAMPLES][2]; // 存储捕获结果数组
void PCA0_Function (char Puls_mode) //0为输入检测 1为输出可变占空比脉冲信号
{
if (Puls_mode==0)
{
PCA0_Init0 ();
}
else if (Puls_mode==1)
{
PCA0_Init1 ();
}
else if (Puls_mode==2)
{
PCA0_Init2 (); // 允许PCA计数器
}
else PWM_OUT = 0; //保持低电平
while(1)
{ }
}
void PCA0_Init0 (void)
{
PCA0CN = 0x00; //溢出标志清零 禁止计时器
PCA0MD = 0x88; //禁止CF中断 使用系统时钟
PCA0CPM0 = 0x30; //用 CEX0 的电平变化触发捕捉
PCA0L = 0x00;
PCA0H = 0x00;
EIE1 |= 0x08; //允许PCA中断
EA = 1; //允许全局中断
PCA0CPM0 |= 0x01; //允许CEX0捕捉中断
CR = 1; //允许PCA计数器
}
void PCA0_Init1 (void)
{
PCA0CN = 0x00; //溢出标志清零 禁止计时器
PCA0MD = 0x88; //禁止CF中断 使用系统时钟
PCA0CPM1 = 0xCB; //用16位脉冲宽度调制器 PCA0CPM1 = 0x4D为高速输出
PCA0L = 0x00;
PCA0H = 0x00;
EIE1 |= 0x08; // 允许PCA中断
EA = 1; // 允许全局中断
PCA0CPM1 |= 0x01; // 允许比较中断(可变占空比)
CR = 1; // 允许PCA计数器
}
void PCA0_Init2 (void)
{
PCA0_flag = 1;
PCA0CN = 0x00; //溢出标志清零 禁止计时器
PCA0MD = 0x88; //禁止CF中断 使用系统时钟
PCA0CPM1 = 0x4E; //PCA0的频率输出方式
PCA0L = 0x00;
PCA0H = 0x00;
EIE1 |= 0x08; // 允许PCA中断
EA = 1; // 允许全局中断
PCA0CPM1 |= 0x01; // 允许比较中断
CR = 1;
}
void PCA0_Detect (void) interrupt 9
{
if (CCF0)
{
CCF0 = 0; // 清除比较标志
if(sample > SAMPLES) sample = 0;
else
{
Pulse_catch[sample][0] = PCA0CPL0;
Pulse_catch[sample][1] = PCA0CPH0;
sample++;
}
}
else if (!CCF1&PCA0_flag)
{
CCF1 = 0;
PCA0CPL1 = (0xff & PWM); // 设置PWM的下一个匹配值 此处可以通过读数组来写PWM
PCA0CPH1 = (0xff & (PWM >> 8));
}
/* else if (!CCF1&ff)
{ // 处理其它PCA中断
CCF1 = 0;
if (PWM_OUT) // 处理上升沿
{
PCA0CPL0 = (0xff & PWM); // 设置PWM的下一个匹配值 此处可以通过读数组来写PWM
PCA0CPH0 = (0xff & (PWM >> 8));
}
else // 处理下降沿
{
PCA0CPL0 = 0; // 设置下一个匹配值为0
PCA0CPH0 = 0;
}
} 高速输出时的16位PWM */
else if (CCF1&PCA0_flag)
{
CCF1 = 0;
PCA0CPH1 = Frequncy; //设置输出频率值 读取数组
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -