新手造基于51的三轮小车--蓝牙控制--红外循迹--超声波避障心得分享

材料:

L298N驱动模块 *1,三轮小车车模*1,7V--8V电池*1,红外循迹模块*2,超声波*1,蓝牙模块*1,及51最小系统板。某宝上都有,拼某某上更便宜,但都要注意要先检测模块是否能正常使用,其中51最小系统板可以自己画,画板子视频 https://m.bilibili.com/video/BV14V411e7cY?buvid=XXAB42EA954DC5B56BABC7C2ECC41720D1BA2&is_story_h5=false&mid=FrmqYoBUrsKtjaslQ4hSIA%3D%3D&p=1&plat_id=344&share_from=ugc&share_medium=android&share_plat=android&share_session_id=a7d66c32-c142-4df8-9b56-b5f30e0421c8&share_source=QQ&share_tag=s_i&timestamp=1694780263&unique_k=PJeLT86&up_id=501743004。
 

前言:

本文主要讲述上述三种模块的基本原理,搭建小车需自行解决,由于能力不足本人未将三种代码合并,所以分开讲解。

L298N驱动模块:

如图1 ,2分别有两个端子,1控制左轮,2控制右轮。以1左轮为例需给俩个端子分别一高一低电平轮子才能动。而其高低电平的共计由3控制,图上并不清晰,实际3为六个引脚,中间四个引脚控制1,2的高低电平,其中左侧两个控左侧两个端子的高低电平,右侧同理,而最左与最右分别为左右引脚的使能端,相当于开关,开关关则无论高低电平均不能输出,4为三个接线端子分别为5V 12V GND ;其中板载5V使能我没有用;

红外循迹:

循迹小车原理
黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭,D0引脚输出高。在没有检测到黑线时,模块上两个LED 常亮,D0输出低,A0为模拟信号输出(不同距离输出不同电压,一般可以不接)。因此循迹一般为黑线,可以借助下面代码理解一下。主要看下面的if语句来理解循迹,本人用(PWM调速)实现转弯‘pwm相关视频B站上很多且需用定时器,定时器推荐CSDN博主“竹烟淮雨”,亦可用延时加循环实现。

#include <REGX52.H>
#include <INTRINS.H>

L1 = 1;
 L2 = 0;//左轮向前
R1 = 0;
 R2 = 1;//右轮向前
sbit R = P1^0;//右面D0输出端
sbit L6= P2^2;//左轮使能
sbit R6= P1^1;//右轮使能
sbit L = P2^0;//左面D0输出端
sbit L1 = P2^4;
sbit L2 = P2^5;
sbit R1 = P2^6;
sbit R2 = P2^7;
#define Moto_Go    {L1 =1,L2 = 0,R1 = 0,R2 = 1;}

#define Moto_BACK {L1 =0 ,L2 =1 ,R1 =1 ,R2 = 0;}

void Timer0Init(void)        
{
    
    TMOD &= 0xF0;        
    TMOD |= 0x01;        
    TL0 = 0xF7;        
    TH0 = 0xFF;        
    TF0 = 0;    
    ET0 = 1;
    EA = 1;
    TR0 = 1;    
}
unsigned char Pwm1 = 0;
unsigned char Pwm2 = 0;
unsigned char batter1 = 0;
unsigned char batter2 = 0;
void Delay1ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}

void Pwm_R(void) 
{
  Pwm1%=100;
        if(Pwm1<=batter1)
        {
            R6 = 1;
        }else 
        {
            R6 = 0;
        }

    }

void Pwm_L(void) 
{
    Pwm2%=100;
        if(Pwm2<=batter2)
        {
            L6 = 1;
        }else 
        {
            L6 = 0;
        }

    }
