基于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.c1 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}; 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 ; }
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; } }
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; 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 |