您的位置:首页 > 其它

基于51 手机遥控的蓝牙小车(HC-05)

2020-02-29 19:47 459 查看

文章目录

  • 三、调试
  • 四、代码
  • 一、软件:手机下载“蓝牙串口”,电脑下载“XCOM串口调试助手”

    1. 手机应用商店下载 蓝牙串口(HC-05只支持Android)
    2. 电脑端下载 XCOM串口调试助手
      点击此处下载
      需要登录才能下载!这是正点原子官网,请放心登录下载。

    二、硬件:HC-05模块,USB转TTL模块,51小车

    1. HC-05

    参数:
    • 工作电压:3.3V
    • 参考距离:10m
    • 通讯接口:UART 3.3V TTL电平
    • 通信方式:配对成功后,可以作为全双工串口使用,无需了解任何蓝牙协议。
    • 默认常用通讯格式:9600,1,N(AT指令可设置停止位为2,奇或偶效验)
    • 默认值:从机,波特率9600,蓝牙名HC-05,配对密码1234,LED状态灯开启。
    • 主从机设置:模块为主从一体,出厂默认为从机,可以通过AT指令切换成主机。

    2、USB转TTL模块

    三、调试

    1. 引脚连接

    USB转TTL模块 ~~~~ HC-05模块
    RXD   ~~~~~~~~~~~   TXD
    TXD   ~~~~~~~~~~~   RXD
    VCC   ~~~~~~~~~~~   VCC(3.3V)
    GND   ~~~~~~~~~~~   GND
    • 注意 RXD 连接 TXD
    • 注意 如果是用笔记本电脑调试,电脑要接电源,否则电压不够,蓝牙模块不亮

    2. 进入AT模式

    • 先打开XCOM串口调试助手
      选用下述第一种方法进入AT模式(进入AT模式就是为了设置和得到HC-05蓝牙模块的参数。)
      此时HC-05模块上的灯慢闪,按下图上的标示操作。
    • 进入AT模式的方法有两种:
    1. 在模块上电之前,把KEY脚设置成高电平,然后将USB接口插入电脑 (即长按模块唯一一个按键,USB接口插入电脑后再松开)。此时LED慢闪(2s一次),模块进入AT模式,波特率固定为38400。此模式我们叫原始模式,原始模式下一直处于AT命令模式状态。
    2. 在模块上电之后,此时LED快闪(1s两次),发送一次AT指令,需要按一次按键,模块也会进入AT模式,此时LED依旧快闪,波特率为默认波特率9600。此模式我们叫正常模式。正常模式下只有按住按键才处于AT命令模式状态。
      推荐使用第一种方法。
    • HC-05 AT常用指令集

        查看是否处于AT模式:AT\n
        返回:OK
      1. 询问、设置蓝牙名称:AT+NAME / AT+NAME=OXOXO \n
        返回:+NAME:OXOXO OK
      2. 询问、设置蓝牙密码:AT+PSWD / AT+PSWD=“0000” \n
        返回:+PSWD:0000 OK
        (密码要有双引号,密码是四位数字)
      3. 询问、设置 波特率、停止位和校验位:AT+UART / AT+UART=0000,0,0 \n
        返回:+UART:0000,0,0 OK
        (0无校验位,1奇校验位,2偶校验位)
      4. 恢复默认设置:AT+ORGL\n
        返回:OK

      输入的指令必须以回车作为结尾!(\n即回车、换行,在串口调试助手上输入一个回车即可)
      一般只需要查询参数,不需要设置,使用默认设置就OK。

    3. 手机端串口助手的调试

    • 手机与电脑通信测试
      手机蓝牙连接HC-05蓝牙模块需要使HC-05处于正常模式(波特率为9600)。即将USB转TTL模块从电脑拔下,然后直接插回电脑。测试能否正常通信。
      手机连接上HC-05蓝牙模块的时候,蓝牙模块慢闪

      若此步骤正常,则进入下一步。

    • 在手机端蓝牙串口app上设置键盘

      上图只给了前进按钮的设置,类似的完成剩下四个按键的设置。注意每个按键的松开状态都应该为停车t
      此处按钮的设置应该与代码匹配,结合下面代码,前进、后退、左转、右转、停止分别为q、h、z、y、t。 为避免手机与小车通讯异常,经测试,只发送一个字母比较稳定

    • 至此,完成了所有软件调试和设置。

    4. HC-05与51单片机的接口连接

    HC-05蓝牙模块与51单片机的接口连接 和 HC-05蓝牙模块与USB转TTL模块的接口连接相同。
    注意 RXD 连接 TXD!
    硬件连接好后,打开单片机电源,手机连接上HC-05蓝牙模块(灯慢闪),然后按动设置好的按钮,秀出你的操作!

    四、代码

    蓝牙遥控小车需要用到串口通信和定时器中断的内容。
    HC-05蓝牙模块与51单片机的接口连接 和 HC-05蓝牙模块与USB转TTL模块的接口连接相同。
    代码中设置的波特率需要与蓝牙波特率相同才可以通信,为9600。

    #include <reg52.h>
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit ENA=P0^0;     //小车电机引脚
    sbit IN1=P0^1;
    sbit IN2=P0^2;
    sbit IN3=P0^3;
    sbit IN4=P0^4;
    sbit ENB=P0^5;
    sbit ENC=P1^0;
    sbit IN5=P1^1;
    sbit IN6=P1^2;
    sbit IN7=P1^3;
    sbit IN8=P1^4;
    sbit END=P1^5;
    sbit Data=P3^1;     //接受数据的引脚,即TXD脚
    
    void receive(u8 m);
    void run();
    void stop();
    void turn_left();
    void turn_right();
    void back();
    
    void UartConfigurationInit(){
    SCON=0X50;	  //设置为工作方式1
    TMOD=0x20;    //设置定时器1工作方式为方式2
    TH1=0xfd;  	  //波特率9600
    TL1=0xfd;
    TR1=1;        //启动定时器1
    SM0=0;SM1=1;      //串口方式1
    REN=1;        //允许接收
    PCON=0x00;    //关倍频
    ES=1;         //开串口中断
    EA=1;         //开总中断
    TR1=1;
    }
    void main(){
    UartConfigurationInit();
    stop();
    while(1);
    }
    void receive(u8 m){
    switch(m){
    case 'q':       //前进
    run();
    break;
    case 'y':       //右转
    turn_right();
    break;
    case 'z':       //左转
    turn_left();
    break;
    case 'h':       //后退
    back();
    break;
    case 't':       //停止
    stop();
    break;
    }
    }
    
    void run(){
    IN1=1; IN2=0; IN3=1; IN4=0; IN5=1; IN6=0; IN7=1; IN8=0; ENA=1; ENB=1; ENC=1; END=1;
    }
    void stop(){
    IN1=0; IN2=0; IN3=0; IN4=0; IN5=0; IN6=0; IN7=0; IN8=0;
    }
    void turn_left(){
    IN1=0; IN2=1; IN3=1; IN4=0; IN5=0; IN6=1; IN7=1; IN8=0;
    }
    void turn_right(){
    IN1=1; IN2=0; IN3=0; IN4=1; IN5=1; IN6=0; IN7=0; IN8=1;
    }
    void back(){
    IN1=0; IN2=1; IN3=0; IN4=1; IN5=0; IN6=1; IN7=0; IN8=1; ENA=1; ENB=1; ENC=1; END=1;
    }
    
    void Usart() interrupt 4      //中断函数
    {
    u8 receiveData;
    receiveData=SBUF;         //出去接收到的数据
    receive(receiveData);
    RI = 0;                   //清除接收中断标志位
    SBUF=receiveData;         //将接收到的数据放入到发送寄存器
    while(!TI);			      //等待发送数据完成
    TI=0;					  //清除发送完成标志位
    }
    • 点赞 9
    • 收藏
    • 分享
    • 文章举报
    越自律 越自由 发布了1 篇原创文章 · 获赞 9 · 访问量 489 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: