Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo escribir un programa PWM usando el microcontrolador stc12c5a60s2? ¿Alguien puede proporcionar rutinas detalladas?

¿Cómo escribir un programa PWM usando el microcontrolador stc12c5a60s2? ¿Alguien puede proporcionar rutinas detalladas?

#include

#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>

//* 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)

{

cambiar (modo)

{

caso 0: CCAPM1 = 0X42 ;break; // El módulo 1 está configurado en salida PWM de 8 bits, sin interrupción

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);

}

}