docs

a slatepencil documentail site

View on GitHub

Step Motor

hardware

wire

Driver AT89S52
IN1 P1.0
IN2 P1.1
IN3 P1.2
IN4 P1.3
+ 5V
- GND

code

/***********************
* Step Motor Experiments
*	A-AB-B-BC-C-CD-D-DA
* IN1~IN4 ==>> P1.0~P1.3
***********************/
#include <reg52.h>

// Motor
sbit A = P1^0;
sbit b = P1^1;
sbit C = P1^2;
sbit D = P1^3;

unsigned char MotorStep = 0;
unsigned int Speed = 1; TIM, CT;

#define speed 12

void InitMotor()
{
	A = 1;
	b = 1;
	C = 1;
	D = 1;
}

void SetMotor()
{
	switch (MotorStep)
	{
		case 0:
			if (TIM) // A
			{
				A = 0; // 0xf1
				b = 1;
				C = 1;
				D = 1;
				MotorStep = 1;
				TIM = 0;
			}
			break;
		case 1: // AB
			if (TIM)
			{
				A = 0; // 0xf3
				b = 0;
				C = 1;
				D = 1;
				MotorStep = 2;
				TIM = 0;
			}
			break;
		case 2: // B
			if (TIM)
			{
				A = 1; // 0xf2
				b = 0;
				C = 1;
				D = 1;
				MotorStep = 3;
				TIM = 0;
			}
			break;
		case 3: // BC
			if (TIM)
			{
				A = 1; // 0xf6
				b = 0;
				C = 0;
				D = 1;
				MotorStep = 4;
				TIM = 0;
			}
			break;
		case 4: // C
			if (TIM)
			{
				A = 1; // 0xf4
				b = 1;
				C = 0;
				D = 1;
				MotorStep = 5;
				TIM = 0;
			}
			break;
		case 5: // CD
			if (TIM)
			{
				A = 1; // 0xfc
				b = 1;
				C = 0;
				D = 0;
				MotorStep = 6;
				TIM = 0;
			}
			break;
		case 6: // D
			if (TIM)
			{
				A = 1; // 0xf8
				b = 1;
				C = 1;
				D = 0;
				MotorStep = 7;
				TIM = 0;
			}
			break;
		case 7: // DA
			if (TIM)
			{
				A = 0; // 0xf9
				b = 1;
				C = 1;
				D = 0;
				MotorStep = 0;
				TIM = 0;
			}
			break;
	}
}

void system_Ini()
{
	TMOD |= 0x11;
	TH0 = 0xDC; // 11.0592MHz, timer 10ms
	TL0 = 0x00;
	IE = 0x8A;
	TR0 = 1;
}

main()
{
	system_Ini();
	Init_Motor();
	while (1)
	{
		SetMotor();
	}
}

void Tzd(void) interrupt 1
{
	TH0 = 0xDC;
	TL0 = 0x00;
	TIM = 1;
}

Increase/Decrease Speed

/***********************
 * Step Motor Experiments
 *	A-AB-B-BC-C-CD-D-DA
 * IN1~IN4 ==>> P1.0~P1.3
 ***********************/
#include <reg52.h>

// Motor
sbit F1 = P1 ^ 0;
sbit F2 = P1 ^ 1;
sbit F3 = P1 ^ 2;
sbit F4 = P1 ^ 3;

unsigned char code FFW[8] = {0xfe, 0xfc, 0xfd, 0xf9, 0xfb, 0xf3, 0xf7, 0xf6}; // reverse
unsigned char code FFZ[8] = {0xf6, 0xf7, 0xf3, 0xfb, 0xf9, 0xfd, 0xfc, 0xfe}; // Forward
unsigned int K, rate;

void delay()
{
    unsigned int k, t;
    t = rate;
    while (t--)
    {
        for (k = 0; k < 200; k--)
        {
        }
    }
}
void motor_ffw()
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        P1 = FFW[i] & 0x1f;
        delay();
    }
}

