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,不用定时器0PWM的频率为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"intcount =0;voidPCAInit();voidmain(){PCAInit(); EA =1;//CPU开放中断while(1); }// 捕获模式 初始化voidPCAInit(){ CMOD =0x05;// PCA 计数器时钟位 系统时钟 允许CCON中的CF位中断CCON =0x00;// 初始化 寄存器CCAPM0 =0x11;// 下降沿捕获 使能CCF0 中断CL =0; CH =0;// 初始化 计数器CR =1;// 允许PCA 模块运行}// 中断服务程序voidPCA_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"#defineuint unsigned int#defineT1KHz 5530;// SYSclk / ([CPS2,CPS0] *2 * CCAPnL)uint value =0;voidPCAInit();voidmain(){PCAInit(); EA =1;// CPU开放中断while(1); }// 初始化PCA模块voidPCAInit(){ 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