51循迹小车

目标:使智能小车沿如图路线行走

一,所需零件                                                                                                                                     1,车体,车轮

 

 

 2,51单片机

 

 

3,驱动模块:LM298N 

 该模块可以同时给单片机和电机供电                                                                                                 驱动各部分的简介:输出A,B分别接左右马达,放大电流使马达工作,                                             单片机IO控制输入(即IN1-IN4):接单片机IO口,由单片机的程序控制电机正反转,PWM控制车速。                    

4,稳压模块 

                                                                                                                                                        稳定电压到8伏,防止由于电压不稳定或超高造零件损坏。                                                                5,循迹模块                                                                                                                                             光点循迹由四对红外收发管组成,通过检测接收到的反射光强,判断黑白线。当模块检测到黑线时指示灯熄灭,同时OUT口持续输出高电平信号,未检测到黑线的检测灯正常,OUT端输出低电平。检测灵敏度可以通过电位器调节。                                                                         

6,电源模块

 

 

7,核心程序

#include"reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

#define uchar unsigned char
#define unit unsigned int
	/*********定义电机方向*********/
#define left_qian IN1=0;IN2=1     //左边电机前进
#define left_hou IN1=1;IN2=0      //左边后退
#define right_qian IN3=0;IN4=1    //右边前进
#define right_hou IN3=1;IN4=0     //右边后退
#define stop IN1=1;IN2=1;IN3=1;IN4=1
/****循迹传感器端口定义****/
/****传感器位置****/
/*左2   左1      右1   右2*/
/* P27  P25      P24   P26*/

sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;

sbit left_2=P2^4;  //左大信号     
sbit left_1=P2^5;  //左小信号
sbit righ_1=P2^6;  //右小信号
sbit righ_2=P2^7;  //右大信号

/*      电机驱动模块端口定义      */

sbit ENA=P0^4;    //左使能        
//sbit EN1=P0^1;    //左方向1
//sbit EN2=P0^2;    //左方向2
sbit ENB=P0^5;    //右使能
//sbit EN3=P0^7;    //右方向1
//sbit EN4=P0^6;    //右方向2

uchar zkb_l=0;    //左电机占空比
uchar zkb_r=0;    //右电机占空比
uchar t=0;        //定时器中断计数器


 void Timer0Init()
  {
  TMOD=0X05;
  TH0=0;
  TL0=0;
  ET0=1;//打开计数器0中断
  EA=1;
  TR0=1;
  }
    void Timer0()  interrupt   1
{
  static u16 i;
  i=0;
  while(i<4)
  {
  if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1)&&(i<=3))
  {
  i++;
  }
  if(i=4)
  {
  	zkb_l=50;
		zkb_r=70;
		left_hou;
		right_qian;
  }
  }
  }

void init_time0()
{
	TMOD=0x01;
	TH1=(65536-100)/256;
	TL1=(65536-100)%256;
	ET1=1;
	TR1=1;
}

void delay (u16 i)
{
  while(i--);
}

void tim0() interrupt 3
{
	TH1=0xff;
	TL1=0x9c;
	if(t<zkb_l)ENA=1;
	else ENA=0;
	if(t<zkb_r)ENB=1;
	else ENB=0;
	t++;
	if(t>100)t=0;
}

void xunji()
{
  
	if((left_2==1)&&(left_1==0)&&(righ_1==0)&&(righ_2==0))
	{
		zkb_l=80;
		zkb_r=100;
		left_hou;
		right_qian;       
	}
	else if((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
	{
	  delay(2000);
	  if((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
		zkb_l=100;
		zkb_r=100;
		left_hou;
		right_qian;
		delay(38666);
	}
	else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0))
	{
	  delay(2000);
	  if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0))
		zkb_l=100;
		zkb_r=100;
		left_hou;
		right_qian;
		delay(38666);
	}
	else if((left_2==0)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
	{
		zkb_l=50;
		zkb_r=30;
		left_qian;
		right_qian;         
	}
	else if((left_2==0)&&(left_1==0)&&(righ_1==0)&&(righ_2==0))
	{
		zkb_l=40;
		zkb_r=40;
		left_qian;
		right_qian;          
	}
	else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
	{
		stop;         
	}
	else if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==0))
	{
		zkb_l=50;
		zkb_r=30;
		left_qian;
		right_qian;         
	}
	else if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))
	{
	  delay(2000);
	  if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))
		zkb_l=100;
		zkb_r=100;
		left_qian;
		right_hou;
		delay(38666);
	}
	else if((left_2==0)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
	{
	  delay(2000);
	  if((left_2==0)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
		zkb_l=100;
		zkb_r=100;
		left_qian;
		right_hou;
		delay(38666);
	}
	else if((left_2==0)&&(left_1==0)&&(righ_1==0)&&(righ_2==1))
	{
		zkb_l=100;
		zkb_r=80;
		left_qian;
		right_hou;
	}
	  	else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
	{
		zkb_l=50;
		zkb_r=50;
		left_qian;
		right_qian;         
	}
}

void main()     
{
   Timer0Init();
  init_time0();
	EA=1;
	while(1)
	{
	  xunji();
	}
}

需要注意的是,小车需要在第四个干扰处转弯需要用到计数器中断,程序为

void Timer0Init()
  {
  TMOD=0X05;
  TH0=0;
  TL0=0;
  ET0=1;//打开计数器0中断
  EA=1;
  TR0=1;
  }
    void Timer0()  interrupt   1
{
  static u16 i;
  i=0;
  while(i<4)
  {
  if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1)&&(i<=3))
  {
  i++;
  }
  if(i=4)
  {
  	zkb_l=50;
		zkb_r=70;
		left_hou;
		right_qian;
  }
  }
  }

