51循迹避障小车

L298N的ENA和ENB 要连下面两个脚,上面两个脚是5V.
用51最小系统板就可以了,最好用万用板引出VCC和GND两个排针,不然线会很乱。
电压最好用电压档测一下,别把板子烧了,51单片机是5V供电。

//主函数
#include <AT89X52.H>		         
#include <intrins.h>
#include "xunji.h"
#include "motor.h"
#define uint    unsigned int      //重定义无符号整数类型
#define uchar   unsigned char     //重定义无符号字符类型
	
//避障引脚定义  
sbit Left_bizhang_led=P0^2;          //左避障传感器	  
sbit Right_bizhang_led=P0^3;         //右避障传感器	
	
sbit ENz=P1^5;
sbit ENy=P1^6;

extern unsigned char push_val_left1;
extern unsigned char push_val_right1;
extern unsigned char i ; 
extern unsigned char j ; 

//T0计时器初始化
void T0_Init()	 
{
  TMOD|=0X01;	//定时器0为方式1
  TH0= 0XFF;    //1ms定时
  TL0= 0XA4;
  TR0= 1;		//开启定时器0
  ET0= 1;		//开启定时器0中断
  EA=1; 	    //开总中断
}


//主函数
void main()                     
{
	T0_Init();
  while(1)                      
  { 
		  Car_Traction ();
		  //Car_Avoidance();
  }
}


//定时器0中断服务函数
void timer0()interrupt 1	//using 0  
{
    TH0=0XFF;	  
	  TL0=0XA4; 
    i++;
	  j++;
	 if(i<=push_val_left1)
			ENz=1;
	 else 
		  ENz=0;
	 if(j<=push_val_right1)
		  ENy=1;
	 else 
		  ENy=0;
	 if(i==20)
	 i=0;
	  if(j==20)
	 j=0;
}	

//循迹部分

#include "xunji.h"
#include "motor.h"

//延时函数1
void delay_nus(unsigned int t)  
{ 
    t=t/10;
   while(--t);
}

//延时函数2
void delay_nms(unsigned int s)   
{ 
    s=s+1;
   while(--s)  
   delay_nus(900);  
}

void Car_Traction()                     
{	
   if(right1==0&&right2==0&&left1==0&&left2==0)        //左右两边均没有识别到黑线
   {
     	 run();
       delay_nms(10);		 
   }
   else if(left1==0&&left2==0&&right2==1)   //右2遇黑线
   {
       rightrun2();
		  while(1)
       {
				 if(right1==0&&right2==0&&left1==0&&left2==0)
				 break;
			 }
   }
	  else if(left1==0&&left2==0&&right1==1)   //右1遇黑线
   {   
       rightrun1();
      while(1)
       {
				 if(right1==0&&right2==1&&left1==0&&left2==0)
				 break;
			 }		 
   }
   else if(left2==1&&right1==0&&right2==0)  //左2遇黑线
   {
     leftrun2();
		 while(1)
       {
				 if(right1==0&&right2==0&&left1==0&&left2==0)
				 break;
			 }		 
   }
	 else if(left1==1&&right1==0&&right2==0)  //左1遇黑线
   {
     leftrun1();  		 
		 while(1)
       {
				 if(right1==0&&right2==0&&left1==0&&left2==1)
			   break;
			 }		 
   }
   else if(left1==1&&left2==1&&right1==1&&right2==1)  //左右都遇到黑线
   {   
//		   a=0;
//		   a++;
//		 if(a<=6)
//		 {
//		 run();
//			 delay_nms (10);
//		 }
//		 else if(a>6)
//		 {
		   stop();
		   delay_nms(10); 
		 }	  
   }

//电机pwm部分

```c

#include "motor.h"
unsigned char push_val_left1;
unsigned char push_val_right1;
unsigned char i ; 
unsigned char j ; 

//前进
void  run(void)
{
	IN1=1;
	IN2=0;
	IN3=1;
	IN4=0;
	push_val_left1=12;

	push_val_right1=12;

}

//后退
void  backrun(void)
{
	IN1=0;
	IN2=1;
	IN3=0;
	IN4=1;
	push_val_left1=12;
	push_val_right1=12;

}

//左大转
void  leftrun1(void)
{	
	IN1=0;
	IN2=1;
	IN3=1;
	IN4=0; 
	push_val_left1=12;
	push_val_right1=12;

}

//左小转
void  leftrun2(void)
{	
	IN1=0;
	IN2=1;
	IN3=1;
	IN4=0; 
	push_val_left1=8;
	push_val_right1=8;
	
}

//右大转
void  rightrun1(void)
{	
	IN1=1;
	IN2=0;
	IN3=0;
	IN4=1; 
	push_val_left1=12;
	push_val_right1=12;

}

//右小转
void  rightrun2(void)
{	
	
	IN1=1;
	IN2=0;
	IN3=0;
	IN4=1; 
	push_val_left1=8;
	push_val_right1=8;
	
}


//小车停车函数
void  stop(void)
{ 
  IN1=0;
	IN2=0;
	IN3=0;
	IN4=0;  

}

motor头文件

#ifndef __MOTOR_H
#define __MOTOR_H

#include <AT89X52.H>

//左轮
sbit IN1=P1^3;
sbit IN2=P1^4;

//右轮
sbit IN3=P1^1;
sbit IN4=P1^2;

void  run(void);
void  backrun(void);
void  leftrun1(void);
void  leftrun2(void);
void  rightrun1(void);
void  rightrun2(void);
void  stop(void);
#endif

循迹头文件


#ifndef __XUNJI_H
#define __XUNJI_H

#include <AT89X52.H>
sbit right1=P2^7;
sbit right2=P0^7;
sbit left1=P0^4;
sbit left2=P0^6;
void Car_Traction() ;
void delay_nus(unsigned int t);  
void delay_nms(unsigned int s);
#endif
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1_轩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值