基于C52单片机的麦克纳姆轮智能小车

引言

基于C52单片机的麦克纳姆轮智能小车是两年前学完单片机之后制作的,花了好几百大洋。

选型

主要都是淘宝买的。

包括:四个麦克纳姆轮、四个L298N电机模块、四个直流电机(带法兰)、C52单片机一块、开发板一块、电池一块、底板一块(自己画找老板加工的)、蓝牙串口一块、杜邦线和螺丝螺母若干。

代码

代码是基于keil写的,然后在单片机软件stc-isp-15xx-v6.86O生成hex文件,之后导入单片机。之后通过手机蓝牙进行控制,蓝牙软件选的是SPP软件。

代码如下:

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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/*********************
@ 王阳辉
@ 2018.12.28
********************/
#include <reg52.h>
sbit IN1 = P1 ^ 0;
sbit IN2 = P1 ^ 1;
sbit IN3 = P1 ^ 2;
sbit IN4 = P1 ^ 3;
sbit IN5 = P1 ^ 4;
sbit IN6 = P1 ^ 5;
sbit IN7 = P1 ^ 6;
sbit IN8 = P1 ^ 7;
void ahead_run();//前进
void back_run();//后退
void left_run();//左移
void right_run();//右移
void forward_turn();//顺时针旋转
void reverse_turn();//逆时针选转
void zuoqian_run();//左前
void zuohou_run();//左后
void youqian_run();//右前
void youhou_run();//右后
void l_turn();//前转
void r_turn();//后转
void a_turn();//啦啦啦
void init();//初始化
void delay();//延时
void stop();//停止

void delay(unsigned int i)
{
unsigned char t;
while (i--)
{
for (t = 0; t < 120; t++);
}
}

unsigned char flag,com;
void main()
{
init();//初始化,允许中断
while(1)
{
if(flag==1)
{
switch(com)
{
case 'a' :
delay(1);
ahead_run();
break;
case 'b' :
delay(1);
back_run();
break;
case 'l' :
delay(1);
left_run();
break;
case 'r' :
delay(1);
right_run();
break;
case 'F' :
delay(1);
forward_turn();
break;
case 'R' :
delay(1);
reverse_turn();
break;
case 'z' :
delay(1);
zuoqian_run();
break;
case 'y' :
delay(1);
youqian_run();
break;
case 'Z' :
delay(1);
zuohou_run();
break;
case 'Y' :
delay(1);
youhou_run();
break;
case 's':
delay(1);
stop();
break;
case 'm':
delay(1);
l_turn();
break;
case 'n':
delay(1);
r_turn();
break;
case 'p':
delay(1);
a_turn();
break;
default :
delay(1);
break;
}
}
RI=1;//发出中断
}
}

void init()
{
TMOD= 0x20;//设置定时器T1为方式2
TH1 = 0xfd;//定时器T1赋值,波特率9600
TL1 = 0xfd;
TR1 = 1;//接通定时器T1
REN = 1;//允许接收
SM0 = 0;
SM1 = 1;//串行口为方式1
EA = 1;//允许全局中断
ES = 1;//允许串行口中断
flag = 0;
}

void stop()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 0;
IN8 = 0;
}

void ahead_run()
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
IN5 = 0;
IN6 = 1;
IN7 = 0;
IN8 = 1;
}

void back_run()
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
IN5 = 1;
IN6 = 0;
IN7 = 1;
IN8 = 0;
}

void left_run()
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
IN5 = 0;
IN6 = 1;
IN7 = 1;
IN8 = 0;
}

void right_run()
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
IN5 = 1;
IN6 = 0;
IN7 = 0;
IN8 = 1;
}

void forward_turn()
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
IN5 = 0;
IN6 = 1;
IN7 = 1;
IN8 = 0;
}

void reverse_turn()
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
IN5 = 1;
IN6 = 0;
IN7 = 0;
IN8 = 1;
}

void zuoqian_run()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 1;
IN5 = 0;
IN6 = 1;
IN7 = 0;
IN8 = 0;
}

void youhou_run()
{
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
IN5 = 1;
IN6 = 0;
IN7 = 0;
IN8 = 0;
}

void youqian_run()
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 0;
IN8 = 1;
}

void zuohou_run()
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 1;
IN8 = 0;
}

void l_turn()
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 0;
IN8 = 0;
}

void r_turn()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 1;
IN7 = 1;
IN8 = 0;
}

void a_turn()
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 1;
IN7 = 0;
IN8 = 0;
}

void serial() interrupt 4//串口中断子程序
{
RI=0;//接收中断标志RI清零
com=SBUF;//接收蓝牙串口输出值
flag=1;//赋值1,执行switch
}

演示

小车的照片就是这样:

智能小车

演示视频:

文章作者: 王阳辉
文章链接: http://yanghuiwang.net.cn/2020/08/22/基于C52单片机的麦克纳姆轮智能小车制作/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yanghui
打赏
  • wechat
    wechat
  • alipay
    alipay

评论
ValineLivere