今天充电电池到了,所以就可以放开的玩耍了

今晚主要完成了一个,根据红外传感器,实现了在小车前进方向的避障的应用,算是玩小车的一个真正开始吧。

要实现这个应用,主要用到了:

  1. 电机驱动芯片 L293D 
  2. 红外感应器、可调节的灵敏电阻、运放芯片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();
		}
	}
}

分类: C51单片机

发表评论

电子邮件地址不会被公开。 必填项已用*标注