上桥的一段路光敏是无法检测黑白的,需要其他程序控制小车行走

	else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
	{
		zkb_l=50;
		zkb_r=50;
		left_qian;
		right_qian;         
	}

 

 

 

五路寻迹模块简介: BFD-1000 专门设计用作黑(白)线检测的传感器,特别适合复杂黑白线、交叉黑白线的检测,它有6 路高灵敏度的红外传感器(5 路巡线、1 路蔽障),能够对黑白线准确的识别,它有如下功能和特点: 1.BFD-1000 集成5 路循迹传感器,适合复杂黑线(白线)的跟踪,对于简单的黑线(白线)寻取更不在话下。 2.BFD-1000 有一路蔽障用的红外传感器,蔽障距离可以通过滑动变阻器调节,方便有蔽障需求的机器人设计。 3.BFD-1000 有一个专门设计的触碰传感器,使得有这方面的需求机器人设计更加简便。 4.BFD-1000 输出信号全部都为数字信号,方便与单片机相连。 5.BFD-1000 全部传感器都有LED 灯作为指示,方便调试 6.BFD-1000 支持电压为3.0-5.5v 满足大多数系统需求。 五路寻迹实物展示: 黑(白)线识别五路寻迹模块技术参数: 输出形式:数字输出(高低电平),探测到黑线时为输出低电平,探测到白线时输出为高电平。 检测距离(0.5-40mm) 输入电压:3.0-5.5V 尺寸:12.8*3.0 厘米 实物购买链接:https://detail.tmall.com/item.htm?spm=a1z10.3-b.w4... 附件内容截图: 路口寻迹例程说明: 1. 简单循迹例程 思想: 简单的循迹只用两个循迹传感器就可以实现,可以用循迹模块上面的SS2,SS3,两个传感器,当SS2 碰到黑线时可以向左转,SS3碰到黑线的时候可以向右转,就可以实现简单的循迹。例程C 代码:见“相关文件”普通循迹程序 2.“T”字交叉口循迹 思想: 寻“T” 字形的交叉线主要的思想是最边上来那两个传感器(SS1 SS5)碰到黑线的时候让小车再走一段时间,再判断最前面那个传感器SS3的状态,如果没有黑线,就说明寻到了"T" 字路口。例程C 代码:见“相关文件”“T”字路口循迹程序 3.“十”字交叉口循迹 思想: 寻“十” 字形的交叉线主要的思想是最边上来那两个传感器(SS1)碰到黑线的时候让小车再走一段时间,再判断最前面那个传感器SS3的状态,如果有黑线,就说明寻到了"十" 字路口。例程C 代码:见“相关文件”“十”字路口循迹程序 4.“7”字交叉口循迹 思想: 寻“7” 字形的交叉线主要的思想是左边上来那个传感器(SS1)碰到黑线的时候让小车再走一段时间,再判断最前面那个传感器SS3的状态,如果没有黑线,就说明寻到了"7" 字路口。例程C 代码:见“相关文件”“7”字路口循迹程序 注意:任何复杂的循迹都可以拆分成简单的循迹来实现,复杂的循迹最重要的是找到交叉点,然后转向,至于转多少,可以用前面的那个传感器做转过黑线数目的计数。
51循迹小车CSND是一种基于51单片机的循迹小车循迹小车是一种可以根据预设的路径自主行驶的机器人。它通过感应地面上的黑色线条或其他特定标记来确定移动方向,从而实现自动导航功能。 51循迹小车CSND的设计通过使用51系列单片机为核心控制器,结合红外线传感器和电机驱动模块等硬件装置实现车辆的循迹功能。红外线传感器能够感知黑色线条的存在,从而根据线条的位置调整车辆的方向。电机驱动模块则负责控制车辆的前进、后退、左转和右转等动作。 在程序设计方面,51循迹小车CSND需要编写相应的代码来实现循迹功能。通过编程,将红外线传感器读取的信息与预设的路径进行比对,从而判断车辆应该做出的动作。在循迹过程中,还可以加入一些避障功能以确保车辆安全行驶。 51循迹小车CSND具有一定的应用价值。它可以用于教育培训、科学实验以及娱乐等领域。在教育方面,它可以用于教学示范,帮助学生了解电子设备的工作原理和基本编程知识。在科学实验中,可以利用循迹小车研究机器人感知和导航等相关技术。在娱乐方面,可以通过自主行驶的循迹小车搭建迷宫等游戏场景,增加娱乐性和趣味性。 总之,51循迹小车CSND是一种基于51单片机的循迹小车,通过硬件装置和程序设计实现车辆自主行驶的功能。该产品具有广泛的应用价值,为教育、科学实验和娱乐等领域提供了便利和创新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值