zl程序教程

您现在的位置是:首页 >  其他

当前栏目

PCA高速输出

输出 高速 PCA
2023-09-11 14:20:36 时间
#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;        // 更新比较值     
}