¡Expertos en microcontroladores, por favor ingresen! ¿Cuántos servos puede controlar stc89c52? ¿Qué tipo de control de programa se utiliza?
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; p >
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 p>
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
{ p >
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
{ p >
TimeOutCounter = 0;
}
}
}