【Proteus仿真】51单片机+按键控制步进电机驱动+LCD1602显示

【Proteus仿真】51单片机+按键控制步进电机驱动+LCD1602显示


  • Proteus仿真
    在这里插入图片描述

在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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "main.h"

//步进电机引脚
sbit s1=P2^3;
sbit s2=P2^4;
sbit s3=P2^5;
sbit s4=P2^6;

uchar scan_key1,scan_key2; //按键功能选择,00 停止,01 正转, 10 反转
uchar step1;step2; //加减速选择,10加速,01减速
static step_index;
uint count1,count2; //定时
static speed; //速度参数
//uint jiaNum=0,jianNum=0;
//uchar jiaChar[3],jianChar[2];
//uchar flag=0;
void main(void)
{
step2=0;
step1=0;
P1=0xff;//按键端口初始化
s1=0;s2=0;s3=0;s4=0; //电机端口初始化
EX1=1;//开启外部中断1
EA=1;//开启总中断
speed=2000;//速度初值,speed越小速度越快
// init\_1302();
LCD\_init();
// jiaChar[2]='\0';
// jianChar[2]='\0';
while(1)
{
get\_1302(time_1302);
DS1302\_change();

LCD\_display\_char(0,2,times);
LCD\_display\_char(0,1,date);

if((scan_key1==1)&&(scan_key2==0))// 正转
{
ground(step_index);
delay\_speed(speed);
step_index++; //大于7,从头再来
if(step_index>7)
step_index=0;
LCD\_display\_char(11,1," ");
LCD\_display\_char(11,1,"zhen");
}

if((scan_key1==0)&&(scan_key2==1)) //反转
{
ground(step_index);
delay\_speed(speed);
step_index--;
if(step_index<0) //小于0,从头再来。
step_index=7;
LCD\_display\_char(11,1," ");
LCD\_display\_char(11,1,"fan");
}

if(scan_key1==0&&scan_key2==0) // 停止
{
s1=0;s2=0;s3=0;s4=0;
// LCD\_display\_char(11,1," ");
LCD\_display\_char(11,1,"stop ");
// LCD\_display\_char(11,2," ");
}

if(step1==1&&step2==0) //加速
{
speed=speed-100;
// if(flag==1)
// jiaNum=jiaNum+1;
// jiaChar[0]=jiaNum+'0';
if(speed<1000||speed==1000) //速度最大阈值
{
speed=1000;
}
LCD\_display\_char(11,2," ");
LCD\_display\_char(11,2,"+su");
// LCD\_display\_char(14,2,jiaChar);

}
if(step1==0&&step2==0) //加减速归零
{
speed=2000;
// LCD\_display\_char(11,2," ");
LCD\_display\_char(11,2,"normal");
}
if(step1==0&&step2==1)//减速
{
speed=speed+100;
if(speed>2500||speed==2500) //速度最小阈值
{
speed=2500;
}
LCD\_display\_char(11,2," ");
LCD\_display\_char(11,2,"-su");
}
}
}

//速度延时控制函数
void delay\_speed(uint time)
{
for (count1=0;count1<time;count1++)
for(count2=0;count2<3;count2++);
}


//按键处理程序(利用外部中断)
void key(void) interrupt 2
{
uchar i;
uchar butter;
for(i=0;i<200;i++);//延时防抖
if(P3^3==0)
{
butter=~P1;//低电平有效先取反
switch(butter)
{case 0x01: scan_key1=1;scan_key2=0; break; //正转
case 0x02: scan_key1=0;scan_key2=0;break; //停止
case 0x04: scan_key1=0 ;scan_key2=1; break; //反转
case 0x08: step1=1;step2=0;break; //加速
case 0x10: step1=0;step2=1;break; //减速
case 0x20: step1=0;step2=0;break; //速度归零(回归初始值)
default : ; //其它值返回
}
}
P1=0Xff;//按键复位
}

//步进电机转步程序
void ground(step_index)
{
switch(step_index)
{
case 0://0
s1 = 1;
s2 = 0;
s3 = 0;
s4 = 0;
break;
case 1://0,1
s1 = 1;
s2 = 1;
s3 = 0;
s4 = 0;
break;
case 2://1
s1 = 0;
s2 = 1;
s3 = 0;
s4 = 0;
break;
case 3://1,2
s1 = 0;
s2 = 1;
s3 = 1;
s4 = 0;
break;
case 4://2
s1 = 0;
s2 = 0;
s3 = 1;
s4 = 0;
break;
case 5://2,3
s1 = 0;
s2 = 0;
s3 = 1;
s4 = 1;
break;
case 6://3
s1 = 0;
s2 = 0;
s3 = 0;
s4 = 1;
break;
case 7://3,0
s1 = 0;
s2 = 0;
s3 = 0;
s4 = 1;
}
}

程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1WCBKt-BwqKYZN98Y5XE-BA 
提取码:es2k