#include "STC15W4K.H" // 包含STC15W4K寄存器定义文件
void main()
{
//初值计算方法为:步长值=计数脉冲频率/(2*所需频率)
// (22118400/12)/(2*10000) = 92.16 = 0x005C
CCAP0L=0x5C; // 给PCA模块0的CCAP0L置初值 10khz
CCAP0H=0; // 给PCA模块0的CCAP0H 置初值
CCAPM0=0x4D; // 设置PCA模块0为时钟输出模式。
EA=1; // 开总中断
CR=1; // 启动定时器
while(1); // 等待中断
}
void PCA() interrupt 7
{
unsigned int temp; // 临时变量
temp=(CCAP0H<<8)+CCAP0L+0x5C; // 运算符“+”的优先级大于“<<”
//这里要注意类型提升,相同数据类型此处1个字节进行运算后,提升为2字节再运算
CCAP0L=temp; // 取计算结果的低8位
CCAP0H=temp>>8; // 取计算结果的高8位
CCF0 = 0; // 清PCA模块0中断标志
}
以下提供移植更方便的成熟程序
#include "STC15W4K.H" // 包含STC15W4K寄存器定义文件
#define SYSclk 22118400L
#define T100KHz ((SYSclk/2)/2/100000)
unsigned int value; // 临时存放比较寄存器增加的数值
sbit PCA_LED = P0^0; // PCA测试LED
void port_mode() // 端口模式
{
P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
}
void main()
{
port_mode(); // 所有IO口设为准双向弱上拉方式。
CMOD = 0x82; // CIDL=1,空闲模式下停止PCA计数器工作,PCA时钟源为Fosc/2
// ECF=0,禁止PCA定时器溢出中断
CCON = 0; // 清零PCA计数器溢出中断请求标志位CF
// CR = 0, 不允许 PCA 计数器计数,清零PCA 各模块中断请求标志位CCFn
CL = 0; // 清零PCA 计数器
CH = 0;
value = T100KHz;
CCAP1L=value; // 给PCA模块1的CCAP1L置初值
CCAP1H=value >> 8; // 给PCA模块1的CCAP1H 置初值
CCAPM1=0x4D; // PCA模块1为时钟输出模式,且必须使用中断。
// ECCF1=1允许PCA模块1中断
// 当[CH,CL]=[CCAP1H,CCAP1L]时,CCF1=1,产生中断请求,重装比较值。
EA=1; // 开整个单片机所有中断共享的总中断控制位
CR=1; // 启动PCA计数器(CH,CL)计数
while(1); // 等待中断
}
void PCA() interrupt 7
{
CCF1 = 0; // 清中断标志
value += T100KHz;
CCAP1L = value;
CCAP1H = value >> 8; // 更新比较值
}