Step Motor
hardware
- AT89S52RC
- Step Motor(28BYJ-48)
- ULN2003 Driver Module
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++;
}
}