【51单片机】 -- 从硬件到软件的循迹小车

【51单片机】 -- 从硬件到软件的循迹小车_第1张图片

文章目录

  • 从硬件到软件的循迹小车
  • 硬件模块
  • 软件代码
  • 注意事项:

从硬件到软件的循迹小车

硬件模块

1、驱动:
【51单片机】 -- 从硬件到软件的循迹小车_第2张图片【51单片机】 -- 从硬件到软件的循迹小车_第3张图片驱动用法:参考此链接

2、循迹模块:
【51单片机】 -- 从硬件到软件的循迹小车_第4张图片
原理可参考:参考链接

3、电池盒

4、51单片机

5、小车板子:
【51单片机】 -- 从硬件到软件的循迹小车_第5张图片

软件代码

#include		  //包含51单片机头文件,内部有各种寄存器定义
	#include		  //包含HL-1蓝牙智能小车驱动IO口定义等函数
	
  sbit duoji=P1^0;
//延时函数	


//主函数
	void main(void)
{	

	      unsigned char i;
        P1=0X00;   //关电机	

				TMOD=0X01;
				TH0= 0XFc;		  //1ms定时
				TL0= 0X18;
			  TR0= 1;
				ET0= 1;
				EA = 1;			   //开总中断
	



	while(1)	//无限循环
	{ 
		
		
		  
  // 		duoji=1;
	//	   run();
		
			 //有信号为0  没有信号为1

        if(Left_1_led==0&&Right_1_led==0)

			    run();   //调用前进函数

			  else
			
 				{			  
						 if(Left_1_led==1&&Right_1_led==0)	    //左边检测到黑线
							{
								leftrun();		  //调用小车左转函数

							 }

							if(Right_1_led==1&&Left_1_led==0)		//右边检测到黑线
							{	  
									rightrun();		   //调用小车右转函数

							}
							if(Right_1_led==1&&Left_1_led==1)		//悬空状态  避悬崖
							{	  
									stop();		   //调用小车停止

							}

			 }	 
	 }
	
	 
}
#ifndef _LED_H_
  #define _LED_H_


	//定义小车驱动模块输入IO口 
	sbit L293D_IN1=P1^2; 
	sbit L293D_IN2=P1^3;
	sbit L293D_IN3=P1^4;
	sbit L293D_IN4=P1^5;
	sbit L293D_EN1=P1^6;
	sbit L293D_EN2=P1^7;
	

	/***蜂鸣器接线定义*****/
    sbit BUZZ=P2^3;
 
  #define Left_1_led        P3_7	 //左传感器  
	
  #define Right_1_led       P3_6	 //右传感器    
   
	#define Left_moto_pwm	  P1_6	 //PWM信号端

	#define Right_moto_pwm	  P1_7	 //PWM信号端
	
	#define Left_moto_go      {P1_2=1,P1_3=0;}  //左电机向前走
	#define Left_moto_back    {P1_2=0,P1_3=1;} 	//左边电机向后转
	#define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                     
	#define Right_moto_go     {P1_4=1,P1_5=0;}	//右边电机向前走
	#define Right_moto_back   {P1_4=0,P1_5=1;}	//右边电机向后走
	#define Right_moto_Stop   {P1_4=0,P1_5=0;}      	//右边电机停转   

	unsigned char pwm_val_left  =0;//变量定义
	unsigned char push_val_left =0;// 左电机占空比N/20
	unsigned char pwm_val_right =0;
	unsigned char push_val_right=0;// 右电机占空比N/20
	bit Right_moto_stop=1;
	bit Left_moto_stop =1;
	unsigned  int  time=0;
   
/************************************************************************/	
//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
   push_val_left=18;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=18;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}
     void  run1(void)
{
   push_val_left=10;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=8;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}
//后退函数 
     void  backrun(void)
{
   push_val_left=5;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=5;
	 Left_moto_back;   //左电机往后走
	 Right_moto_back;  //右电机往后走
}

//左转
     void  leftrun(void)
{	 
   push_val_left=5;
	 push_val_right=9;
	 Right_moto_go ;  //右电机往前走
   Left_moto_back   ;  //左电机后走
}

//右转
     void  rightrun(void)
{ 
	 push_val_left=9;
	 push_val_right=5;
   Left_moto_go;   //左电机往前走
	 Right_moto_back;  //右电机往后走	
}

//停止
     void  stop(void)
{	 
     
	 Right_moto_Stop ;  //右电机停止
   Left_moto_Stop  ;  //左电机停止
}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
		void pwm_out_left_moto(void)
   {  
			 if(Left_moto_stop)
			 {
					if(pwm_val_left<=push_val_left)
					{
							 Left_moto_pwm=1; 
						 //Left_moto_pwm1=1; 
					 }
					else 
					 {
							 Left_moto_pwm=0;
						 //Left_moto_pwm1=0; 
						}
					if(pwm_val_left>=20)
								 pwm_val_left=0;
			  }
			 else    
			 {
					 Left_moto_pwm=0;
				 //Left_moto_pwm1=0; 
			 }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
  { 
			if(Right_moto_stop)
			 { 
					if(pwm_val_right<=push_val_right)
					{
							 Right_moto_pwm=1; 
							//Right_moto_pwm1=1; 
					}
					else 
					{
							Right_moto_pwm=0;
							//Right_moto_pwm1=0; 
					 }
					if(pwm_val_right>=20)
						 pwm_val_right=0;
			 }
			 else    
			{
					 Right_moto_pwm=0;
					//Right_moto_pwm1=0; 
			}
   }
       
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
 	void timer0()interrupt 1   using 2
{
   TH0=0XFc;	  //1Ms定时
	 TL0=0X18;
	 time++;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }	

/*********************************************************************/	

#endif

注意事项:

1、代码当中可以通过这个数字调速度大小,这个在循迹过程中重要,太快容易冲出去;
【51单片机】 -- 从硬件到软件的循迹小车_第6张图片
2、循迹模块的灵敏度可以通过按钮调节
【51单片机】 -- 从硬件到软件的循迹小车_第7张图片

你可能感兴趣的:(#,51单片机,单片机,51单片机,物联网,嵌入式硬件)