首页 > 代码库 > 基于hc-05蓝牙模块控制的步进电机指定旋转角度

基于hc-05蓝牙模块控制的步进电机指定旋转角度

一、蓝牙模块

蓝牙选用【HC-05主从机一体蓝牙模块 无线蓝牙串口透传 无线模块 电子模块】,淘宝链接地址为:https://detail.tmall.com/item.htm?id=41281471872&spm=a1z09.2.0.0.u7iKss&_u=m10qactucc9f

二、手机端APP

     手机端蓝牙串口调试助手,如图一所示:

图一

用手机数据线连接手机,下载上图所示【蓝牙串口调试助手】。下载完毕后,打开手机APP,如图二所示:

                         

            图二                                     图三

三、原理介绍

1、串口的概念

  首先,我们应该知道,什么叫串口?然后再次解释什么叫蓝牙串口。所谓串口,在很长的一段时间内,虽然我自学了单片机,也看到了串口通讯那一节,可是我并没有理解什么叫串口,停留在我脑海中串口的概念,如图三所示,以为图中红线里的公母头插口叫做串口,这也难怪,讲串口的也需要用到它,它跟串口还是有关系的,但是它与串口是并列的两个概念,而不是同一个概念,确切的说就是,串口是串口,插口是插口,但是他们还是有关系的,关系就是:要想使用单片机内部的串口功能,总是需要外部接线的,这一点没错,当我们使用单片机内部串口的时候,上面所述的公母头插口就是我们与单片机串口的桥梁,单片机内部串口的外部表现就是单片机的P3^0(接收端)和P3^1(发射端)管脚。当我们想使用单片机的内部串口时,只需要操作单片机的这两个管脚就可以了,当然,51单片机的接收端和发送端是这两个管脚,其他单片机如果想使用其内部串口,个人认为不一样,需要的请读者自己查找资料。讲到这里大家已经知道,单片机串口其实只是一个虚拟的概念,它是封装在单片机内部的一种逻辑电路,这个我们不去管它,我们要做到的就是会用它就可以了,知道它是个什么概念也就行了。相信说到这里,大家已经对串口有所理解了那么接下来就来看看串口有什么用吧。

2、串口的启动方法和作用

1)怎么打开串口

打开了单片机的内部串口,这样我们就可以实时跟单片机通讯了,简称【实时通讯】,我认为这也是单片机的一个重要功能。首先,我们说,怎么打开单片机的内部串口,上面我们说到,单片机的内部串口可以说是一个虚拟的概念,或者说是封装在单片机内部的一种逻辑电路,没错,打开单片机的串口,用的是程序。下面是打开51单片机内部串口的代码(节选):

TMOD=0x20;串口的工作需要在时间的运行下进行,所以这是确定定时器的工作方式;

TH1=0xfd;

TL1=0xfd;TH1,TL1装入0xfd这个十六进制代码的原因是:确定串口的传输速率,也就是波特率,0xfd确定的波特率是9600,这一点也很重要,波特率设置的不正确,串口是不工作的,或者说不能正常运行;

TR1=1;这是启动定时器,上面说过串口工作在时间里,所以要把“手表”启动,让它计时。这一段代码就是让它启动“手表”;

REN=1;允许接受位,置1的目的是,开启串口接受功能;

SM0=0;

SM1=1;SM0,SM1组合确定串口的工作方式,由于每种的工作方式其各种配置也不相同,但是也不常用,所以一般情况sm0=0,sm1=1确定串口工作方式1;

至此,串口的基本程序设置完毕,将这段程序导入到单片机内部就可以打开单片机内部串口功能了;

2)串口的作用

  上面说过,串口的作用其实我个人认为就是实现了上位机或者说终端与单片机实时通讯的功能,举个例子,相信大家就都明白了:一般情况下我们的单片机开发板都是电脑端写好程序,通过下载线将程序输入到单片机内部,然后单片机去执行,这样有一点不好的地方就是,假如我需要调试哪个led灯亮,哪个灭,我们做法是,程序里改一下,然后下载到开发板里,看结果现象是不是与期望的一样,如果不一样,就要重复之前的过程,那这样是不是就很麻烦呢。是的确实很麻烦,但是有了串口就不一样了,我们用下载线将上面的一段串口程序烧录进入51单片机后,就可以实时通讯了,什么意思呢?就是你可以在电脑上实时修改你的参数,然后发送给单片机,直接观察led的亮灭情况,一直修改到满意为止。讲到这里相信大家该明白了吧,串口的作用总结起来说,就是起到了【实时通讯】的功能,不用程序里改动一下,重新烧写到单片机里实验运行来看结果了。所以说串口的作用是不是很明显呢?

3)串口调试助手

上面我们说到【你可以在电脑上实时修改你的参数】,怎么修改,这里一般我们程序的下载软件里都会有,例如,ISP下载器中的串口调试助手,如图四所示:

        

图四

