基于51单片机3路超声波跟随小车

       第一次接触实训,很多东西的工作原理掌握不是特别好,因此我写的就稍微浅显易懂些。所以也在此希望各位读者纠正。
       刚才开始接触的小车是想用一路跟随小车,所以就开始了解这些要用到的模块。
    **硬件电路:**L298N, 直流电机一对,51/52单片机最小系统板。电源,降压模块,车架,导线若干。
   **遇到的问题:** 中 刚开始用 的电源是干电池,4节干电池电压达到5.8-6.2V左右,不是特别理想。因为在后面驱动电机转动后,其他硬件根本无法运转。建议在网上买一些稍贵一些的可充电电池,可充电电池电压在12V左右,因此需要一个**降压模块**,使用 降压模块一定要用万用表测量,调节旋钮,使输出电压为5V。因为后面还可以用于其他的新项目。可充电电流稍大一些,在电机转动时可以向其他模块继续供电。电压稳定性好。
    在后面的驱动电路上要注意的是,要将驱动模块的负极连接到电源的负极,将单片机的负极也要连接到电源的**负极**。如果不这么做的话,即使有信号,也无法驱动电机转动。究竟为什么,就不太清楚了,也希望读者可以深究一下。
    对于硬件超声波选用型号是HCSR-04,具体工作原理去论坛里了解一下,有很多资料,一定要亲自查一下会更加熟悉一些,在这里我就不过多赘述了。
    下面我们放上代码:
#include<reg52.h>//添加头文件
#include<intrins.h>//调用库函数
#define	uchar unsigned char	
#define	uint  unsigned int
#define Moto P1//定义电机的输出端口

sbit trig = P2^0; //定义超声波1发,对应正前方
sbit echo = P2^1; 
sbit trig1 = P2^2; //定义超声波2发,收,对应左前方
sbit echo1 = P2^3; 
sbit trig2 = P2^4; //定义超声波3发,收,对应右前方
sbit echo2 = P2^5; 
void check();//声明检测函数     对应超声波1
void Delay1ms(uint c);//延时误差 0us
void count();//计算距离

void check1();//声明检测函数     对应超声波2
void count1();//计算距离

void check2();//声明检测函数     对应超声波3
void count2();//计算距离
uint time,time1,time2,S,S1,S2;  //定义全局变量时间,time time1,time2对应测距所用时间,对应距离

void main()
{

	TMOD=0x01;//设置工作方式
	EA=1; //开总中断
	ET0=1;	//开定时器允许中断
	TH0=0;//赋初值
	TL0=0;
	while(1)
	{
	
			check();   //超声波1测距
			count();  //计算距离  
			Delay1ms(100) ;	 
			if(S<15){								   //kongzhidianji 小于15就后退
			Moto=0x0a;
			}
			else if(S>15&&S<40)			  //xiaoyu 15-40停止
			
			{
			Moto=0x00;							//0000 0000
			}
			else if(S>=40&&S<100)              //40-100cm就前进跟随
			{
			Moto=0x05;                        //0000 01 01前进
			   }
			else if(S>=100){             //超过100就停止跟随
			Moto=0x0f;			
			}
											      
			check1();   //超声波2测距
			count1();  //计算距离

			Delay1ms(100) ;	 
			if(S1<30){				   //左面有人右轮转
			Moto=0x0d;	//0000 1101  
	
			
			}
			check2();   //超声波3测距
			count2();  //计算距离
			 Delay1ms(100) ;	
			 if(S2<30)	  {				  //右面有人左轮转
			 Moto=0x07;
			 
			 }
			
		
	}		
}



void check() //检测函数
{
	trig=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	trig=0;
}

void count() //计算函数
{
  while(!echo);//当ECHO脚为1,开始记时
  TR0=1;
  while(echo);//当ECHO脚为0,关闭计时
  TR0=0;
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S=(time*1.7)/100;	//单位厘米
} 
void check1() //触发方式
{
	trig1=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	trig1=0;
}

void count1() //第二个超声波计算函数
{
  while(!echo1);//当ECHO脚为1,开始记时
  TR0=1;
  while(echo1);//当ECHO脚为0,关闭计时
  TR0=0;
  time1=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S1=(time1*1.7)/100;	//单位厘米
} 
void check2() //检测函数
{
	trig2=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	trig2=0;
}

void count2() //计算函数
{
  while(!echo2);//当ECHO脚为1,开始记时
  TR0=1;
  while(echo2);//当ECHO脚为0,关闭计时
  TR0=0;
  time2=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S2=(time2*1.7)/100;	//单位厘米
} 

void Delay1ms(uint c)   //延时函数
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

代码是完整的,如果遇到那些问题的话可以直接私信我就可以了。
硬件连接:P2.0-P2.5接Trig Echo,Trig1 Echo1,Trig2 Echo2,单片机经过降压模块输出电压为5V,接到单片机最小系统板上。L298N的IN1-IN4要连接在P1.0-P1.3上。超声波模块建议采用4*3的洞洞板,焊接在洞洞板上,最好在洞洞板上将电路的正极负极连接在一起,这样就可以大大减少接线难度,3个超声波的Trig,Echo要分别接到上述的接口上。
在此过程中还遇到硬件的问题,比如输出前进信号,但是车走着就会跑偏,这可能是因为电机的摩擦系数有关。电机有的3V就可以驱动,有的1.5V就可以驱动,导致小车转动角度有问题。在选用直流电机的时候尽量选择驱动电压相同的,这样车在前进的时候就不会跑偏太多了。
如果可以的话可以加一个灯,可以包装一下。
特别强调一个开关问题,小车上开关一定先火线,然后出来后接到需要供电的模块上。切记,用红色杜邦线代表正极,黑色代表负极。不然电路可能会因为误操作被烧。

下面就是我们的小车 成品了在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46911306/article/details/106633371