Red de conocimiento informático - Material del sitio web - ¿Cómo utilizar el temporizador del microcontrolador 51 para generar un PWM con una frecuencia de 20 kHz y un ciclo de trabajo ajustable?

¿Cómo utilizar el temporizador del microcontrolador 51 para generar un PWM con una frecuencia de 20 kHz y un ciclo de trabajo ajustable?

#include & ltreg52.h & gt // Incluir archivos de encabezado, generalmente no es necesario cambiarlos. El archivo de encabezado contiene definiciones de registros de funciones especiales.

sbit key 1 = p3^1; //Definir el botón de control de velocidad

sbit PWM = p1^5 //Definir el puerto de control de velocidad

Ciclo de carácter sin firmar; //Definir ciclo. Si el tiempo de temporización de referencia digital x es 10, entonces el período es 10x0,1 ms.

Carácter sin signo PWM _ ON//Define el tiempo de nivel alto.

/****************************************** ************************/

/*Función de retardo*/

/**** ************************************************** * ***********/

Retraso no válido (entero sin signo)

{

while(-CNT);

p>

}

/********************************* ***** ****************************/

/*Función principal*/

/********************************************* *** *******************/

Main()

{

Carácter sin firmar PWM _ Num //Definir marcha.

TMOD | = 0x 01; //Temporizador configurado en 1ms en cristal de 12M.

TH0 = (65536-1000)/256;

TL0 = (65536-1000)% 256; // Tiempo 1 milisegundo

IE = 0x82/ /Activar interrupción

TR0 = 1;

Período = 10; //El tiempo se puede ajustar. Aquí hay 10 pasos. El período de ajuste es de 10 ms y el PWM de 8 bits es de 256 pasos.

mientras(1)

{

Si (!KEY1)

{

Retraso (20000 ) ;

if (!KEY1)

{

PWM _ num++;

if(PWM _ Num == 4)PWM _ Num = 0;

Switch(PWM_Num){

Caso 0: P0 = 0x 06; PWM _ ON = 0 //Duración de nivel alto

Caso 1: P0 = 0x5B; PWM _ ON = 4;

Caso 2: P0 = 0x4FPWM _ ON = 6; ON = 8; pausa;

Predeterminado: pausa

}

}

}

}

}

/************************************ *********************************/

/*Función de interrupción del temporizador*/< / p>

/******************************************* * ************************/

void tim(void) interrupción 1 uso 1

{< / p>

Recuento de caracteres estáticos sin firmar; //

TH0 = (65536-1000)/256

TL0 = (65536-1000)% 256; 1 milisegundo

if (count==PWM_ON)

{

PWM = 1; //La luz está apagada

}< / p>

cuenta++;

if(cuenta==punto)

{

cuenta = 0;

si( PWM_ON! =0) // Si el tiempo izquierdo y derecho es 0, mantiene el estado original.

PWM = 0; //La luz está encendida

}

}