11.stc15w408as单片机ccp/pca/pwm应用(代码片段)

小猿猪哥 小猿猪哥     2022-12-17     276

关键词:

STC15W408AS单片机集成了3路可编程计数器阵列(CCP/PCA)模块可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。

一、与CCP/PWM/PCA应用有关的特殊功能寄存器

STC15系列 1T 8051单片机 CCP/PCA/PWM特殊功能寄存器表 CCP/PCA/PWM SFRs

1.1PCA工作模式寄存器CMOD

PCA工作模式寄存器的格式如下:

CMOD : PCA工作模式寄存器

CIDL:空闲模式下是否停止PCA计数的控制位。

当CIDL=0时, 空闲模式下PCA计数器继续工作

当CIDL=1时, 空闲模式下PCA计数器停止工作。

CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如下表所示。

例如,CPS2/CPS1/CPS0 = 1/0/0时,CCP/PCA/PWM的时钟源是SYSclk,不用定时器0

PWM的频率为SYSclk/256。

如果要用系统时钟/3来作为PCA的时钟源, 应选择T0的益处作为CCP/PCA/PWM的时钟源,此时应让T0工作在1T模式,计 3个脉冲即产生溢出 用T0的溢出可对系统时钟进行1 ~ 65536级分频(T0工作在16位重装载模式)。

ECF:PCA计数溢出中断使能 。

当ECF = 0时,禁止寄存器CCON中CF位的中断;

当ECF = 1时,允许寄存器CCON中CF位的中断。

1.2 PCA控制寄存器CCON

PCA控制寄存器的格式如下:

CCON : PCA控制控制寄存器

CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时 CF由硬件置位。如果CMOD寄存器

的ECF位置位, CF标志可用来产生中断。CF位可通过硬件或软件置位, 但只可通过软 件清零。

CR:PCA计数器阵列运行控制位。该位通过软件置位, 用来起动PCA计数器阵列计数。该位

通过软件清零, 用来关闭PCA计数器。

CCF2:PCA模块2中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

CCF1:PCA模块1中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

CCF0:PCA模块0中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

1.3 PCA比较/捕获寄存器CCAPM0、CCAPM1和CCAPM2

PCA模块0的比较/捕获寄存器的格式如下:

CCAPM0 : PCA模块0的比较/捕获寄存器

B7:保留为将来之用。

ECOM0:允许比较器功能控制位

当ECOM0=1时,允许比较器功能

CAPP0: 正捕获控制位

当CAPP0=1时,允许上升沿捕获

CAPN0:负捕获控制位

当CAPN0=1时,允许下降捕获

MAT0: 匹配控制位

当MAT0=1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存

器的中断标志位CCF0。

TOG0: 翻转控制位

当TOG0=1时,工作在PCA高速脉冲输出 PCA计数器的值与模块的比较/捕获

寄存器的值的匹配将使CCP0脚翻转。

(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)

PWM0: 脉宽调节模式。

当PWM0=1时, CCP0脚用作脉宽调节输出。

(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)

ECCF0: 使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0, 用来产生中断。

CCAPM1和CCAPM2分别是PCA1和PCA2模块的比较/捕获寄存器,功能了CCAPM0一样,这里不做说明了。

1.4 PCA的16位计数器 — 低8位CL和高8位CH

CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。

1.5 PCA捕捉/比较寄存器 — CCAPnL(低位字节)和CCAPnH(高位字节)

当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用

于PWM模式时,它们用来控制输出的占空比。其中,n=0、1、2,分别对应模块0、模块1和模块2。复位值均为00H。它们对应的地址分别为:

CCAP0L — EAH、CCAP0H — FAH:模块0的捕捉/比较寄存器。

CCAP1L — EBH、CCAP1H — FBH:模块1的捕捉/比较寄存器。

CCAP2L — ECH、CCAP2H — FCH:模块2的捕捉/比较寄存器。

1.6 PCA模块PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2

PCA模块0的PWM寄存器的格式如下:

PCA_PWM0 : PCA模块0的PWM寄存器

