跳转至内容
  • 社区首页
  • 版块
  • 最新
  • 标签
  • 热门
折叠

GitHub中文论坛

  1. 主页
  2. 版块
  3. 开源分享
  4. 四路红外循迹小车

四路红外循迹小车

已定时 已固定 已锁定 已移动 开源分享
1 帖子 1 发布者 308 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • ? 离线
    ? 离线
    老用户
    写于 最后由 老用户 编辑
    #1
    #include <reg51.h>
    /***************		宏定义区			*************/ 
    #define		PWM_Left_2		20		//左转速度               //左右两侧驱动 
    #define		PWM_Left_1		15		//小角度左转速度         //右侧单独驱动 
    #define		PWM_Right_1		15		//小角度右转速度         //左侧单独驱动 
    #define		PWM_Right_2		20		//右转速                //左右两侧驱动
    #define		PWM_straight	        40		//直行速度 
    
    /*************		电机驱动管脚定义		*************/
    sbit ENA	=	P1^0;
    sbit IN1	=	P1^1;
    sbit IN2	=	P1^2;
    sbit IN3	=	P1^3;
    sbit IN4 	=	P1^4;
    sbit ENB	=	P1^5;
    
    /*************		蜂鸣器及灯光管脚定义	*************/
    sbit buzz	=	P3^4;
    sbit rgb_red    =	P3^5;
    sbit rgb_green  =	P3^6;
    
    /*************		红外传感器管脚定义	*************/ 
    sbit LEFT_IR    =	P2^2;
    sbit RIGHT_IR   =	P2^1;			
    sbit RIGHT_IR2  =	P2^0;			
    sbit LEFT_IR2	=	P2^3;
    
    /*************		RGB流水灯管脚定义	*************/ 
    sbit p1		=	P2^4;
    sbit p2		=	P2^5;
    sbit p3		=	P2^6;
    sbit p4		=	P2^7;
    
    unsigned char PWMA,PWMB;
    unsigned int b=2;
    
    void xunji();
    void turnleft();
    void turnleft2();
    void turnright();
    void turnright2();
    void stop();
    void straight();	
    void turnleft_1();
    void liushuideng();
    
    
    void delay(unsigned int xms)
    {
      unsigned int x,y;
    	for(x=xms;x>0;x--)
    	for(y=110;y>0;y--);
    }
    
    void Timer0Init()		
    {
    	TMOD |= 0x01;
    	TL0 = (65536-100)%256;
    	TH0 = (65536-100)/256;
    	TR0 = 1;
    	ET0 = 1;
    	EA = 1;
    }
    
    /***************		main函数区		******************/
    
    void main()
    {
    	
    	rgb_green=0;
    	Timer0Init();
    	while(1)
    	{
    		xunji();
    		liushuideng();
    	}
    }
    
    /****************		子函数区		******************/
    
    void T0isp() interrupt 1//脉宽调制(PWM)
    {
    	unsigned char i,j;
    	TL0 = (65536-100)%256;	
    	TH0 = (65536-100)/256;	
    	i++;										
    	j++;										
    	if(i < PWMA)						
    	{
    		ENA = 1;								
    	}
    	else 										
    	{
    		ENA = 0;
    		if(i >= 100)
    		{
    			i = 0;
    		}
    	}
    	if(j < PWMB)						
    	{
    		ENB = 1;
    	}
    	else 										
    	{
    		ENB = 0;
    		if(j >= 100)
    		{
    			j = 0;
    		}
    	}
    }
    
    void liushuideng()	//RGB流水灯
    {
    	  p1 = 0;
    		delay(100);
    		p1 = 1;
    		p2 = 0;
    		delay(100);
    		p2 = 1;
    		p3 = 0;
    		delay(100);
    		p3 = 1;
    		p4 = 0;
    		delay(100);
    		p4 = 1;	
    }
    
    void xunji()		//循迹
    {
    	unsigned char jiaodu;
    	if(LEFT_IR == 0 && RIGHT_IR == 0	&& LEFT_IR2 == 0 && RIGHT_IR2 == 0)
    	{		
    		switch(jiaodu)
    		{
    			case 0:straight();break;
    			case 1:turnleft2();break;
    			case 2:turnright2();break;
    			default:stop();break;
    		}	
    	}
    	if(LEFT_IR == 1 && RIGHT_IR == 0 && LEFT_IR2 == 0 && RIGHT_IR2 == 0)
    	{
    		if(b==2)
    		{
    			turnleft_1();	
    			b=0;
    		}			
    		else
    		{
    			turnleft();
    		}
    		jiaodu = 0;
    	}
    	if(LEFT_IR == 0 && RIGHT_IR == 0 && LEFT_IR2 == 1 && RIGHT_IR2 == 0)
    	{
    		turnleft2();								
    		jiaodu = 1;
    	}
    	if(LEFT_IR == 1 && RIGHT_IR == 0 && LEFT_IR2 == 1 && RIGHT_IR2 == 0)
    	{
    		turnleft2();									
    		jiaodu = 1;
    	}
    	if(LEFT_IR == 0 && RIGHT_IR == 1 && LEFT_IR2 == 0 && RIGHT_IR2 == 0)
    	{
    		turnright();									
    		jiaodu = 0;
    	}
    	if(LEFT_IR == 0 && RIGHT_IR == 0 && LEFT_IR2 == 0 && RIGHT_IR2 == 1)
    	{
    		turnright2();								
    		jiaodu = 2;
    	}
    	if(LEFT_IR == 0 && RIGHT_IR == 1 && LEFT_IR2 == 0 && RIGHT_IR2 == 1)
    	{
    		turnleft2();								
    		jiaodu = 2;
    	}
    	if(LEFT_IR == 1 && RIGHT_IR == 1 && LEFT_IR2 == 1 && RIGHT_IR2 == 1)
    	{	
    		stop();
    	  	jiaodu = 3;
    	}
    }
    
    void straight()		//直行速度配置 
    {
    	IN1 = 1;
    	IN2 = 0;
    	PWMA = PWM_straight;												
    	IN3 = 1;
    	IN4 = 0;
    	PWMB = PWM_straight;												
    }
    
    void turnleft()		//左转速度配置
    {
    	IN1 = 0;
    	IN2 = 0;
    	PWMA = 0;													
    	IN3 = 1;
    	IN4 = 0;
    	PWMB = PWM_Left_1;												
    }
    
    void turnleft2()	//大角度左转速度配置
    {
    	IN1 = 0;
    	IN2 = 1;
    	PWMA = PWM_Left_2;												
    	IN3 = 1;
    	IN4 = 0;
    	PWMB = PWM_Left_2;											
    }
    
    void turnright()	//右转速度配置
    {
    	IN1 	= 1;
    	IN2 	= 0;
    	PWMA 	= PWM_Right_1;		
    	IN3 	= 0;
    	IN4 	= 0;
    	PWMB	 = 0;											
    }
    
    void turnright2()	//大角度右转速度配置
    {
    	IN1 = 1;
    	IN2 = 0;
    	PWMA = PWM_Right_2;									
    	IN3 = 0;
    	IN4 = 1;
    	PWMB = PWM_Right_2;							
    }
    
    void turnleft_1()	//内圈临时处理
    {
    	IN1 = 0;
    	IN2 = 1;
    	PWMA = 25;												
    	IN3 = 1;
    	IN4 = 0;
    	PWMB = 25;
    	delay(300);											
    }
    
    void stop()		//停车函数
    {
    	IN1 = 0;
    	IN2 = 0;
    	PWMA = 0;												
    	IN3 = 0;
    	IN4 = 0;
    	PWMB = 0;	
    	buzz=0;		
    	rgb_green=1;
    	rgb_red=0;
    	delay(1000);
    }
    
    1 条回复 最后回复
    0
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 第一个帖子
      最后一个帖子
    0
    • 社区首页
    • 版块
    • 最新
    • 标签
    • 热门