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

一、软件:手机下载“蓝牙串口”,电脑下载“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常用指令集

    1. 查看是否处于AT模式:AT\n
      返回:OK
    2. 询问、设置蓝牙名称:AT+NAME / AT+NAME=OXOXO \n
      返回:+NAME:OXOXO OK
    3. 询问、设置蓝牙密码:AT+PSWD / AT+PSWD=“0000” \n
      返回:+PSWD:0000 OK
      (密码要有双引号,密码是四位数字)
    4. 询问、设置 波特率、停止位和校验位:AT+UART / AT+UART=0000,0,0 \n
      返回:+UART:0000,0,0 OK
      (0无校验位,1奇校验位,2偶校验位)
    5. 恢复默认设置: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;					  //清除发送完成标志位
}
  • 37
    点赞
  • 246
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
51单片机蓝牙小车的安卓软件 /**************************************************************************** 简单寻迹程序:接法 关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入6V时时候可以输出稳定的5V 分别在针脚标+5 与GND 。这个输出电源可以作为单片机系统的供电电源。 注意: 本例程使用315无线遥控控制小车 1.315无线遥控同按键开关原理一摸一样 2.315无线遥控连线需要按照程序要求 D0 - P1.7 D1 - P1.6 D2 - P1.5 D3 - P1.4 VT - P1.3 3.如果小车转动方向不一直,请查看小车连线是否正常。 ****************************************************************************/ #include<AT89x51.H> #define Left_moto_pwm P1_0 //接驱动模块ENA 使能端,输入PWM信号调节速度 #define Right_moto_pwm P1_1 //接驱动模块ENB #define Left_1_led P2_0 //四路寻迹模块接口第一路 #define Left_2_led P2_1 //四路寻迹模块接口第二路 #define Right_1_led P2_2 //四路寻迹模块接口第三路 #define Right_2_led P2_3 //四路寻迹模块接口第四路 #define Left_moto_Stop {P3_3=1,P3_4=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=1; 时左电机停转 #define Right_moto_Stop {P3_5=1,P3_6=1;} //P3_5 P3_6 接IN1 IN2 当 P3_5=1,P3_6=0; 时右电机停转 #define Left_moto_go {P3_3=0,P3_4=1;} //P3_3 P3_4 接IN1 IN2 当 P3_3=0,P3_4=1; 时左电机前进 #define Left_moto_back {P3_3=1,P3_4=0;} //P3_3 P3_4 接IN1 IN2 当 P3_3=1,P3_4=0; 时左电机后退 #define Right_moto_go {P3_5=0,P3_6=1;} //P3_5 P3_6 接IN1 IN2 当 P3_5=0,P3_6=1; 时右电机前转 #define Right_moto_back {P3_5=1,P3_6=0;} //P3_5 P3_6 接IN1 IN2 当 P3_5=1,P3_6=0; 时右电机后退 #define beep P3_7 /************************************************************************/ #define uchar unsigned char #define uint unsigned int uchar a; uchar sendbuf[10]={0}; uchar revdbuf[10]={0}; #define LED_OPEN P2_3 uchar state = 0; uchar flag = 0; #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define STOP 5 void ser() interrupt 4 { // uint j; revdbuf[0]=SBUF; //收取数据 // beep = 0; switch(revdbuf[0]) { case 0x1f: state = UP; break; case 0x2f: state = DOWN; break; case 0x3f: state = LEFT; break; case 0x4f: state = RIGHT; break; case 0xa0: case 0xb0: case 0xc0: case 0xd0: state = STOP; } flag = 1; RI=0; } void SendDataUart(uchar *buf,uchar buflen) { uchar i; a=0; for (i=0;i<buflen;i++) { ES=0; //进入发送数据时先关闭串行中断 SBUF=buf[i]; //将数据原样发回 while(!TI); //等待数据发完 TI=0; ES=1; //退出进再开串行中断 } } void init() { TMOD=0X20; //设置定时器1为方式2 TH1=0xfd ; TL1=0xfd ; //装初值 TR1=1; //启动定时器1 REN=1; // 使能接收 SM0=0; SM1=1; //设置串口为工作方式1 EA=1; // 打开总中断开关 ES=1; // 打开串口中断开关 } //延时函数 void delay(unsigned int k) { unsigned int x,y; for(x=0;x<k;x++) for(y=0;y<2000;y++); } /************************************************************************/ //前速前进 void run(void) { Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 } //前速后退 void backrun(void) { Left_moto_back ; //左电机往前走 Right_moto_back ; //右电机往前走 } //左转 void leftrun(void) { Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走 } //右转 void rightrun(void) { Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机往前走 } //STOP void stoprun(void) { Left_moto_Stop ; //左电机往前走 Right_moto_Stop ; //右电机往前走 } void main() { init(); Left_moto_pwm = 1; Right_moto_pwm = 1; beep = 1; state = STOP; stoprun(); flag = 0; while(1) { if(flag == 1) { beep = 0; delay(30); beep = 1; flag = 0; } switch(state) { case UP: { sendbuf[0]=0x1f; sendbuf[1]=0x00; run(); } break; // 发送的是A 前进指令 case DOWN: { sendbuf[0]=0x2f; sendbuf[1]=0x00; backrun(); } break; // 发送的是B 右转指令 case LEFT: { sendbuf[0]=0x3f; sendbuf[1]=0x00; leftrun(); } break; // 发送的是C 左转指令 case RIGHT: { sendbuf[0]=0x4f; sendbuf[1]=0x00; rightrun(); } break; case STOP: { sendbuf[0]=0x00; sendbuf[1]=0x00; stoprun(); } break; //P2口是我的电机驱动的控制端 default: break; } } }
STM32是一款高性能、低功耗的单片机,适合于各种嵌入式系统的设计与开发。智能蓝牙HC-05小车则是一种机器人小车,利用蓝牙技术实现了遥控和自主行驶等功能。本文将探究基于STM32的智能蓝牙HC-05小车的设计。 首先,在硬件方面,需要设计一种具有良好控制和传输性能的电路板,可以使用STM32作为主控单元,并搭配一些传感器和执行器如电机、驱动模块等。具体来说,可以使用STM32的GPIO控制电机的旋转方向和速度,使用定时器模块控制PWM输出等。此外,需要添加一些传感器,如红外线避障、超声波避障、光电寻迹等,增强小车的自动化和安全性。 其次,在软件方面,需要编写一些代码实现电路板的控制和算法的设计。其中,蓝牙技术是小车控制的关键,它可以透过手机等蓝牙终端设备连接到小车,实现远程遥控。这样可以充分发挥小车的灵活性,达到更好的控制效果。除此之外,编写一些自主控制算法,如避障、寻路、自动循迹等,可以实现更高级的功能,增加小车的实用性和娱乐性。 综合来看,基于STM32的智能蓝牙HC-05小车设计需要一定的硬件和软件知识,但随着技术和市场的不断进步,越来越多的厂家专门设计了应用于机器人小车的芯片和模块,降低了工程师的技术门槛和开发难度,进一步促进了行业的发展。虽然这只是机器人技术的一个小领域,但却可以为我们的生活和教育带来新的机遇和乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值