EBS0_1 , EBS0_0:当PCA模块0工作于PWM模式时的功能选择位。

0 , 0 : PCA模块0工作于8位PWM功能;

0 , 1 : PCA模块0工作于7位PWM功能;

1 , 0 :PCA模块0工作于6位PWM功能;

1 , 1 :无效,PCA模块0仍工作于8位PWM模式.

EPC0H:在PWM模式下,与CCAP0H组成9位数。

EPC0L:在PWM模式下,与CCAP0L组成9位数。

PCA_PWM1和PCA_PWM2分别是PCA1和PCA2模块的PWM寄存器,功能了PCA_PWM0一样,这里不做说明了。

PCA模块的工作模式设定表入下表所示:

PCA模块工作模式设定 CCAPMn寄存器,n = 0,1,2)

二、CCP/PCA模块的工作模式

2.1 捕获模式

PCA 模块工作于捕获模式的结构图如下图所示。要使一个PCA模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和 CAPPn)或其中任何一位必须置1。 PCA模块工作于捕获模式时,对模块的外部CCPn CCP0/P1.1,CCP1/P1.0, CCP2/P3.7)的跳变进行采样。当采样到有效跳变时,PCA硬件就将PCA计数器阵列列寄存器(CH和CL)的值装载到模块的捕获寄存器中(CCAPnL和CCAPnH)。

PCA 捕获模式图

如果CCON特殊寄存器中的位CCFn和CCAPMn特殊功能寄存器的ECCFn位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。

2.2 捕获模式测试程序

// PCA0 工作为 捕获模式
// 这个模式有点类似 外部中断或者计数器
#include "stc15.h"
int count = 0;
void PCAInit();
void main()

	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);

// 捕获模式 初始化
void PCAInit()

	CMOD = 0x05;    // PCA 计数器时钟位 系统时钟  允许CCON中的CF位中断
	CCON = 0x00;    // 初始化 寄存器
	CCAPM0 = 0x11;  // 下降沿捕获  使能CCF0 中断
	CL = 0;
	CH = 0;         // 初始化  计数器
	CR = 1;         // 允许PCA 模块运行

// 中断服务程序
void PCA_isr() interrupt 7 

	CCF0 = 0;     // 清除中断标志位
	count ++;
	if(count == 100)
	
		count = 0;
		P10 = !P10;   // P10 取反
	

这里我采取的做法是,单片机的外部捕获引脚CCP0(P1.1)外接到示波器的校准输出端上面,在中断服务程序中计数100次,就把P1.0引脚输出取反,这样就把外部捕获到的信号缩小了200倍输出显示了。

2.3 高速脉冲输出模式

该模式中(下图),当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的CCPn输

出将发生翻转。要激活高速脉冲输出模式,CCAPMn寄存器的TOGn,MATn和ECOMn位必须都置位。

PCA 高速脉冲输出模式

CCAPnL的值决定了PCA模块n的输出脉冲频率。当PCA时钟源是SYSclk时,输出脉冲的频率F位:

f = SYSclk / ([CPS2,CPS0] *2 * CCAPnL)

其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 2×f ).

如果计算出的结果不是整数,则进行四舍五入取整,即

CCAPnL = INT (SYSclk / ( 2×f ) + 0.5 )

其中,INT( )为取整运算,直接去掉小数。

2.4 高速脉冲输出模式测试程序

#include "stc15.h"
#define uint unsigned int
#define T1KHz 5530;  // SYSclk / ([CPS2,CPS0] *2 * CCAPnL)
uint value = 0;
void PCAInit();
void main()

	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);

// 初始化PCA模块
void PCAInit()

	CMOD = 0x08;    // PCA 计数器时钟位 系统时钟  
	CCON = 0x00;    // 初始化 寄存器
	CL = 0;         //复位PCA计数器
	CH = 0;
	value = T1KHz;
	CCAP0L = value;  // 捕获比较寄存器
	CCAP0H = value >> 8;
	value += T1KHz;
	CCAPM0 = 0x4D;  // 允许比较器功能 
	CR = 1;         // 允许PCA 模块运行

