今天充电电池到了,所以就可以放开的玩耍了
今晚主要完成了一个,根据红外传感器,实现了在小车前进方向的避障的应用,算是玩小车的一个真正开始吧。
要实现这个应用,主要用到了:
- 电机驱动芯片 L293D
- 红外感应器、可调节的灵敏电阻、运放芯片LM324D
L293D电路图:
其中要注意的就是真值表:
L293D 电机驱动
真值表
控制MOTO1
EN1 IN1 –> OUT1
EN1 IN2 –> OUT2
控制MOTO2
EN2 IN3 –> OUT3
EN2 IN4 –> OUT4
一个电机有两个接线端 一根正电源线 一根负电源线
控制这两根线的高低电平,使电平高低反转,使电机旋转
LM324D电路图:
视频:
主要程序(代码写的还不是很好,小车的灵敏度还是有待优化的~):
#include "STC12C5A60S2.h" #include <intrins.h> /** L293D 电机驱动 真值表 控制MOTO1 EN1 IN1 --> OUT1 EN1 IN2 --> OUT2 控制MOTO2 EN2 IN3 --> OUT3 EN2 IN4 --> OUT4 一个电机有两个接线端 一根正电源线 一根负电源线 控制这两根线的高低电平,使电平高低反转,使电机旋转 **/ /********************************/ /* 电机1 右电机 */ sbit en1 = P1 ^ 3; sbit in1 = P1 ^ 5; sbit in2 = P1 ^ 6; /* 电机2 左电机 */ sbit en2 = P1 ^ 4; sbit in3 = P1 ^ 1; sbit in4 = P1 ^ 0; /* 红外传感器 */ sbit rp1 = P2 ^ 3; sbit rp2 = P2 ^ 4; sbit k1 = P3 ^ 0; sbit k2 = P3 ^ 1; sbit led1 = P0 ^ 0; sbit led2 = P0 ^ 1; unsigned char TEST = 0; unsigned char start = 0; void delay500ms(void) //误差 -0.000000000028us { unsigned char a,b,c; for(c=189;c>0;c--) for(b=230;b>0;b--) for(a=33;a>0;a--); } void delay100ms(void) //误差 -0.000000000006us { unsigned char a,b,c; for(c=244;c>0;c--) for(b=8;b>0;b--) for(a=152;a>0;a--); _nop_(); //if Keil,require use intrins.h _nop_(); //if Keil,require use intrins.h } void delay10ms(void) //误差 -0.000000000001us { unsigned char a,b,c; for(c=199;c>0;c--) for(b=120;b>0;b--) for(a=1;a>0;a--); } // 停止 void Stop() { en1 = 0; en2 = 0; } // 向前 void Forward() { en1 = 1; en2 = 1; in1 = 1; in2 = 0; in3 = 1; in4 = 0; } // 向后 void Back() { en1 = 1; en2 = 1; in1 = 0; in2 = 1; in3 = 0; in4 = 1; } // 向左 void Left() { en1 = 1; en2 = 1; in1 = 1; in2 = 0; in3 = 0; in4 = 1; } // 向右 void Right() { en1 = 1; en2 = 1; in1 = 0; in2 = 1; in3 = 1; in4 = 0; } void keyPros() { if(k1==0) { delay10ms(); if(k1 == 0) { start = 1; Forward(); } while(!k1); } if(k2==0) { delay10ms(); if(k2 == 0) { start = 0; Stop(); } while(!k2); } } unsigned char monitor = 0; void Scan() { if(rp1 == 1 && rp2 == 1) { Back(); delay100ms(); delay100ms(); delay100ms(); monitor = 1; return; } if(rp1 == 1) { Left(); delay100ms(); delay100ms(); monitor = 1; return; } if(rp2 == 1) { Right(); delay100ms(); delay100ms(); monitor = 1; return; } monitor = 0; } void main() { while(1) { keyPros(); if(start == 0) continue; Scan(); if(monitor == 0) { Forward(); } } }