void Timer0() interrupt 1
{
    TR0 = 0; 
    TH0 = 0xF7;
    TL0 = 0xFF;  
    Pwm1++;
    Pwm2++;
    TR0 = 1;
    Pwm_L();
    Pwm_R();
  TR1 = 1;
}
 void main()
 { Timer0Init();
     while(1)
     { 
     
     if((L==1)&&(R==1))
     {batter1=35;
         batter2=35;
     Moto_Go;Delay1ms();}
     else if((L==1)&&(R==0))
     { batter1=15;
          batter2=5;
     Moto_Go;
    Delay1ms();}
          else if((L==0)&&(R==1))
         {batter1=5;
              batter2=15;
         Moto_Go;Delay1ms();}
 else if((L==0)&&(R==0))
         {batter1=25;
              batter2=25;
         Moto_BACK;Delay1ms();}
         

超声波模块:

本人理解的超声波为给tirg端高电平持续至少10us此时会触发模块发射超声波,超声波发射则echo引脚输出为高,当模块接收到超声波echo输出低电平我们只需计算出这段时长再除以二再*速度即可。超声波建议先用单片机上的LED或蜂鸣器检测一下。

sbit Trig = P1^3;//其它引脚同上文循迹
sbit Echo = P1^4;

float time;
float dis;
void Delay15us()        //@11.0592MHz
{
    unsigned char i;

    i = 39;
    while (--i);
}

void stare()//触发
{
    Echo=0;//先将echo引脚初始化
    Trig=0;
    Trig=1;
    Delay15us();
  Trig=0;}

void Timer0Init(void)        此时定时器是计数功能
{
    
    TMOD &= 0xF0;        
    TL0 = 0x00; 定时器初值赋0 
    TH0 = 0x00;        
    TF0 = 0;        
    ET0 = 1;
  EA  = 1;
}

void dist()
{
    while(Echo==0);//echo为高时跳出循环,为低跳不出
    TR0=1;打开定时器
    while(Echo==1);//echo为低时跳出循环,为搞跳不出
    TR0=0;关闭定时器
time=TH0*256+TL0;
TH0 = 0;
TL0 = 0;
TF0 = 0;
dis=time*0.017;//时间÷2*10^-6*10^2

        if( dis<5)
    {Moto_Go//自己定意的函数
    }
        if(dis>=5)
    {Moto_Back//自己定意的函数
    }
}
void main()
{Timer0Init();
    while(1)
{           
stare();
dist();
}
}

蓝牙简单控制:

手机上下载一个蓝牙调试器或其它,手机上默认波特率9600可用XCOM来调,需提前了解一下串口中断。

比如设置名字hh,密码666

  AT+NAME=hh

  AT+PSWD=666

  发送以上两个命令即可(用XCOM,此时波特率应为38000),之后打开手机的蓝牙试试能不能连接成功。
 

主要用中间四个引脚vcc GND RXD TXD 其中RXD与TXD需要与单片机反接;波特率调为9600后蓝牙连接上时为慢闪,之后即可使用;看代码:

#include <REGX52.H>
sbit L1 = P2^4;
sbit L2 = P2^5;
sbit R1 = P2^6;
sbit R2 = P2^7;
sbit L6= P2^2;
sbit R6= P1^1;
#define Moto_Go {L1 =1,L2 = 0,R1 = 0,R2 = 1;}
#define Moto_L {L1 =0 ,L2 = 1,R1 = 0,R2 =1;}
#define Moto_R {L1 = 1,L2 = 0,R1 = 1,R2 = 0;}
#define Moto_BACK {L1 =0 ,L2 =1 ,R1 =1 ,R2 = 0;}
#define Stop{L1 =0,L2 = 0,R1 = 0,R2 = 0;}
unsigned char Data;
    
void UartInit(void)    //波特率初始化使波特率9600,此部分本人也未学太好,可看其他文章,此文利于理解蓝牙使用逻辑。
{ PCON &= 0x7F;           
    SCON = 0x50;                      
    TMOD &= 0x0F;     
    TMOD |= 0x20;          
    TL1 = 0xFD;    计算波特率  
    TH1 = 0xFD;           
    ET1 = 0;                     
    TR1 = 1;                 
    EA  = 1;//中断使能
    ES  = 1;//串口中断使能
}


void receive(unsigned char a)
{L6=1;
R6=1;//左右轮使能
        switch(a)
    {
        
        case  'A':    
            Moto_Go;
        break;
 
        case  'B':
            Moto_L;    
        break;
        
        case  'C':
            Moto_R;    
        break;
        
        case 'D':
            Moto_BACK;   
        break;
        
        case 'E':  
                      Stop;
        break;
        
}
}

void UartInit_seve() interrupt 4
{  
    Stop;
    RI = 0;                 
    Data = SBUF;      SBUF即表示接收的信号也可表时示发出的信号          
    receive(Data);
}

总结:

本人新手,有错误望指点,一定及时积极改正,且我未能实现代码合并,(合并时未实现功能)望大佬指点;

本文并不详细,仅为帮小白更快理解上述三个模块,理解后造小车便很容易;

任何不懂的地方可私聊,尽我所能;

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值