基于STC89C52单片机的智能小车的设计与实现。小车主要能够识别黑线并检测障碍物从而实现在固定跑道内行驶并且可自动避障;小车可通过手机蓝牙进行远程操控以及能够通过超声波模块进行自动避障行驶。小车以STC89C52单片机控制器;采用红外传感器和超声波模块实现对黑线及障碍物的检测;通过单片机产生PWM波并通过L293D(H桥)驱动电机来对小车的方向和速度进行控制。(附设计流程图)

  超声波测距模块有好多种类型,比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是测试距离比较远的一款了,另外还有比较常用的国外的几款SRF系列的超声波模块,超声波模块精度能到1cm。

  在DGI385的蓝牙接口设计中,使用DGI385的多通道串口连接蓝牙模块音频接口,DGI385的异步串口连接蓝牙模块的通信口。蓝牙模块可以避免射频信号到中频信号的变换,使系统结构简单、实现简单。由于采用具有DSP核的处理器,系统还可以方便地应用到各种语音信号处理中。

  OLED显示屏分为SPI通信协议和I2C通信协议,并且具有宽温(-40度到+80度的工作温度)、超薄的特点、自发光不需背光源、对比度高、视角广、反应速度快、可用于挠曲性面板等;由于上述优点,OLED显示屏适用于POS机、智能手机、移动终端、PDA、音响设备、数码相机、仪器仪表、GPS、飞机仪表、车载音响、导航、穿戴式设备。本次设计所采用I2C四线制通信接口的0.96寸OLED屏幕(附设计原理图)

(附main.c函数)

main.c
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
#include <REGX52.H> 
#include <intrins.h>
#include <xunji.h>
#define TX P2_0
#define RX P2_1
#define Forward_L_DATA 180
#define Forward_R_DATA 180
#define Left_1_led P3_3
#define Right_1_led P3_2
#define Left_moto_pwm P1_5
#define Right_moto_pwm P1_4
unsigned char pwm_val_left =0;
unsigned char push_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
unsigned char code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,
0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
unsigned char code RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
unsigned char IRCOM[7];
#define ShowPort P2
unsigned char temp = 1;
void Forward()
{

IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void Stop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void Turn_Retreat() //后
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void Turn_left() //左
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void Delay1ms(unsigned int i)
{
unsigned char j,k;
do{
j = 10;
do{
k = 50;
do{
_nop_();
}while(--k);
}while(--j);
}while(--i);
}
void delay_nus(unsigned int i)
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n)
{
n=n+1;
while(--n)
delay_nus(900);

}
void delayms(unsigned char x)
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void Delay()
{
unsigned int DelayTime=30000;
while(DelayTime--);
return;
}
/************************************************************************/
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
void run(void)
{
push_val_left=7;
push_val_right=7;
Left_moto_go ;
Right_moto_go ;
}
void leftrun(void)
{
push_val_left=7;
push_val_right=7;
Right_moto_go ;
Left_moto_Stop ;
}
void rightrun(void)
{
push_val_left=7;
push_val_right=7;
Left_moto_go ;
Right_moto_Stop ;
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
{
Right_moto_pwm=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
}
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XFc;
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/********距离计算程序***************/
void Conut(void)
{
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=time*2;
S=S*0.17;
if(S<=300)
{
if(turn_right_flag!=1)
{
Stop();
Delay1ms(5);
}
turn_right_flag=1;
P1_7=0;
P2_0=0;
P0_6=0;
Delay1ms(10);
P1_7=1;
P2_0=1;
P0_6=1;
Delay1ms(5);
Turn_left();
Delay1ms(10);
}
else
{
turn_right_flag=0;
Forward();
}
//=======================================
if((S>=5000)||flag==1)
{
flag=0;
}
else
{
disbuff[0]=S%10;
disbuff[1]=S/10%10;
disbuff[2]=S/100%10;
disbuff[3]=S/1000;
}
}
/********************************************************/
void zd0() interrupt 3
{
flag=1;
RX=0;
}
/********超声波高电平脉冲宽度计算程序***************/
void Timer_Count(void)
{
TR1=1;
while(RX);
TR1=0;
Conut();
}
/********************************************************/
void StartModule()
{
TX=1;
Delay10us(2);
TX=0;
}
/********************************************************/
/*************主程序**************/
void main(void)
{
unsigned char i;
unsigned int a;
Delay1ms(400);
Delay1ms(5);
TMOD=TMOD|0x10;
EA=1;
TH1=0;
TL1=0;
ET1=1;
//PWM_ini();
turn_right_flag=0;
B: for(i=0;i<50;i++)
{
Delay1ms(1);
if(P3_5!=0 )
goto B;
}
//蜂鸣器响一声
BUZZ=0;
Delay1ms(50);
BUZZ=1;
while(1)
{
RX=1;
StartModule();
for(a=951;a>0;a--)
{
if(RX==1)
{
Timer_Count();
}
}
}
}

  (附些许潦草的实物图)

元器件清单
元件名称 数量
AT89C51芯片 1
排针 若干
排母 若干
L293D 1
LM7805 1
蓝牙模块 1
循迹模块 1
超声波模块 1
0.96寸OLED屏幕 1
电阻 若干
直插式电容 若干
瓷片电容 若干
LED小灯 1
按键 3
晶振 1