¿Cómo escribir un programa PWM usando el microcontrolador stc12c5a60s2? ¿Alguien puede proporcionar rutinas detalladas?
#include
#define U8 unsigned char
#define U16 unsigned int
void DelayMs(U8 ms);
void PWM_clock(reloj U8);
void PWM_start(módulo U8, modo U8);
/// ///////////////////// Subrutina de retardo /////////////// //////////// /// /
void DelayMs(U8 ms) //retraso de nivel de ms, utilizado en cristal 11.0592M
{
U16 i;
mientras(ms--)
{
for(i = 0; i < 850; i++);
}
}
///////////////////// Entrada de función principal//////////////// //// /////////
sfr CCON = 0xD8; //registro de control PCA
sfr CMOD = 0xD9; //registro de modo PCA
sfr CCAPM0 = 0xDA; //Registro de modo del módulo 0 PCA //El módulo 0 corresponde a P1. registro de modo del módulo 1/ /El módulo 1 corresponde a P1.
4/CEX1/PCA1/PWM1 (serie STC12C5A60S2)
sfr CL = 0xE9; //Registro de temporización PCA nivel bajo
sfr CH = 0xF9 //Registro de temporización PCA nivel alto plano;
sfr CCAP0L = 0xEA; //nivel bajo del registro de captura del módulo PCA
sfr CCAP0H = 0xFA; //nivel alto del registro de captura del módulo PCA
sfr; CCAP1L = 0xEB; //nivel bajo del registro de captura del módulo PCA
sfr CCAP1H = 0xFB; //registro de captura alto del módulo PCA
sfr CCAP1H = 0xFB; registro de captura bajo
sfr CCAP1H = 0xF9; //registro alto del temporizador PCA alto
sfr PCA_PWM0 = 0xF2 //registro auxiliar del modo PCA PWM 0
sfr PCA_PWM1 = 0xF3; //Registro auxiliar del modo PCA PWM 1
sbit CF = 0xDF; //Bit de indicador de desbordamiento de recuento PCA
sbit CR = p> p>
//* CCAPOH = CCAPOL = 0X80; // El módulo 0 genera un ciclo de trabajo del 50 %
//* CCAPOH = CCAPOL = 0X40 // el módulo 0 genera un ciclo de trabajo del 75 %
void PWM_clock(reloj U8);
void PWM_start(módulo U8, modo U8);
void PWM_clock(reloj U8)
{
CMOD |= (reloj<<1);
CL = 0x00;
CH = 0x00;
}
void PWM_start(módulo U8, modo U8)
{
CCAP0L = 0XE0;
CCAP0H = 0XE0; / /El ciclo de trabajo de salida inicial; del módulo 0 es 75%
CCAP1L = 0XE4;
CCAP1H = 0XE4; // El ciclo de trabajo de salida inicial del módulo 1 es 25%
if( módulo==0)
{
switch(modo)
{
caso 0: CCAPM0 = 0X42;break; // El módulo 0 está configurado en salida PWM de 8 bits, sin interrupción
caso 1: CCAPM0 = 0X53;break; //El módulo 0 está configurado en salida PWM de 8 bits y se genera una interrupción al caer borde
caso 1: CCAPM0 = 0X53;break; p>
caso 2: CCAPM0 = 0X63;break; //El módulo 0 está configurado en salida PWM de 8 bits y se genera una interrupción el flanco ascendente
case 3.CCAPM0 = 0X73;break; //El módulo 0 está configurado. Es una salida PWM de 8 bits y genera una interrupción en el flanco de salida
Predeterminado: romper;
}
}
else
if(módulo==1)
{ p>
cambiar (modo)
{
caso 0: CCAPM1 = 0X42 ;break; // El módulo 1 está configurado en salida PWM de 8 bits, sin interrupción p>
caso 1: C
CAPM1 = 0X53;break; //El módulo 1 está configurado en salida PWM de 8 bits y se genera una interrupción en el flanco descendente
caso 2: CCAPM1 = 0X63;break; a salida PWM de 8 bits y se genera una interrupción en el flanco ascendente Generar una interrupción en el flanco
caso 3: CCAPM1 = 0X73;break //El módulo 1 está configurado en salida PWM de 8 bits; y generar una interrupción en el borde de transición
Valor predeterminado: break;
}
p> }
else
if(módulo==2)
{
cambiar(modo)
{
caso 0: CCAPM0 = CCAPM1 = 0X42;break; //Los módulos 0 y 1 están configurados en salida PWM de 8 bits, sin interrupción
caso 1: CCAPM0 = CCAPM1 = 0X53;break; salida de bit PWM, generando una interrupción en el flanco descendente
caso 2: CCAPM0 = CCAPM1 = 0X63;break ; //Los módulos 0 y 1 se configuran en salida PWM de 8 bits y se genera una interrupción el flanco ascendente
caso 3: CCAPM0 = CCAPM1 = 0X73;break; //Los módulos 0 y 1 están configurados en salida PWM de 8 bits, generan una interrupción en el flanco ascendente
Valor predeterminado: break;
}
}
CR=1; //El contador PCA comienza a contar
}
void PCA_Intrrpt(void) interrupción 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0; borrando
if(CF) CF=0; //Borrado de software
}
void main()
{
TMOD|=0x02; /* Temporizador 0 modo 2: recarga de 8 bits*/
TH0=0xAF;
TR0=1; >PWM_clock(2); //Fuente de reloj PCA/PWM para desbordamiento del temporizador 0
PWM_start(0,0); //Módulo 0, configurado en salida PWM, sin interrupción, el ciclo de trabajo inicial es del 25%
mientras(1)
{
DelayMs(250);
}
}