【51单片机实例】智能小车(三)-------- 小车的红外循迹

51单片机实例

  1. 智能小车(一)--------小车的前进、后退和停止
  2. 智能小车(二)-------- 小车的红外遥控调速


前言

本节是基于51单片机下在智能小车(二)-------- 小车的红外遥控调速的基础上增加了红外循迹模块,但本节并无用到红外遥控模块,若想了解红遥控模块请前往智能小车(二)-------- 小车的红外遥控调速,如果小车的硬件连接有问题,请前往智能小车(一)--------小车的前进、后退和停止,接下来我就开始红外循迹模块的介绍了。


一、红外循迹模块的介绍

在这里插入图片描述

1. 模块描述

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

2. 模块参数说明

(1) 当模块检测到前方障碍物信号时,电路板上绿色指示灯点亮电平,同时OUT端口持续输出低电平信号,该模块检测距离2~30cm,检测角度35°,检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。
(2) 传感器主动红外线反射探测,因此目标的反射率和形状是探测距离的关键。其中黑色探测距离最小,白色最大;小面积物体距离小,大面积距离大。
(3) 传感器模块输出端口OUT可直接与单片机IO口连接即可,也可以直接驱动一个5V继电器;连接方式:VCC-VCC;GND-GND;OUT-IO
(4) 比较器采用LM393,工作稳定;
(5) 可采用3-5V直流电源对模块进行供电。当电源接通时,红色电源指示灯点亮;
(6) 具有3mm的螺丝孔,便于固定、安装;
(7) 电路板尺寸:3.2CM*1.4CM

3. 模块接口说明

(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) OUT 小板数字量输出接口(0和1)

4. 模块用途

(1) 电度表脉冲数据采样
(2) 传真机碎纸机纸张检测
(3) 障碍检测
(4) 黑白线检测

5. 模块介绍

(1) 采用TCRT5000红外反射传感器
(2) 检测反射距离:1mm~25mm适用
(3) 比较器输出,信号干净,波形好,驱动能力强,超过15mA。
(4) 配电位器调节灵敏度
(5) 工作电压3.3V-5V
(6) 输出形式 :数字开关量输出(0和1)
(7) 设有固定螺栓孔,方便安装
(8) 小板PCB尺寸:3.2cm x 1.4cm
(9) 使用宽电压LM393比较器

6. 功能介绍

TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

7. 电路原理图

在这里插入图片描述
传感器的红外发射二极管(1-2处)不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管(3-4)一直处于关断状态,此时模块输出端(引脚1)为低电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,光敏三极管饱和,此时模块的输出端为高电平,指示二极管被点亮。


二、硬件连接

具体硬件连接请前往智能小车(一)--------小车的前进、后退和停止
相关驱动模块请前往智能小车(二)-------- 小车的红外遥控调速


三、代码实现

1. 引脚定义、函数声明模块

#include <reg52.h>
 
typedef unsigned int u16;
typedef unsigned char u8;
 
u8 PWML=0,PWMR=0,t=0;                //定义PWM 占空比  
u16 DE=0;                    //判断路线是否比较曲折
 
sbit ENAL=P1^1;       //定义L298N的使能口
sbit ENBR=P1^0;       
sbit IN1=P0^6;      //定义L298N的选择口
sbit IN2=P0^5;
sbit IN3=P0^4;
sbit IN4=P0^3;
sbit IRN1=P0^0;   //右         //定义红外循迹模块的端口
sbit IRN2=P0^1;   
sbit IRN3=P0^2;   //左
sbit IRN4=P2^0;   
 
 
 
void Timer0_Init();
void Turn();
void Driv_Go();
void Driv_Stop();
void Driv_Back();
void Driv_Left();
void Driv_Right();
void Driv_Left_OPP();
void Driv_Right_OPP();
void RightMotoForward();
void RightMotoBack();
void LeftMotoBack();
void LeftMotoForward();
void RightMotoStop();
void LeftMotoStop();
void Delay(u8 i);

2. 延迟模块

void Delay(u8 i)
{
    while(i--);
}

3. 定时器模块

void Timer0_Init()                  //设置定时器0
{                                               //通过设置定时器0来调制小车的转速
   TMOD|=0x01;              //选择16位的定时器
   TH0=(65536-100)/256;
   TL0=(65536-100)%256; 
   ET0=1;                  //开放定时器中断0
   TR0=1;
   EA=1;
}
 
void Timer0Init() interrupt 1     //中断 进入占空比的调节
{
     TH0=(65536-100)/256;
     TL0=(65536-100)%256;
     t++;
     if(t<PWML)
     {
        ENAL=1;
     }
     else
     {ENAL=0;}
     if(t<PWMR)
     {
        ENBR=1;
     }
     else
     {ENBR=0;}
    if(t>=100)       
      t=0;
}
 

4. 小车转向模块

