Red de conocimiento informático - Conocimiento de la instalación - Buscando un programa en C para controlar un motor paso a paso con un microcontrolador

Buscando un programa en C para controlar un motor paso a paso con un microcontrolador

#ifndef _STEPPER_H // Evitar que se elimine la referencia a Stepper.h

#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* /

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

}

}

}

}

}