// 中断服务程序
void PCA_isr() interrupt 7 

	CCF0 = 0; //清中断标志
	CCAP0L = value;  // 捕获比较寄存器
	CCAP0H = value >> 8;
	value += T1KHz;

在CCP0引脚通过示波器,测得如上图所示波形。

这里的PCA模块的频率为单片机时钟频率11.0592MHz,所以对外输出频率是:

11.0592MHz ÷ (2 * 5530) = 1KHz。

2.5 脉宽调节模式(PWM)

脉宽调制(PWM,Pulse Width Modulation)是一种使用程序来控制波形占空比、周期、相位波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。

STC15系列单片机的PCA模块可以通过设定各自的寄存器PCA_PWMn (n=0,1,2.下同)中的位EBSn_1/PCA_PWMn.7及EBSn_0/PCA_PWMn.6,使其工作于8位PWM或7位PWM或6位PWM模式。

8位脉宽调节模式(PWM)

PCA PWM mode / 可调制脉冲宽度输出模式结构图(PCA模块工作于8位PWM模式)

当PCA模块工作于8位PWM模式时, 由于所有模块公用仅有PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存EPCnL,CCAPnL[7:0]

有关。当0,CL[7:0]的值小于EPCnL,CCAPnL[7:0]时,输出为低; 0,CL[7:0]的值等于或大于EPCnL,CCAPnL[7:0]时,输出为高。当CL的值由FF变为00溢出时EPCnH,CCAPnH[7:0]的内容装载到EPCnL,CCAPnL[7:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。

当PWM是8位的时: PWM的频率=PCA时钟输入源频率/256。

2.6 脉宽调节模式(PWM)测试程序

// PCA 工作为 PWM模式

#include "stc15.h"
void PCAInit();
void main()

	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);

// 初始化
void PCAInit()

	CMOD = 0x00;    // PCA 计数器时钟 系统时钟/12 
	CCON = 0x00;    // 初始化 寄存器
	CCAPM0 = 0x42;          //PCA模块0 PWM模式
	PCA_PWM0 = 0x00;        //PCA模块0 工作于8位PWM
	CCAP0H = CCAP0L = 0x20; //PWM0的占空比为87.5% ((100H-20H)/100H)
	CR = 1;                 // 允许PCA 模块运行

在CCP0引脚通过示波器,测得如上图所示波形。

PWM频率 = 11.0592MHz ÷ 12 ÷ 256 = 3.61KHz

PWM占空比 = (256 - [CCAP0H = CCAP0L]) ÷ 256

代码中注释的 100H = 256。

关乎16位软件定时器模式这里不做测试,其实就是高速脉冲输出的变种程序。

11.stc15w408as单片机ccp/pca/pwm应用(代码片段)

STC15W408AS单片机集成了3路可编程计数器阵列(CCP/PCA)模块可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。一、与CCP/PWM/PCA应用有关的特殊功能寄存器STC15系列1T8051单片机CCP/PCA/PWM特殊功能寄存器表CCP/PCA/PW... 查看详情

3.stc15w408as单片机gpio

一、GPIO口介绍  STC15W408AS单片机有14个I/O口。其所有I/O口均可由软件配置成4种类型。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、推挽输出/强上拉、高阻输入(电流既不能流入也不能流出)或开漏输出功能。每个口... 查看详情

3.stc15w408as单片机gpio

一、GPIO口介绍  STC15W408AS单片机有14个I/O口。其所有I/O口均可由软件配置成4种类型。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、推挽输出/强上拉、高阻输入(电流既不能流入也不能流出)或开漏输出功能。每个口... 查看详情

2.stc15w408as单片机时钟(代码片段)

        STC15W408AS单片机有两个时钟源:内部高精度R/C时钟和外部时钟(外部输入时钟或外部晶体振荡器产生的时钟)。内部高精度R/C时钟(±0.3%),±1%温漂,常温下温漂±0.6%(-20℃~+65℃)。一、内部时钟配置内部时钟... 查看详情