下面对这个软件做一些简单介绍,当把串口程序烧写进入单片机后,单片机的串口也就打开的,或者说处于工作状态了,然后可以实时通讯了,接下来我们要做的,是针对串口程序,在图四中进行必要的设置,当时我第一次用这个就是不能够实时通讯,后来查半天才发现,串口波特率没有选对,所以使用串口调试助手的时候,首先要选对波特率,上面解释程序时我们又说道,波特率选择9600,因此,在串口调试助手里面,【打开串口】按钮按下之前,先选好波特率,是必要的。一切准备做好之后,就可以进行调试了。

四、关于蓝牙与单片机的内部串口之间的关系

上面我们所说的是,电脑端的ISP下载器上的串口调试助手对单片机内部串口的操作,顾名思义,通讯的桥梁使用的是我们的单片机的下载线,由于下载线下载数据时也是通过P3^0和P3^1两个管脚,而51单片机的内部串口的外部表现也为P3^0和P3^1,所以,我们可以通过下载线,对单片机串口的进行操作。讲到这里我们都知道,任何时候如果想使用串口,都需要连接着一根线,那样是不是很麻烦呢。所以这时候,蓝牙应运而生了,什么意思呢?通俗一点说,就是蓝牙代替了下载线,实现了单片机开发板与电脑端物理上的断开。当然,蓝牙的用处其实也很简单,你可以简单地认为,蓝牙模块充当了一根很长的下载线的功能,如果应用到远程控制小车上,就是充当了一根远程控制线的功能,说到这里,相信大家都应该明白了,蓝牙模块用在单片机上,其实就是一根虚拟的下载线或者说无形的下载线。

上面介绍了一下,蓝牙模块的基本概念,接下来我将继续阐述一下蓝牙模块与51单片机物理上的连接关系,如图五所示:

 

图五

其实蓝牙模块的使用非常简单,并没有想象中的那么难,拿到蓝牙模块后,一般情况下并不需要设置,如图五所示连接电路即可。当单片机中烧写进去串口程序后,加上上面的蓝牙模块连接完毕,那么相当于单片机和手机已经能够通讯了,前提是手机端下载好了前面所述的蓝牙串口调试APP。

注意】:不是电脑端,如果需要电脑端给蓝牙发送信息,则还需要一个蓝牙和TTL转串口模块才可以实现电脑端与单片机的无线连接。

五、蓝牙串口调试实验

本实验的目的是验证蓝牙串口的效果如何,也是本研究课题重要的一个环节。

1、实验描述

在手机端蓝牙串口调试助手中给单片机发送十六进制代码,由于程序中已经写好了关于单片机收到代码后的执行动作,所以我们只需要观察实验现象是否与理论一致即可验证蓝牙串口效果。

2、实验物理连接

如图六所示,蓝牙模块实际上只用到了六根线中的两根,其他两根是设置蓝牙模块使用的,我们买来的蓝牙模块内部已经设置好了,基本上满足了我们的需求,所以基本不用设置,可以直接用。连接线路如图六所示,由于本项目为【基于hc-05蓝牙模块控制的步进电机指定旋转角度】,所以单片机外面又做了一个步进电机步进角度的指示盘。

          

图六

下面对上述电路作简要解释:上述电路实现的总体功能为,单片机接收到手机蓝牙串口发送回来的十六进制代码后,会作出相应的反应,具体会作出什么反应?接下来我们解读完程序后再作解释。下面叙述一下电路详细连接:

1)蓝牙模块

蓝牙模块用到四根线,分别是VCC,GND,TXD,RXD,接线VCC和GND分别接单片机的VCC和GND,蓝牙模块的TXD接单片机的RXD,蓝牙模块的RXD接单片机的TXD,如图六所示。黑色串口线给单片机开发板提供电源用。

2)单片机外接元器件

单片机外接元器件在本例程中为单片机P1口输出的8个led灯组和步进电机步进角度指示盘,其中led灯的作用是增加实验现象,检测是否程序正常运行。步进电机角度指示盘为本项目的核心要点。其中步进电机的电气连接为3S锂电池供电,信号线由单片机P0^0—P0^3四个管脚口控制,步进电机的四根信号线连接步进电机驱动的信号输入插针,输出插针连接步进电机即可,其中步进电机为28BYJ-48 5VDC,其中每个字母具体为啥意思,大家有兴趣可自行去网上查找,我们只需要知道,这个类型的电机为四相八拍工作模式即可,什么叫四相八拍呢?四相可以理解为四对,即定子上有4对绕组,同一对绕组的绕线方向要相同,八拍是说此步进电机有八个工作节拍,为A-AB-B-BC-C-CD-D-DA,具体还有两项四拍,但是我们如果想要更细小的步进角,就选择四相八拍的工作模式最佳,四相八拍的工作模式是一种什么概念呢?这个主要在程序中体现,一种电机的几相几拍,几相是物理特质,我们无法改变,但是几拍就是我们可以改变的,这个主要在程序中体现。步进电机驱动用的是ULN2003,驱动模块用的电源是3S的锂电池经过LM2596稳压过后传输过来的。

 

3、程序解读

下面将附上本项目所使用的程序,程序的编译器为keil3,下载器前面有说过为ISP下载器。

#include<reg52.h>  //单片机包含的头文件,里面包含了一些端口的定义

