Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¡Expertos en microcontroladores, por favor ingresen! ¿Cuántos servos puede controlar stc89c52? ¿Qué tipo de control de programa se utiliza?

¡Expertos en microcontroladores, por favor ingresen! ¿Cuántos servos puede controlar stc89c52? ¿Qué tipo de control de programa se utiliza?

20 ms es el ciclo del servo. Un ciclo puede controlar 8 servos al mismo tiempo, 20/2,5 = 8.

El temporizador genera pulsos. Dos temporizadores T0 y T1, 8*2, pueden controlar 16 servos al mismo tiempo.

El siguiente es un pequeño teclado que se utiliza para controlar la rotación de. un servo., puede consultar el siguiente programa para configurar múltiples puertos IO y agregar el ancho de pulso de cada puerto IO a la declaración condicional de la función del interruptor. Agregue el ancho de pulso de cada puerto IO a la declaración condicional de la función de conmutación. El siguiente programa es un ejemplo: if en el caso 0 puede agregar varios controles IO más y puede controlar varios al mismo tiempo. También encienda el temporizador T0, lo siguiente solo abre T1. Soy demasiado vago para cambiar el siguiente programa. Puede consultarlo si comprende el principio. y claro.

#include

#define Parar 0 //Macro, detener

#define Izquierda 1 //Macro, girar a la izquierda

#define Derecha 2 //Macro, girar a la derecha

sbit ControlPort = P1^1; //Puerto de señal de servo

sbit KeyLeft = P3^2;/Giro a la izquierda Puerto clave

sbit KeyRight = P3^3 / Puerto clave de giro a la derecha

sbit KeyStop = P1^3 //Puerto clave de inicio

unsigned char TimeOutCounter; = 0,LeftOrRight = 0; //TimeOutCounter: contador de desbordamiento del temporizador LeftOrRight: indicador de rotación izquierda/derecha del servo

void InitialTimer ( )

{

TMOD = 0x10; //Timer1 funciona en modo 1

TH1 = (65535 - 87) / 256; //0.1ms

TL1 = (65535 - 87) % 256;

EA=1; //Interrupciones totales en

ET1=1; //Permitir interrupciones del temporizador1

TR1=1; //Permitir interrupciones del temporizador1

Void InitialTimer ( ) p>

TR1=1; //inicia el temporizador/contador 1 interrupción

}

ControlLeftOrRight ( ) //controla la función del servo

{

if( KeyStop == 0 )

{

while ( !KeyStop ); //hacer que la bandera sea igual a Stop (0), que se utilizará en la función de interrupción

LeftOrRight = Stop;

}

if( KeyLeft == 0 )

{

mientras ( ! KeyLeft ); //hace que la bandera sea igual a Left (1), que se usará en la función de interrupción <

LeftOrRight = Left;

}

if( KeyRight == 0 )

{

while ( !KeyRight ); //hace que el indicador sea igual a Right(2), que se usará en la función de interrupción

IzquierdaOrDerecha = Derecha;

}

}

principal ( ) //función principal

{

InitialTimer();

for(;;)

{

ControlLeftOrRight();

}

}

p>

void Timer1 ( void ) interrupción 3 //Función de interrupción del temporizador

{

TH1 = ( 65535 - 87 ) / 256;

TL1 = (65535 - 87) % 256;

TimeOutCounter ++;

cambiar (IzquierdaODerecha)

{

caso 0:/ /Cuando 0, el servo regresa, ancho de pulso 1,5 ms

{

if( TimeOutCounter <= 15)

{

ControlPort = 1;

}

más

{

ControlPort = 0;

}

break;

}

caso 1: // Cuando es 1, el servo gira a la izquierda y el ancho del pulso es 1 ms (valor teórico, de hecho, se puede depurar). alcanzar

{

if( TimeOutCounter < = 10)

{

ControlPort = 1;

}

else

{

ControlPort = 0;

}

descanso;

}

caso 2: //cuando 2, el servo gira a la derecha con un ancho de pulso de 2 ms (valor teórico), que en realidad se puede derivar de la depuración

{

if( TimeOutCounter <=22 )

{

ControlPort = 1;

}

else

{

ControlPort = 0;

}

descanso;

}

predeterminado: break ;

}

if( TimeOutCounter == 200 ) //Período 20ms (valor teórico), más confiable, mejor no modificar

{

TimeOutCounter = 0;

}

}

}