void motor_turn()
{
    unsigned char x;
    rate = 0x09;
    x = 0x40;

    // accelerate
    do
    {
        motror_ffw();
        rate--;
    } while (rate != 0x01);

    // steady
    do
    {
        motor_ffw();
        x--;
    } while (x != 0x01);

    // decelerate
    do
    {
        motor_ffw();
        rate++;
    } while (rate != 0x09);
}

main()
{
    while (1)
    {
        motor_turn();
    }
}

Four step

/***********************
 * Step Motor Experiments
 *	AB-BC-CD-DA
 * IN1~IN4 ==>> P1.0~P1.3
 ***********************/
#include <reg52.h>

// Motor
sbit F1 = P1 ^ 0;
sbit F2 = P1 ^ 1;
sbit F3 = P1 ^ 2;
sbit F4 = P1 ^ 3;


unsigned char MotorStep = 0;
unsigned int MotorTimer = 0;
unsigned int TIM, CT;

#define speed 12

void InitMotor()
{
	F1 = 1;
	F2 = 1;
	F3 = 1;
	F4 = 1;
}

void SetMotor()
{
	switch (MotorStep)
	{
		case 0: // AB
			if (TIM)
			{
				F1 = 0; // 0xf3
				F2 = 0;
				F3 = 1;
				F4 = 1;
				MotorStep = 1;
				TIM = 0;
			}
			break;
		case 1: // BC
			if (TIM)
			{
				F1 = 1; // 0xf6
				F2 = 0;
				F3 = 0;
				F4 = 1;
				MotorStep = 2;
				TIM = 0;
			}
			break;
		case 2: // CD
			if (TIM)
			{
				F1 = 1; // 0xfc
				F2 = 1;
				F3 = 0;
				F4 = 0;
				MotorStep = 3;
				TIM = 0;
			}
			break;
		case 3: // DA
			if (TIM)
			{
				F1 = 0; // 0xf9
				F2 = 1;
				F3 = 1;
				F4 = 0;
				MotorStep = 0;
				TIM = 0;
			}
			break;
	}
}

void system_Ini()
{
	TMOD |= 0x11;
	TH0 = 0xDC; // 11.0592MHz, timer 10ms
	TL0 = 0x00;
	IE = 0x8A;
	TR0 = 1;
}

main()
{
	system_Ini();
	Init_Motor();
	while (1)
	{
		SetMotor();
	}
}

void Tzd(void) interrupt 1
{
	TH0 = 0xDC;
	TL0 = 0x00;
	TIM = 1;
}

Foward/Reverse

/***********************
 * Step Motor Experiments
 *	A-AB-B-BC-C-CD-D-DA
 * IN1~IN4 ==>> P1.0~P1.3
 ***********************/
#include <reg52.h>

void delay(unsigned int t);

// Motor
sbit F1 = P1 ^ 0;
sbit F2 = P1 ^ 1;
sbit F3 = P1 ^ 2;
sbit F4 = P1 ^ 3;

unsigned char code FFW[8] = {0xfe, 0xfc, 0xfd, 0xf9, 0xfb, 0xf3, 0xf7, 0xf6}; // reverse
unsigned char code FFZ[8] = {0xf6, 0xf7, 0xf3, 0xfb, 0xf9, 0xfd, 0xfc, 0xfe}; // Forward
unsigned int K;

#define speed 12

void delay(unsigned int t)
{
    unsigned int k;
    while (t--)
    {
        for (k = 0; k < 80; k++)
        {
        }
    }
}
void motor_ffw()
{
    unsigned char i;
		unsigned int j;
    for (j = 0; i < 64; j++)
    {
        for (i = 0; i < 8; i++)
				{
						if (K == 1) P1 = FFW[i]&0x1f;
						if (K == 2) P1 = FFZ[i]&0x1f;
						delay(8);
				}
    }
}

main()
{
	while (1)
	{
		K = 1;
		motor_ffw();
		K = 2;
		motor_ffw();
	}
}

Speed Adjustment

/***********************
 * Step Motor Experiments
 *	A-AB-B-BC-C-CD-D-DA
 * IN1~IN4 ==>> P1.0~P1.3
 * k2 +, k3 -, k4 start, k5 stop
 ***********************/
#include <reg52.h>

