51单片机智能小车

最近学校举办了一个智能小车比赛,比赛内容为用手机蓝牙控制小车拥有5个功能,分别是超声波舵机避障,测距(显示在LCD1602上),红外跟随,循迹还有蓝牙控制小车前进后退左转又转以及停止。

 

51单片机智能小车_第1张图片

文章目录

  • 蓝牙控制所有功能
  • 一、整体思路
  • 二、代码部分
  • 1、定时器初始化
  • 2、蓝牙部分控制所有功能
  • 3、红外跟随
  • 4、循迹
  • 三、完整代码

前言

基于51单片机的智能小车是比较基础的小车,很适合初学者学习

 

一、整体思路

这款小车单片机的芯片是52RC的,是有3个定时器T0,T1,T2,一般51的是只有两个定时器T0和T1,在这里我们将PWM模块和舵机共用一个定时器T0,定时器T1用于超声波,定时器T2用做串行口的波特率给蓝牙使用。

二、代码部分

1.定时器初始化

void TimeInit()
{
	
	T2MOD=0x01;//蓝牙
	T2CON=0x30;
	TH2=0xfd;
	TL2=0xfd;
	RCAP2H=0xFF;
	RCAP2L=0xDC;
	TMOD|=0x11;//定时器1用于超声波,定时器0舵机和PWM
	SCON=0x50;
	PCON=0x00;
    TH0=(65536-100)/256;//定时0.1ms
	TL0=(65536-100)%256;
	TH1=0x00;    
    TL1=0x00; 
	TR2=1;
	ET1=1;
    ET0=1;
	PS=1;
    EA=1;
    TR0=1;
	ES=1;
	PT1=0;
	IE=0x92;  
	}

2.蓝牙部分控制所有功能

while(1)                                //程序主循环
  {
		 if(flag_REC==1)				    //
	   {
		flag_REC=0;
		if(buff[0]=='O'&&buff[1]=='N')	//第一个字节为O,第二个字节为N,第三个字节为控制码
		switch(buff[2])
	     {
		      case up :						    // 前进
			  send_str( );
			  run();
			  ShowPort=LedShowData[1]; 
			  break;
		      case down:						// 后退
			  send_str1( );
			  back();
			  ShowPort=LedShowData[2]; 
			  break;
		      case left1:						// 左转
			  send_str3( );
			  leftrun();
			  ShowPort=LedShowData[3];  
			  break;
		      case right1:						// 右转
			  send_str2( );
			  rightrun();
			  ShowPort=LedShowData[4];
			  break;
		      case stop:						// 停止
			  send_str4( );
			  ShowPort=LedShowData[0];
			  stop1();
			  break;
			  case  csbcj:						    //舵机超声波测距
			  send_str5( );
              ShowPort=LedShowData[5];		    
			  Robot_Avoidance();
			  break;
				
				case  hwgs:						   //红外跟随
			   send_str6( );
               ShowPort=LedShowData[6];		    
			   Hwgs();
			   break;
               case  xj:						   //循迹 寻黑线
			   send_str7( );
               ShowPort=LedShowData[7];		    
			   Hwgs();
			   break;
				}
	
			}
}

 

3.红外跟随

void Hwgs()
{
	while(1)
	{
	  
              if(LeftIRBZ==1&&RightIRBZ==1)
			  stop1();	 //调用停止函数	  前面没有光线
              if(LeftIRBZ==1&&RightIRBZ==0)	    //右边检测到红外信号
			 	 {
				 	  rightrun2();	 //调用小车右转函数
					  delay(1);

			     }
			   
			  if(RightIRBZ==1&&LeftIRBZ==0)		//左边检测到红外信号
				 { 
				      
				  	  leftrun2();	  //调用小车左转函数
					  delay(1);

				  }
			  if(RightIRBZ==0&&LeftIRBZ==0)		//两边传感器同时检测到红外
				  {	  
				    run();		    //调用前进函数
					delay(1);		//前进40毫秒
				
				  }
				
			  if(buff[2]!=hwgs)return;
				  }
	          return;
				
      }

4.循迹

在这里我们用到的是三路循迹,有的小车可能有4路、5路循迹, 在这里可以自己根据PWM调节速度。

void Robot_Traction()  //机器人循迹子程序                   
{
	   
	         if(Left_1_led==0&&mid_1_led==1&&Right_1_led==0)//亮的时候为0,不亮才检测到黑线
			   {
			     run1();   
			   }
				              
			  if(Left_1_led==1&&mid_1_led==1&&Right_1_led==0)	   
			 	 {
				 	  left2();		  
					
			     }
			   if(Left_1_led==1&&mid_1_led==0&&Right_1_led==0) //原地向左旋转
			   {
			     leftrun();   
				 
			   }
			  if(Left_1_led==0&&mid_1_led==1&&Right_1_led==1)		
				  {	  
				      right2();		  
					 
				  }
			  
			  if(Left_1_led==0&&mid_1_led==0&&Right_1_led==1) //原地向右旋转
			   {
			     rightrun();   
				 
			   }
			  if(Right_1_led==1&&Left_1_led==1)		
				  {	  
				      run();		   
				  }
}

				

 

 

 


三、完整代码

下面是完整的代码

https://pan.baidu.com/s/1CYsrn7LoVRdI6DA6AxBVkw

链接:https://pan.baidu.com/s/1CYsrn7LoVRdI6DA6AxBVkw

提取码:srkl

你可能感兴趣的:(智能传感器,单片机,c语言)