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。