PCA高速输出

举报
ReCclay 发表于 2022/02/22 01:23:00 2022/02/22
【摘要】 #include "STC15W4K.H" // 包含STC15W4K寄存器定义文件 void main() { //初值计算方法为:步长值=计数脉冲频率/(2*所需频率) // (2...
#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中断标志
} 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

以下提供移植更方便的成熟程序

#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;        // 更新比较值     
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/76358549

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。