51智能车红外避障程序设计

本文详细介绍了使用51单片机进行智能车红外避障的程序设计,通过分析MAIN.C和ZY-4WD_PWM.H两个关键文件,揭示了如何利用单片机实现避障功能。
51智能车红外避障程序设计

MAIN.C

	#include<AT89X52.H>		      //包含51单片机头文件,内部有各种寄存器定义
	#include<ZY-4WD_PWM.H>		  //包含HL-1蓝牙智能小车驱动IO口定义等函数
    
//主函数
	void main(void)
{	

	unsigned char i;
    P1=0X00; //关电车电机	
 
B:		for(i=0;i<50;i++) //判断K4是否按下
		{
		   delay(1);	//1ms内判断50次,如果其中有一次被判断到K0没按下,便重新检测
		   if(P3_2!=0)//当S1按下时,启动小车前进
		   goto B; //跳转到标号B,重新检测  
		} 
       
	     BUZZ=0;	//50次检测K0确认是按下之后,蜂鸣器发出“滴”声响,然后启动小车。
	     delay(50);
	     BUZZ=1;//响50ms后关闭蜂鸣器

		 	TMOD=0X01;
        	TH0= 0XFc;		  //1ms定时
         	TL0= 0X18;
           	TR0= 1;
        	ET0= 1;
	        EA = 1;		     //开总中断
	while(1)	//无限循环
	{ 
	 
			 //有信号为0  没有信号为1

              if(Left_1_led==1&&Right_1_led==1)

			  stop();	 //调用停止函数	  前面没有光线

			  else
			 {			  
				      if(Left_1_led==1&&Right_1_led==0)	    //右边检测到红外信号
			 	 {
				 	  rightrun();	 //调用小车右转函数
					  delay(20);

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

				  }
				  	 if(Right_1_led==0&&Left_1_led==0)		//两边传感器同时检测到红外
				  {	  
				    run();		    //调用前进函数
					delay(20);		//前进40毫秒
				
				  }
			}	 
	 }
}

ZY-4WD_PWM.H

#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_4	 //左传感器  
	
    #define Right_1_led       P3_5	 //右传感器    
   
	#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=10;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=10;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}

//后退函数 
     void  backrun(void)
{
     push_val_left=12;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=12;
	 Left_moto_back;   //左电机往后走
	 Right_moto_back;  //右电机往后走
}

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

//右转
     void  rightrun(void)
{ 
	 push_val_left=12;
	 push_val_right=0;
     Right_moto_back  ;   //左电机往前走
	 Left_moto_go   ;  //右电机往后	
}
//停止
     void  stop(void)
{ 
	 push_val_left=15;
	 push_val_right=15;
     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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1-0-1 C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值