void Turn()  
{
/
    if(DE==0)             //判断路线较为平缓
    {
         if(IRN1==0&&IRN2==0&&IRN3==0&&IRN4==0) //启动循迹前不要挡住小车的四个红外检测灯
     {
         PWML=20;                                   //L298N同时控制两个电机时,电机转速不同
         PWMR=19;                                   //通过软件来调节,尽可能减小误差
         Driv_Back();
     }
///
         if(IRN2==0&&IRN3==1)      //小车左转
     {
         Delay(100);
         if(IRN2==0&&IRN3==1)
         {
       PWML=7;
         PWMR=25;
         Driv_Go();
         }
     }
///
//       if(IRN1==0&&IRN2==0&&IRN3==0&&IRN4==1)    //小车左转(大幅度)
//   {
//       Delay(1000);
//       if(IRN2==0&&IRN3==1)
//     PWML=7;
//       PWMR=25;
//       Driv_Go();
//   }
///
         if(IRN2==1&&IRN3==0)      //小车右转
     {
            Delay(100);
        if(IRN2==1&&IRN3==0)
          {
         PWML=25;
           PWMR=5;
           Driv_Go();
            }
      }
 
///
//    if(IRN1==1&&IRN2==0&&IRN3==0&&IRN4==0)       //小车右转(大幅度)
//    {
//        Driv_Stop();
        if(IRN2==1&&IRN3==0)
        Delay(1000);
//      PWML=25;
//      PWMR=5;
//        Driv_Go();
//    }
///
        if(IRN2==1&&IRN3==1)       //小车直走           接收到信号就是0
    {
        Delay(100);
        if(IRN2==1&&IRN3==1)
     {
      PWML=20;                              
        PWMR=19;
        Driv_Go();
     }
    }
}
    else
    {
        if(IRN1==0&&IRN2==0&&IRN3==0&&IRN4==0)  
    {
        PWML=20;                                
        PWMR=19;                                    //小车停止
        Driv_Back();
        Delay(10000);            //延时一下
        Driv_Stop();
        DE=1;
    }
///
        if(IRN2==0&&IRN3==1)       //小车左转(左轮后转 右轮正转 产生速差)
    {
        Delay(100);
        if(IRN2==0&&IRN3==1)
        Driv_Left_OPP();
    }
///
        if(IRN2==1&&IRN3==0)       //小车右转(左轮正转 右轮后转)
    {
        Driv_Stop();
        if(IRN2==1&&IRN3==0)
        Driv_Right_OPP();
    }
///
        if(IRN2==1&&IRN3==1)       //小车直走           
    {
        Delay(100);
        if(IRN2==1&&IRN3==1)
    {
       PWML=20;                                  
       PWMR=19;
        Driv_Go();
    }
 }
        DE=0;   
}
}
 
void Driv_Go()
{RightMotoForward();LeftMotoForward();}
 
void Driv_Back()
{RightMotoBack();LeftMotoBack();}
     
void Driv_Right()
{RightMotoStop();LeftMotoForward();}
 
void Driv_Left_OPP()
{RightMotoForward();LeftMotoBack();}
     
void Driv_Right_OPP()
{RightMotoBack();LeftMotoForward();}
     
void Driv_Left()
{LeftMotoBack();RightMotoForward();}
 
void Driv_Stop()
{RightMotoStop();LeftMotoStop();}
 
void RightMotoForward()
{IN3=1; IN4=0;}
void RightMotoBack()
{IN3=0; IN4=1;}
void LeftMotoBack()
{IN1=1; IN2=0;}
void LeftMotoForward()
{IN1=0; IN2=1;}
void RightMotoStop()
{IN3=1; IN4=1;}
void LeftMotoStop()
{IN1=1; IN2=1;}

5. 主函数模块

void main()
{
   Timer0_Init();
   EA=1;
   while(1)
   {
      Turn();
   }              
}

总结

本节是以STC89C52单片机为CPU,通过一些外围电路和软件编程实现小车红外循迹的功能。整个设计过程中最大的特点是利用简单的理论原理将红外循迹模块、L298N驱动模块、51单片机这三个模块有效的结合起来,利用红外循迹原理与pwm调节占空比的简单结合实现对小车红外循迹奠定编程理论基础,提高了效率,降低了编程的复杂度,具有很强的研究的意义,智能化的发展促使了智能小车往功能更加强大的方向发展。

循迹小车,随着电力电子器件的发展,PWM电压型逆变器在交流变频调速、UPS、电能质量控制器、轻型直流输电换流器等电力电子装置中得到了越来越广泛的应用。PWM电压型逆变器直流侧所需的理想无脉动直流电压源通常通过整流加上大直流电容滤波获得。大直流滤波电容的使用,给装置带来占用空间大、成本高及严重影响电能质量方面的问题。因此,研究如何减小甚至去除逆变器直流侧电容,以及解决因其产生的低次谐波和相关问题,具有十分重要的理论意义和实用价值。本文在综述了国内外在PWM电压型逆变器及各种抑制谐波PWM技术的基础上,对目前工程中应用最广泛的SPWM电压型逆变器的主电路及谐波消除调制技术和相关问题进行了深入研究。50年代末晶闸管标志着电力电子半导体期间的开端。电力电子器件经历了40多年的发展历程[1-2],特别是近30多年内更是得到了迅猛的发展[3,4]。以Th(SCR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。CR)为代表的半控型器件是第一代电力电子器件[5],其主要用于可控整流装置,若用于可控的逆变器,因其无法自行关断,须配置强迫换流电路,致使装置复杂化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

比特冬哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值