#define dula P0
sbit wei1 = P2 ^ 4;
sbit wei2 = P2 ^ 5;
sbit wei3 = P2 ^ 6;
sbit wei4 = P2 ^ 7;

unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
// Motor
sbit A1 = P1 ^ 0;
sbit B1 = P1 ^ 1;
sbit C1 = P1 ^ 2;
sbit D1 = P1 ^ 3;

sbit k1 = P3 ^ 4;
sbit k2 = P3 ^ 5;
sbit k3 = P3 ^ 6;
sbit k4 = P3 ^ 7;

#define Coil_CD1 \
    {            \
        A1 = 1;  \
        B1 = 1;  \
        C1 = 0;  \
        D1 = 0;  \
    } // CD charged
#define Coil_AD1 \
    {            \
        A1 = 0;  \
        B1 = 1;  \
        C1 = 1;  \
        D1 = 0;  \
    } // AD charged
#define Coil_AB1 \
    {            \
        A1 = 0;  \
        B1 = 0;  \
        C1 = 1;  \
        D1 = 1;  \
    } // AB charged
#define Coil_BC1 \
    {            \
        A1 = 1;  \
        B1 = 0;  \
        C1 = 0;  \
        D1 = 1;  \
    } // BC charged
#define Coil_A1 \
    {           \
        A1 = 0; \
        B1 = 1; \
        C1 = 1; \
        D1 = 1; \
    } // A charged
#define Coil_B1 \
    {           \
        A1 = 1; \
        B1 = 0; \
        C1 = 1; \
        D1 = 1; \
    } // A charged
#define Coil_C1 \
    {           \
        A1 = 1; \
        B1 = 1; \
        C1 = 0; \
        D1 = 1; \
    } // A charged
#define Coil_D1 \
    {           \
        A1 = 1; \
        B1 = 1; \
        C1 = 1; \
        D1 = 0; \
    } // A charged
#define Coil_OFF \
    {            \
        A1 = 1;  \
        B1 = 1;  \
        C1 = 1;  \
        D1 = 1;  \
    } // All not charged

unsigned char Speed = 1;
bit StopFlag;
void Display(unsigned char num);
void Init_Timer0(void);

void delay(unsigned int xms)
{
    unsigned int i, j;
    for (i = xms; i > 0; i--)
        for (j = 112; j > 0; j--)
            ;
}

main()
{
    unsigned int i = 512; // time spend to rotate 1 lap
    Init_Timer0();
    Coil_OFF while (1) // clockwise
    {
        if (k1 == 0)
        {
            delay(10);
            if (k1 == 0)
            {
                while (k1 == 0)
                    ;
                if (Speed < 18)
                    Speed++;
            }
        }
        else if (k2 == 0)
        {
            delay(10);
            if (k2 == 0)
            {
                while (k2 == 0)
                    ;
                if (Speed > 1)
                    Speed--;
            }
        }
        else if (k3 == 0)
        {
            Coil_OFF
                StopFlag = 1;
        }
        else if (k4 == 0)
        {
            StopFlag = 0;
            Display(Speed);
        }
    }
}

void Display(unsigned char num)
{
    unsigned char shi, ge;

    shi = num / 10;
    ge = num % 10;

    wei1 = 0;
    wei2 = 0;
    wei3 = 1;
    wei4 = 0;

    P0 = table[shi];
    delay(2);
    wei1 = 0;
    wei2 = 0;
    wei3 = 0;
    wei4 = 1;
    P0 = table[ge];
    delay(2);
}

void Init_Timer0(void)
{
    TMOD |= 0x01;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0_isr(void) interrupt 1
{
    static unsigned char times, i;
    TH0 = (65536 - 1000) / 256;
    TL0 = (65536 - 1000) % 256;

    if (!StopFlag)
    {
        if (times == (20 - Speed))
        {
            times = 0;
            switch (i)
            {
            case 0:
                Coil_A1;
                i++;
                break;
            case 1:
                Coil_B1;
                i++;
                break;
            case 2:
                Coil_C1;
                i++;
                break;
            case 3:
                Coil_D1;
                i++;
                break;
            case 4:
                i = 0;
                break;
            default:
                break;
            }
        }
        times++;
    }
}