Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar el microcontrolador STC 89C52 para realizar la forma de onda de salida del ciclo de trabajo del control PWM, ¡programe! ¡Aquellos que pueden tomar notas detalladas son los mejores!

Cómo utilizar el microcontrolador STC 89C52 para realizar la forma de onda de salida del ciclo de trabajo del control PWM, ¡programe! ¡Aquellos que pueden tomar notas detalladas son los mejores!

¿PWMH?DATA?30H?; ¿Número de pulsos de alto nivel?

¿PWM?DATA?31H?; ¿Período PWM?

CONTADOR?DATA? ?

¿TEMP?DATA?33H?

ORG?0000H?

AJMP?MAIN?

ORG?000BH?

p>

AJMP?INTT0?

ORG?0100H?

MAIN:?

MOV?SP, #60H?; ¿Valor del puntero?

¿MOV?PWMH, #02H?;?

¿MOV?CONTADOR, #01H?

MOV?PWM, #15H?

MOV?TMOD, #02H?; ¿El temporizador 0 funciona en modo 2?

MOV?TL0, #38H?; ¿El temporizador genera un desbordamiento cada 200us?

MOV ?TH0, #38H?; ¿Valor de recarga automática?

SETB?ET0?; ¿Habilitar interrupción del temporizador 0?

¿SETB?EA?; p>SETB?TR0?; ¿Iniciar tiempo?

KSCAN:?

JNB?P1.1, K1CHECK?; Escanear KEY1,?

JNB?P1 .2, K2CHECK?; Escanear KEY2, si se presiona KEY2, ¿saltar al controlador KEY2?

SJMP?KSCAN?

K1CHECK:?

JB?P1 .1, K1HANDLE?; ¿Antirrebote, si se presiona la TECLA1, saltar al controlador KEY1?

SJMP?K1CHECK?

K1HANDLE:?

MOV?A, ¿PWMH?

CJNE?A,PWM,K1H0?; ¿Determinar si se alcanza el límite superior?

SJMP?KSCAN?; >

K1H0:?

MOV?A,PWMH?

INC?A?

CJNE?A,PWM , K1H1?; ¿Se alcanza el valor después de agregar 1?

CLR?TR0?; ¿El temporizador se detiene?

SETB?P1.0? ¿P1.0 es de nivel alto?

SJMP?K1H2?

K1H1:?

CJNE?A, #02H, K1H2?; ¿Si alcanza el límite inferior después de sumar 1?

SETB ?TR0?;¿Reiniciar el temporizador?

K1H2:?

INC?PWMH?;¿Aumentar el ciclo de trabajo?

SJMP?

K2CHECK:?

JB?P1.2, K2HANDLE?; antirrebote, si se presiona KEY2, ¿saltar al controlador KEY2?

SJMP?K2CHECK?

K2HANDLE:?

MOV?A, PWMH?

CJNE?A, #01H, K2H0?; ¿Determinar si se alcanza el límite inferior?

SJMP? KSCAN? Sí, ¿no se realiza ninguna operación?

K2H0:?

MOV?A,PWMH?

MOV?TEMP,PWM?

DEC?A?

CJNE?A, #01H, K2H1?; ¿si se alcanza el límite inferior después de restar 1?

CLR?TR0?;¿Temporizador detenido?<

/p>

CLR?P1.0?;¿P1.0 es de nivel bajo?

SJMP?K2H2?

K2H1:?

DEC ? TEMP?

CJNE?A,TEMP,K2H2?;¿Si se alcanza el límite superior?

SETB?TR0?;¿Iniciar temporizador?

K2H2:? /p>

DEC?PWMH?; ¿Reducir el ciclo de trabajo?

SJMP?KSCAN?

INTT0:?

PUSH?PSW?; ¿protección del sitio?

¿PUSH?ACC?

¿INC?COUNTER?; ¿valor de recuento más 1?

MOV?A, COUNTER?

CJNE?A, PWMH, INTT01?; ¿Si es igual al número de pulsos de nivel alto?

CLR?P1.0?;¿P1.0 pasa a nivel bajo?

INTT01 : ?

CJNE?A,PWM,INTT02?;¿Si es igual al número de ciclos?

MOV?COUNTER,#01H?;¿Reinicio del contador?

SETB?P1 .0?;¿P1.0 es de nivel alto?

INTT02:?

POP?ACC?;¿Sacar la pila?

POP? ¿PSW?

RETI?

FIN