1.stc15w408as单片机硬件资源

一、简介        STC15W401AS系列单片机是STC生产机器周期(1T)的单片机,是宽电压/高可靠/低功耗/超强抗干扰的新一代8051单片机,采用STC第九代加密技术,无法解密,代码完全兼容传统8051,但速度快8-12倍。内部... 查看详情

1.stc15w408as单片机硬件资源

一、简介        STC15W401AS系列单片机是STC生产机器周期(1T)的单片机,是宽电压/高可靠/低功耗/超强抗干扰的新一代8051单片机,采用STC第九代加密技术,无法解密,代码完全兼容传统8051,但速度快8-12倍。内部... 查看详情

6.stc15w408as单片机外部中断(代码片段)

一、外部中断简介        STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。        外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿... 查看详情

6.stc15w408as单片机外部中断(代码片段)

一、外部中断简介        STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。        外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿... 查看详情

6.stc15w408as单片机外部中断(代码片段)

一、外部中断简介        STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。        外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿... 查看详情

14.stc15w408as单片机iic驱动oled(代码片段)

一、OLED显示屏        STC15W408AS单片机并没有提供IIC总线的接口,但是我们可以通过模拟IIC的方式实现。关于IIC总线的只是大家可以自行上网搜索。这里以驱动SSD1306芯片的0.96寸的128*64的OLED显示屏为例。下图为OLED的外观... 查看详情

14.stc15w408as单片机iic驱动oled(代码片段)

一、OLED显示屏        STC15W408AS单片机并没有提供IIC总线的接口,但是我们可以通过模拟IIC的方式实现。关于IIC总线的只是大家可以自行上网搜索。这里以驱动SSD1306芯片的0.96寸的128*64的OLED显示屏为例。下图为OLED的外观... 查看详情

14.stc15w408as单片机iic驱动oled(代码片段)

一、OLED显示屏        STC15W408AS单片机并没有提供IIC总线的接口,但是我们可以通过模拟IIC的方式实现。关于IIC总线的只是大家可以自行上网搜索。这里以驱动SSD1306芯片的0.96寸的128*64的OLED显示屏为例。下图为OLED的外观... 查看详情

10.stc15w408as单片机a/d转换器(代码片段)

        10.STC15W408AS单片机A/D转换器        STC15系列单片机内部集成了8路10位高速A/D转换器。STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度到300KHz(30万次/秒)。8路电压输入型A/D,可做... 查看详情

12.stc15w408as单片机比较器(代码片段)

一、比较器内部结构STC15W408AS单片机内置比较器功能。的比较器内部规划如下图所示:比较器正极输入端CMP+电平可以与比较器负极输入端CMP-的电平进行比较,也可以与内部BandGap参考电压(1.27V附近)进行比较。二、STC15W... 查看详情

12.stc15w408as单片机比较器(代码片段)

一、比较器内部结构STC15W408AS单片机内置比较器功能。的比较器内部规划如下图所示:比较器正极输入端CMP+电平可以与比较器负极输入端CMP-的电平进行比较,也可以与内部BandGap参考电压(1.27V附近)进行比较。二、STC15W... 查看详情

12.stc15w408as单片机比较器(代码片段)

一、比较器内部结构STC15W408AS单片机内置比较器功能。的比较器内部规划如下图所示:比较器正极输入端CMP+电平可以与比较器负极输入端CMP-的电平进行比较,也可以与内部BandGap参考电压(1.27V附近)进行比较。二、STC15W... 查看详情

10.stc15w408as单片机a/d转换器(代码片段)

        10.STC15W408AS单片机A/D转换器        STC15系列单片机内部集成了8路10位高速A/D转换器。STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度到300KHz(30万次/秒)。8路电压输入型A/D,可做... 查看详情

10.stc15w408as单片机a/d转换器(代码片段)

        10.STC15W408AS单片机A/D转换器        STC15系列单片机内部集成了8路10位高速A/D转换器。STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度到300KHz(30万次/秒)。8路电压输入型A/D,可做... 查看详情