51单片机——AGV小车(挑选“避障”功能进行讲解)+proteus仿真图

目录

一.电机驱动模块(以直流电机为例)

源码: 

仿真: 

仿真器件: 

二.避障模块

源码:

 仿真:

 仿真器件:

愿你的代码之旅充满乐趣与收获,不断追求卓越,点亮人生的每一个角落!


基于该小车的功能可以将其分为电机驱动模块避障模块

一.电机驱动模块(以直流电机为例)

这里选取L298N电机驱动模块。该驱动版可驱动两路直流电机,使能端ENA、ENB为高电平时有效。(若使能端上接有跳线帽可直接使用无需在关注其是否为高电平)

为什么要电机需要驱动器呢?

驱动模块的作用主要是为单片机提供足够的功率来驱动直流马达的转动。 因为单片机输出的电流和电压通常都比较小,无法满足直流马达的驱动需求,所以需要通过驱动模块来放大电流和电压,达到直流马达转动的条件。

控制方式及直流电机状态:

 

 下面我们写一段简单代码实现两个按键对电机进行启停:

源码: 

#include<reg52.h>
//按键
sbit K2=P3^4;
sbit K3=P3^5;
//引脚
sbit P2_0=P2^0;
sbit P2_1=P2^1;
int flag=0;
void DelayMs(int x)
{
  char i;
   while(x--)
   {
 	for(i=0;i<120;i++);
   }
}
void ReadKey()
{
	if(K2==0)   //K2按下
		{
			if(K2==0)
			{
				 DelayMs(10);
				flag=1;
				while(K2==0);
			}
		}
		if(K3==0)   //K3按下
		{
			if(K3==0)
			{
				DelayMs(10);
				flag=2;
				while(K3==0);
			}
		}	
}
void main()
{
	while(1)
	{
			ReadKey();   //读取按键情况
			if(flag==1)   //电机启动
			{
				 DelayMs(10);
				P2_0=0;
				P2_1=1;
			}

			if(flag==2)   //电机停止
			{
				DelayMs(10);
				P2_0=0;
			 	P2_1=0;
			}
	}
}

 仿真图:K2按下电机启动,K3按下电机停止。注意这里的按键是按一下,而不是一直处于按下的状态。图中电机驱动模块的使能端直接接通高电平,所以无需在关注它。

仿真: 

 

 所需要的器件:

仿真器件: 

二.避障模块

避障模块是基于传感器来实现的,这里采用红外传感器。

模块描述:

        该传感器模块对环境光线适应能力强, 其具有一对红外线发射与接收管, 发射管发射出一 定频率的红外线, 当检测方向遇到障碍物(反射面)时, 红外线反射回来被接 收管接收, 经过比较器电路处理之后, 绿色指示灯会亮起, 同时信号输出接口输出数字信号(一个低 电平信号) , 可通过电位器旋钮调节检测距离, 有效距离范围 2 ~ 30cm , 工作电压为 3.3V-5V 。 该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特 点, 可以广泛应用于机器人避障、 避 障小车、 流水线计数及黑白线循迹等众多场合。

模块参数说明:

1 当模块检测到前方障碍物信号时, 电路板上绿色指示灯点亮电平, 同时 OUT 端口持续输 出低电平信号 , 该模块检测距离 2 ~ 30cm , 检测角度 35° , 检测距离可以通过电位器进行 调节, 顺时针调电位器, 检测距离增加; 逆时针调电位器, 检测距离减少。

2 、 传感器主动红外线反射探测 , 因此目标的反射率和形状是探测距离的关键。其中黑色探测 距离最小 , 白色最大 ; 小面积物体距离小 , 大面积距离大。

3 、 传感器模块输出端口 OUT 可直接与单片机 I O 口连接即可, 也可以直接驱动一个 5V 继 电器; 连接方式: VCC-VCC;GND-GND;OUT-IO

4 、 比较器采用 LM393 , 工作稳定;

5 、 可采用 3-5V 直流电源对模块进行供电。 当电源接通时, 红色电源指示灯点亮;

6 、 具有 3mm 的螺丝孔, 便于固定、 安装;

7 、 电路板尺寸: 3.2CM*1.4CM

8 、 每个模块在发货已经将阈值比较电压通过电位器调节好, 非特殊情况, 请勿随意调节电 位器。

模块接口说明:

1 VCC 外接 3.3V-5V 电压(可以直接与 5v 单片机和 3.3v 单片机相连)

2 GND 外接 GND

3 OUT 小板数字量输出接口( 0 和 1 ) 

检测到,返回低电平0;为检测到,返回高电平1. 

源码:

 ir1-4分别代表安装在前、左、右、后方的传感器。

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
sbit P2_0=P2^0;  //0是停
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit ir1=P3^4; //前面
sbit ir2=P3^5; //左边
sbit ir3=P3^6; //右边
sbit ir4=P3^7;
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
	 DelayUs2x(245);
 }
}
 
void main(void) 
{ 

	while (1) 
	 {  
		 if(ir1==1&&ir2==1&&ir3==1&&ir4==1)//无障碍  直行
		 {
			 DelayMs(10);			 
			 P2_0=0;
			 P2_1=1;
			 P2_2=1;
			 P2_3=0;
			 
		 }
		if((ir1==0&&ir2==1&&ir3==1&&ir4==1)||(ir1==0&&ir2==0&&ir3==0&&ir4==1))             
		 {      //前方有障碍  后退
				DelayMs(10);
				P2_0=P2_3=1;
				P2_1=P2_2=0;
			
		 }
		 if(ir1==1&&ir2==0&&ir3==1&&ir4==1)   //左边有障碍  右转
		 {
				DelayMs(10);	
				P2_0=0;
			    P2_1=1;
			    P2_2=0;
				P2_3=0;
			
		 }
		 if(ir1==1&&ir2==1&&ir3==0&&ir4==1)  //右边有障碍  左转
		 {
			    DelayMs(10);
				P2_0=0;
			    P2_1=0;
			    P2_2=0;
				P2_3=1; 
			
		 }
		if(ir1==0&&ir2==0&&ir3==0&&ir4==0)
		 {
			 DelayMs(10);
			 P2_0=0;
			 P2_1=0;
			 P2_2=0;
			 P2_3=0;
			
		 }
	 }
}

代码中判断逻辑可以修改加强, 理解思路即可。

依据该红外传感器的特性,检测到返回高低电平。用开关来代替其功能,通地——按下为低电平

仿真图: (图中箭头所指的和圈起来的不需要画)

 仿真:

所需要的器件:

 仿真器件:

愿你的代码之旅充满乐趣与收获,不断追求卓越,点亮人生的每一个角落!

               都到这里了留个赞吧,你的赞会让我更有动力继续创作哦!

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值