zoukankan      html  css  js  c++  java
  • STC12C5A60S2单片机 PWM调试

    #include <REG52.H>
    #include <intrins.h>
    #define U8 unsigned char
    #define U16 unsigned int
    
    /********************************************************************
                                  ÑÓʱº¯Êý
    *********************************************************************/
    void DelayMs(U8 ms) //ÔÚ11.0592M¾§ÕñÏ£¬stc10fϵÁУ¨µ¥ÖÜÆÚÖ¸ÁµÄms¼¶ÑÓʱ
    {      
    U16 i;
    while(ms--)
    {
       for(i = 0; i < 850; i++);
    }
    }
    
    /********************************************************************
                                 ³õʼ»¯¶¨Ò庯Êý
    *********************************************************************/
    
    sfr CCON     = 0xD8; //PCA¿ØÖƼĴæÆ÷
    sfr CMOD     = 0xD9; //PCAģʽ¼Ä´æÆ÷
    sfr CCAPM0   = 0xDA; //PCAÄ£¿é0ģʽ¼Ä´æÆ÷ //Ä£¿é0¶ÔÓ¦P1.3/CEX0/PCA0/PWM0(STC12C5A60S2ϵÁÐ)   
    sfr CCAPM1   = 0xDB; //PCAÄ£¿é1ģʽ¼Ä´æÆ÷ //Ä£¿é1¶ÔÓ¦P1.4/CEX1/PCA1/PWM1(STC12C5A60S2ϵÁÐ)
    sfr CL       = 0xE9; //PCA ¶¨Ê±¼Ä´æÆ÷ µÍλ
    sfr CH       = 0xF9; //PCA ¶¨Ê±¼Ä´æÆ÷ ¸ßλ
    sfr CCAP0L   = 0xEA; //PCAÄ£¿é0µÄ ²¶»ñ¼Ä´æÆ÷ µÍλ
    sfr CCAP0H   = 0xFA; //PCAÄ£¿é0µÄ ²¶»ñ¼Ä´æÆ÷ ¸ßλ
    sfr CCAP1L   = 0xEB; //PCAÄ£¿é1µÄ ²¶»ñ¼Ä´æÆ÷ µÍλ
    sfr CCAP1H   = 0xFB; //PCAÄ£¿é1µÄ ²¶»ñ¼Ä´æÆ÷ ¸ßλ
    sfr PCA_PWM0 = 0xF2; //PCA PWM ģʽ¸¨Öú¼Ä´æÆ÷0
    sfr PCA_PWM1 = 0xF3; //PCA PWM ģʽ¸¨Öú¼Ä´æÆ÷1
    sbit CF   = 0xDF;    //PCA¼ÆÊýÒç³ö±ê־λ
    sbit CR   = 0xDE;    //PCA¼ÆÊýÆ÷ ÔËÐпØÖÆλ
    sbit CCF1 = 0xD9;    //PCAÄ£¿é1ÖжϱêÖ¾
    sbit CCF0 = 0xD8;    //PCAÄ£¿é0ÖжϱêÖ¾
    
    //* CCAPOH = CCAPOL = 0XC0; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ25%
    //* CCAPOH = CCAPOL = 0X80; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ50%
    //* CCAPOH = CCAPOL = 0X40; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ75%
    /********************************************************************
                                  PWMʱÖÓº¯Êý
    *********************************************************************/
    void PWM_clock(U8 clock)
    { 
    CMOD |= (clock<<1);
    CL = 0x00;
    CH = 0x00;
    }
     /********************************************************************
                                  PWMÊä³öº¯Êýº¯Êý
    *********************************************************************/
    void PWM_start(U8 module,U8 mode) 
    {
    
    /********************ÉèÖÃPWMÐźÅÊä³öÖµ*******************************/
    CCAP0L = 0Xc0;
    CCAP0H = 0Xc0;   //Ä£¿é0³õʼÊä³ö Õ¼¿ÕÒòÊýΪ25%
    CCAP1L = 0Xc0;
    CCAP1H = 0Xc0;   //Ä£¿é1³õʼÊä³ö Õ¼¿ÕÒòÊýΪ25%
    
    if(module==0)
       {
        switch(mode)
         { 
       case 0: CCAPM0 = 0X42;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
       case 1: CCAPM0 = 0X53;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
       case 2: CCAPM0 = 0X63;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
       case 3: CCAPM0 = 0X73;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
       default: break;
       }
    }
    else
        if(module==1)
         {
          switch(mode)
           { 
       case 0: CCAPM1 = 0X42;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
       case 1: CCAPM1 = 0X53;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
       case 2: CCAPM1 = 0X63;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
       case 3: CCAPM1 = 0X73;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
       default: break;
       }
       }
       else
         if(module==2)
            {
            switch(mode)
        { 
          case 0: CCAPM0 = CCAPM1 = 0X42;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
          case 1: CCAPM0 = CCAPM1 = 0X53;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
          case 2: CCAPM0 = CCAPM1 = 0X63;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
          case 3: CCAPM0 = CCAPM1 = 0X73;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
          default: break;
          }
           }
    CR=1; //PCA¼ÆÊýÆ÷¿ªÊ¼¼ÆÊý
    }
    /********************************************************************
                                  ¶¨Ê±Æ÷º¯Êý
    *********************************************************************/
    void PCA_Intrrpt(void) interrupt 7
    {
    if(CCF0) CCF0=0;
    if(CCF1) CCF1=0;   //Èí¼þÇåÁã 
    if(CF)   CF=0;    //Èí¼þÇåÁã 
    }
    
    /********************************************************************
                                 Ö÷º¯Êý
    *********************************************************************/
    void main()
    {
    TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */ 
    TH0=0xff;
    TR0=1;     
    PWM_clock(2);   // PCA/PWMʱÖÓԴΪ ¶¨Ê±Æ÷0µÄÒç³ö
    PWM_start(0,0); // Ä£¿é0,ÉèÖÃΪPWMÊä³ö,ÎÞÖжÏ,³õʼռ¿ÕÒòËØΪ25%
    while(1)
       {
        DelayMs(250);
       }
    }
    
    /********************************************************************
                                  结束
    *********************************************************************/

    PCA的16位计数器,低8位CL和高8位CH,复位值均为00H,用于保存PCA的装载值。

    寄存器CH和CL的内容是正在自由递增计数的16位PCA定时器的值,PCA定时器是2个模块的公共时间基准,可通过编程工作在:1/12系统时钟、1/8系统时钟、1/6系统时钟、1/4系统时钟、1/2系统时钟、系统时钟、定时器0溢出或ECI脚的输入(STC12C5A60S2系列的P1.2口)。

    定时器的计数源由CMOD特殊功能寄存器中的CPS2、CPS1和CPS0位来确定

    PCA捕获/比较寄存器 --低位字节CCAPnL和高位字节CCAPnH

    当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用于PWM模式时,它们用来控制输出的占空比。其中,n = 0、1,分别对应模块0和模块1.复位值均为00H。

  • 相关阅读:
    装饰器和迭代器
    闭包函数
    函数对象
    Python函数
    函数的基本使用
    文件处理
    量化策略
    Android--生命周期
    算法转AI平台工程师记录-0
    python3.6安装
  • 原文地址:https://www.cnblogs.com/killer-xc/p/4682382.html
Copyright © 2011-2022 走看看