今天充电电池到了,所以就可以放开的玩耍了![]()
今晚主要完成了一个,根据红外传感器,实现了在小车前进方向的避障的应用,算是玩小车的一个真正开始吧。
要实现这个应用,主要用到了:
- 电机驱动芯片 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();
}
}
}
本文为原创内容,作者:闲鹤,原文链接:https://blog.uwenya.cc/234.html,转载请注明出处。