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。

原文地址:https://www.cnblogs.com/killer-xc/p/4682382.html