¿Cómo utilizar el temporizador del microcontrolador 51 para generar un PWM con una frecuencia de 20 kHz y un ciclo de trabajo ajustable?
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>
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
}
}
}
} p>
}
/************************************ *********************************/
/*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
}
}