管脚图
我使用的是LQFP48封装的为例子
相关功能引脚说明见芯片手册P35页
例程代码
#include <STC8.h>
//测试工作频率为11.0592MHz
//数据类型宏定义
#define uchar unsigned char
#define uint unsigned int
//PCA输入时钟频率宏定义
#define PCA_Clock12 0x00 //PCA输入时钟源为系统时钟/12
#define PCA_Clock2 0x02 //PCA输入时钟源为系统时钟/2
#define PCA_ClockTimer 0x04 //PCA输入时钟源为定时器溢出脉冲
#define PCA_ClockECL 0x06 //PCA输入时钟源为ECL脚输入时钟
#define PCA_Clock 0x08 //PCA输入时钟源为系统时钟
#define PCA_Clock4 0x0a //PCA输入时钟源为系统时钟/4
#define PCA_Clock6 0x0c //PCA输入时钟源为系统时钟/6
#define PCA_Clock8 0x0e //PCA输入时钟源为系统时钟/8
//PCA启动、停止计数命令宏定义
#define PCA_START 1 //PCA启动计数
#define PCA_STOP 0 //PCA停止计数
//PCA模块PWM位数控制宏定义
#define PCA_PWM6_EBSn 0x80 //PCA模块输出6位PWM控制位
#define PCA_PWM7_EBSn 0x40 //PCA模块输出7位PWM控制位
#define PCA_PWM8_EBSn 0x00 //PCA模块输出8位PWM控制位
//PCA时钟初始化
void PCA_ClockInit(void)
{
CCON = 0x00;
CMOD = PCA_Clock; //设置PCA时钟
CL = 0x00;
CH = 0x00;
}
//PCA模块0PWM初始化
void PCA0_PWM_Init(void)
{
PCA_ClockInit();
CCAPM0 = 0x42; //PCA模块0为PWM工作模式
PCA_PWM0 = PCA_PWM6_EBSn;
CCAP0L = 0x00;
CCAP0H = 0x00;
}
//PCA模块1PWM初始化
void PCA1_PAM_Init(void)
{
PCA_ClockInit();
CCAPM1 = 0x42; //PCA模块1为PWM工作模式
PCA_PWM1 = PCA_PWM7_EBSn; //PCA模块1输出7位PWM
CCAP1L = 0x00;
CCAP1H = 0x00;
}
//PCA模块2PWM初始化
void PCA2_PAM_Init(void)
{
PCA_ClockInit();
CCAPM2 = 0x42; //PCA模块2为PWM工作模式
PCA_PWM2 = PCA_PWM8_EBSn; //PCA模块2输出8位PWM
CCAP2L = 0x00;
CCAP2H = 0x00;
}
/***************************************
*函数名称:void PCA0_PWM_Set(uchar pwm)
*函数输入:PWM位数,占空比输入
*函数返回:无
*函数说明:6位PWM计算公式50%[(40H-20H)/40H]
* 7位PWM计算公式50%[(80H-40H)/80H]
* 8位PWM计算公式50%[(100H-50H)/100H]
***************************************/
void PCA0_PWM_Set(uint pwm)
{
CCAP0L = pwm;
CCAP0H = pwm;
}
/***************************************
*函数名称:void PCA1_PWM_Set(uchar pwm)
*函数输入:PWM位数,占空比输入
*函数返回:无
*函数说明:6位PWM计算公式50%[(40H-20H)/40H]
* 7位PWM计算公式50%[(80H-40H)/80H]
* 8位PWM计算公式50%[(100H-50H)/100H]
* 10位PWM计算公式50%[(400H-200H)/400H]
***************************************/
void PCA1_PWM_Set(uint pwm)
{
CCAP1L = pwm;
CCAP1H = pwm;
}
/***************************************
*函数名称:void PCA1_PWM_Set(uchar pwm)
*函数输入:PWM位数,占空比输入
*函数返回:无
*函数说明:6位PWM计算公式50%[(40H-20H)/40H]
* 7位PWM计算公式50%[(80H-40H)/80H]
* 8位PWM计算公式50%[(100H-50H)/100H]
* 10位PWM计算公式50%[(400H-200H)/400H]
***************************************/
void PCA2_PWM_Set(uint pwm)
{
CCAP2L = pwm;
CCAP2H = pwm;
}
//启动或停止PCA计数器
//输入PCA_START启动PCA计数器,输入PCA_STOP停止PCA计数器
void PCA_Control(bit i)
{
CR = i;
}
void main()
{
PCA0_PWM_Init(); //PCA模块0 PWM工作模式初始化
PCA0_PWM_Set(0x20); //设置占空比50%
PCA1_PAM_Init(); //PCA模块1 PWM工作模式初始化
PCA1_PWM_Set(0x40); //设置占空比50%
PCA2_PAM_Init(); //PCA模块2 PWM工作模式初始化
PCA2_PWM_Set(0x80); //设置占空比50%
PCA_Control(PCA_START); //启动PCA计数器
while (1);
}
端口PWM示波器扫描结果
P1.7
P1.6
P1.5