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

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


在这里插入图片描述

更新内容(2022年5月2日)

调整了Proteus仿真接线问题,

程序代码

  • 急停放在了外部中断0里面实现。
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//四相八拍转动数组
uchar code FFW[8]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0)
};//八拍
uchar code REV[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0)
};
uchar key1_down,key2_down,key3_down,key1_flag,key2_flag,key3_flag;//变量定义
sbit key1 = P3^0;//按键定义
sbit key2 = P3^1;
sbit key3 = P3^2;
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*按键程序\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*按键延迟函数100MS\*\*\*\*\*\*\*\*\*\*/
void delay()
{
unsigned char i, j, k;

\_nop\_();
\_nop\_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

//开启外部中断
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();
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();
if(key2 == 0)key2_down = 1;
}
if(key2_down == 1 && key2 == 1)
{
key1_flag = 0;
key2_flag = 1;
key3_flag = 0;
key2_down = 0;
}
/\*\*\*\*\*\*\*\*\*\*\*\*按键3\*\*\*\*\*\*\*\*\*\*\*\*
if(key3 == 0)
{
delay();
if(key3 == 0)key3\_down = 1;
}
if(key3\_down == 1 && key3 == 1)
{
key1\_flag = 0;
key2\_flag = 0;
key3\_flag = 1;
key3\_down = 0;
}
\*/
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*转动延迟函数\*\*\*\*\*\*\*\*\*\*/
void delayB(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*电机正转\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void motor\_ffw()
{
uchar i;
for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW[i]; //取数据
delayB(100); //调节转速
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*电机反转\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void motor\_rev()
{
uchar i;
for (i=0; i<8; i++) //一个周期转30度
{
P1 = REV[i]; //取数据
delayB(100); //调节转速
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*主程序\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
main()
{
Init\_P( );
while(1)
{
key\_scan();
if(key1_flag == 1)motor\_ffw(); //电机正转
if(key2_flag == 1)motor\_rev(); //电机反转
if(key3_flag == 1) P1 = 0x0f; //电机停止
}
}

程序源码和仿真

1
2
3
链接:https://pan.baidu.com/s/12ShpxKJxTVWPpx9Q2uQDhA 
提取码:68zz