51单片机+步进电机正反转4拍控制+Proteus仿真

51单片机+步进电机正反转4拍控制+Proteus仿真


在这里插入图片描述

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
ULN2003驱动5V减速步进电机程序
Target:STC89C52RC-40C
Crystal:12MHz

Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
接线方式:
IN1 ---- P10
IN2 ---- P11
IN3 ---- P12
IN4 ---- P13
+ ---- +5V
- ---- GND
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MotorData P1 //步进电机控制接口定义
uchar phasecw[4] ={0x03,0x06,0x0c,0x09};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x03,0x09,0x0c,0x06};//反转 电机导通相序 A-B-C-D

uchar key1_down,key2_down,key3_down,key1_flag,key2_flag,key3_flag;//变量定义
sbit key1 = P3^0;//按键定义
sbit key2 = P3^1;

//ms延时函数
void Delay\_xms(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
//顺时针转动
void MotorCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData=phasecw[i];
Delay\_xms(200);//转速调节
}
}
//逆时针转动
void MotorCCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData=phaseccw[i];
Delay\_xms(200);//转速调节
}
}


//开启外部中断
void Init\_P( )
{
EA=1; //开全局中断
EX0=1; //开外部中断0
IT0=1; //外部中断0边沿触发
IT1=0; //外部中断1电平触发
}
//外部中断0处理
void interint0() interrupt 0 //using \*\*
{
key1_flag = 0;
key2_flag = 0;
key3_flag = 1;


}
void key\_scan()
{
/\*\*\*\*\*\*\*\*\*\*\*\*按键1\*\*\*\*\*\*\*\*\*\*\*\*\*/
if(key1 == 0)
{
Delay\_xms(100);
if(key1 == 0)key1_down = 1;
}
if(key1_down == 1 && key1 == 1)
{
key1_flag = 1;
key2_flag = 0;
key3_flag = 0;
key1_down = 0;
}
/\*\*\*\*\*\*\*\*\*\*\*\*按键2\*\*\*\*\*\*\*\*\*\*\*\*\*/
if(key2 == 0)
{
Delay\_xms(100);
if(key2 == 0)key2_down = 1;
}
if(key2_down == 1 && key2 == 1)
{
key1_flag = 0;
key2_flag = 1;
key3_flag = 0;
key2_down = 0;
}
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*主程序\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
main()
{
Init\_P( );
while(1)
{
key\_scan();
if(key1_flag == 1)MotorCW(); //电机正转
if(key2_flag == 1)MotorCCW(); //电机反转
if(key3_flag == 1) P1 = 0x0f; //电机停止
}
}


仿真资源和程序代码

1
2
3
链接:https://pan.baidu.com/s/1zVzLTB0baOeujXBNJvKj1Q 
提取码:ihy8