#define uchar unsigned char

#define uint unsigned int  //宏定义

void delay(uint t);

void jiudu();

void badu();

void qidu();

void liudu();

void wudu();

void sidu();

void sandu();

void liangdu();

void yidu();  //子函数声明

uint i;

float j;  //定义变量类型

 

uchar code step_table[]={

0x01,0x03,0x02,0x06,

0x04,0x0c,0x08,0x09};  //前面我们有说过,几相几拍,那么我们这个步进电机使用的是八拍模式,在此设置

 

uchar flag,a,temp;  //定义变量类型

 

void main()

{

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

REN=1;

SM0=0;

SM1=1;

EA=1;

ES=1;  //前面有说过,此处为串口中断设置,串口已处于工作状态

 

while(1);//程序卡在这儿,等待中断产生

}

 

 

 

 

 

void ser() interrupt 4  //中断服务程序

{

if(RI==1)   //RI置高,说明单片机收到数据

{

RI=0;//重新置低,等待下次接收数据

temp=SBUF;//将接收到的数据赋给局部变量temp

P1=temp;//将接收到的数值赋给P1口,控制Led组亮灭

    flag=1;//接收标志

}

if(flag==1)// 说明串口收到数据

{

ES=0;//关闭串口中断

flag=0; //将标志请0,等待下次判断是否接收完数据

SBUF=temp;//将串口收到的数据返回

while(!TI);//判断是否发送完毕,没发送完,卡在这儿

TI=0;//发送完毕后清0

ES=1;//开启串口中断,继续计时等待下次中断

}       

switch(temp)

    {

case 1: yidu();break;

case 2: liangdu();break;

case 3: sandu();break;

case 4: sidu(); break;

 

case 5: wudu(); break;

case 6: liudu(); break;

case 7: qidu(); break;

case 8: badu(); break;

case 9: jiudu(); break;

 

default: break;

     }//按手机端的输入值,步进电机转过相应的角度

  

}

 

void delay(uint t)

{

while(t--);

}//延时函数

 

 

 

 

void yidu() //转过角度子函数,以下类似

{

for(j=8*1.51;j>0;j--)//控制输入脉冲数,从而实现一定角度旋转

{

for(i=8;i>0;i--)//循环换节拍,实现持续旋转

{

P0=step_table[i];

delay(200);//此项主要控制电机转速

}

 

}              

}                          备注:以下程序类似yidu()分析,即可

 

void liangdu()

{

for(j=8*3.2;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void sandu()

{

for(j=8*4.5;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void sidu()

{

for(j=8*6;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void wudu()

{

for(j=8*7.5;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void liudu()

{

for(j=8*9;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void qidu()

{

for(j=8*10.5;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void badu()

{

for(j=8*12;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

void jiudu()

{

for(j=8*13.5;j>0;j--)

{

for(i=8;i>0;i--)

{

P0=step_table[i];

delay(200);

}

 

}  

 

}

4、实验过程

首先,通过ISP下载器将上述程序下载到单片机中,然后连接蓝牙模块,此处应注意,在下载程序时,应该断开蓝牙模块的连接,因为蓝牙模块如果不断电,会占用单片机内部串口,影响单片机程序的下载。下载完程序后,给实验版通电,也就是给单片机通电,同时也给步进电机通电,如图七所示(备注:数码管亮不用去管,内部电路有关联),此时可以看到蓝牙模块的指示灯在快闪,说明此蓝牙没有被连接,然后在手机端打开蓝牙串口调试助手,如图八所示,点击搜索,可以搜索到蓝牙模块,名称为hc-05,还有设备地址,点击即可,然后就会发现蓝牙指示灯慢闪,说明蓝牙已被连接,可以进行数据通信了。如图九所示,我们输入第一个数值01,这个值其实是0x01,它是一个十六进制代码,点击发送,然后我们可以看到,按照程序里说明的这个数值等于1,那么swith语句中选择case 1执行,那么步进电机便会转动一度,这里一度等于刻度盘上一个格,如图十所示,(程序里为了好理解才这么写的)。同时相应的led灯只有第一个不亮,我们的LED灯是共阴的,只有低电平才亮。为了验证程序的正确性我们再次输入05,如图十一所示,那么电机应该相应的转过五个格,如图十二所示,说明程序是正确的,只是格数还不是那么准确,可以在程序中的【控制脉冲数】,作持续修改即可,直到达到满意值。

             

          图七                                     图八

                

            图九                                         图十

说明:这些图均可以放大观看实验现象更加明显,图十二与图十是两个衔接的图,电机转动角度承接上一次。主要观察电机转动角度与led灯亮灭情况与程序的对应情况,通过实验发现,完全一致。

 

 

 

 

 

 

                   

          图十一                                   图十二

 

六、未来展望

   深刻理解了蓝牙串口的功能和作用后,这相当于掌握了一套无线传输系统,利用这个技术,就可以做一些远程控制了,例如蓝牙小车,蓝牙通讯等,这些功能都有待我们去开发。

基于hc-05蓝牙模块控制的步进电机指定旋转角度