Buscando un programa en C para controlar un motor paso a paso con un microcontrolador
#define _STEPPER_H
#include lt;reg51.hgt;
#define uchar unsigned char
#define uint unsigned int
#define T 10000 // Definición de macro constante de temporización de 10 ms
Bit M1=P2^0;
sbit M2=P2^1;
sbit M4=P2^2;
sbit M5=P2^3 )
sbit EN=P2^4;
bit CWB=P2^5;
bit RET=P2^6;
bit CLK=P2^7;
#endif
main.c
#include "Stepper.h"
/* Subrutina de servicio temporizador/contador 0*/
void time0 () interrumpir 1 usando 1 //Utilice la interrupción del temporizador/contador 0 para generar el reloj CLK
{
/* Temporizador de 10 ms para generar un reloj de período de 20 ms, es decir, reloj de 50 Hz* / p>
TH0 = -T/256;
TL0 = -T256
CLK = ~CLK
}
/* Función de retardo de inestabilidad de enlace*/
retraso de vacío(void)
{
uchar i;
para (i = 300; igt; 0; i--);
}
/* función de escaneo de teclas*/
uchar escaneo de teclas(void)
{
uchar scancode, tmpcode;
P1 = 0xf0 // Envía las 0 líneas del código de escaneo
if ((P1amp; 0xf0 )!= 0xf0) // Si se presiona el botón
{
delay(); // Retraso del rebote
if ((P1amp; 0xf0)! =0xf0 ) // Juzga nuevamente después del retraso para eliminar el efecto de jitter
{
scancode = 0xfe;
while ((scancodeamp; 0x10)! =0)// Escaneo progresivo
{
P1 = scancode; // Código de escaneo de línea de salida
if ((P1amp; 0xf0)!=0xf0 ) // Tecla presionada en esta línea
{
tmpcode = (P1amp; 0xf0)|0x0f
/* Devuelve el bytecode característico, los bits que son; 1 corresponden a filas y columnas*/
return((~scancode) (~tmpcode));
}
else scancode = (scancodelt ;lt; 1)|0x01; // Desplaza el código de bytes de la fila un bit hacia la izquierda
}
}
}
return (0 );
// No hay ningún botón, el valor de retorno es 0
}
/* Programa principal. */
void main()
{
uchar key;
TMOD = 0x01 // Configura el temporizador 0 para que funcione Modo
EA = 1;
ET0 = 1;
/* Establecido en excitación bifásica*/
M1 = 0;
M2 = 0;
/* Establecer en pista de dirección circular*/
M4 = 1;
M5 = 1; /p>
EN = 0; // Corta la salida del variador
RET = 0; // Invalida la entrada de referencia
CWB = 1; En el sentido de las agujas del reloj
while(1)
{
key =keyscan(); // Llama a la función de escaneo de claves
switch( key )
{
case 0x11: // 0 filas y 0 columnas, clave de inicio
EN = 1 // Activar la salida del controlador
TH0 = -T/256; // Cambia T para cambiar la velocidad del motor paso a paso
TL0 = -T256;
TR0 = 1; contando
break;
case 0x21: // 0 filas y 1 columna, tecla de parada
TR0 = 0 // El temporizador 0 deja de contar
EN = 0; // Corta la salida de la unidad
break;
case 0x41: // Fila 0 y columna 2, cambia la tecla de dirección
CWB = ~CWB;
break;
case 0x81: // 0 filas y 3 columnas, clave de inicio
RET = 1; >
retraso();
RET = 0;
pausa
Predeterminado: pausa
}
}
}
}
}