蓝牙与单片机_单片机与手机蓝牙通信蓝牙优先 - CSDN
  • 这是2016年底两周时间做的一个蓝牙小车,它分为上下两篇,本文是上篇。原本是发在了http://bbs.elecfans.com/ 的,不过由于我的博客都在CSDN上,因此我就把它们重新复制到这里来了。 原文地址:...

    1. 简介

    这是2016年底两周时间做的一个蓝牙小车,它分为上下两篇,本文是上篇。原本是发在了http://bbs.elecfans.com/ 的,不过由于我的博客都在CSDN上,因此我就把它们重新复制到这里来了。

    1.1 相关的博客和代码

    原文地址
    源代码地址
    小车手机端代码 — 下篇博客,此为后续版本,实现了手机端的蓝牙程序控制小车运动以及接收小车状态并展示。

    1.2 想法来源

    最初的想法是做一个红外遥控的装置,链接地址。只需要前进和停止,二路遥控,想使用模拟电路搭建,但最后也没能完成,这个想法依然在,现在只能留带以后是否有想法再做了。

    第二个想法是想做一个小车,小车的功能如下: 前进,后退,转弯,遥控控制,自主智能运转。 上某宝买了一个小车的底座(4驱动的,带电机), 买了两个L298N驱动模块用来驱动小车,买了蓝牙模块(HC05)用来充当遥控。

    2. 实践篇

    2.1 电路焊接

    首先根据51单片机的最小系统的电路图,焊接了一个最小系统板,使用的STC89c52的单片机(晶振6Mhz,带复位电路,复位指示灯显示),为了便于测试,又焊接了一个发光二极管连接一个I/O口,用于测试最小系统。

    2.2 最小系统测试

    开始测试最小系统,不过我很多年没有用过keil和下载器了,就上网寻找了一下关于这方面的帖子,并作了总结。要测试最小系统,首先需要编译代码的工具(我用的keil),下载代码到单片机的工具(stc-isp),usb转ttl硬件设备(某宝上2块多钱买的),串口调试助手(使用的是单片机多功能调试助手PortHelper.exe),于是从网上下载了keil4破解版本,stc-isp下载软件,单片机多功能调试助手三个软件。

    注意:
    下面的步骤2.2.1和2.2.2是用于测试USB转TTL设备,而2.2.3-2.2.5是用于单纯的最小系统测试。那为何需要用USB转TTL设备呢?在解释之前,先介绍我们的小车总体控制路径:

    空气
    手机端按下方向按钮
    手机发送命令到手机蓝牙
    单片机串口蓝牙设备
    从蓝牙串口读取
    单片机串口
    单片机处理程序接收到串口命令
    单片机处理命令

    可以看出,上述的路径无需USB转TTL的参与,我们之所以要使用USB转TTL是出于测试蓝牙的需要。考虑一种情况:蓝牙和单片机的串口连接之后,若单片机的控制程序无法驱动蓝牙正常工作,我们将无法判断是单片机方面的问题(例如代码或者连线等),还是蓝牙本身的问题。 因此,为了尽可能隔离错误域,我们可使用这个神奇的USB转TTL设备,使其直连蓝牙模块,并使用电脑的串口调试助手,驱动USB转TTL,进而驱动蓝牙模块,从而可确定蓝牙模块的好坏。其测试流程:

    USB口连接
    导线相连接
    电脑
    串口调试助手
    USB转TTL
    蓝牙串口模块

    不过要使用以上的方案,我们首先要测试USB转TTL模块是不是好的,好绕口。

    2.2.1 USB转TTL设备连接电脑端是否可识别

    测试usb转ttl是否可用(就444个引脚,5VGNDTXRX)
    打开串口调试助手,设置波特率,打开,发现打开失败,比较郁闷,为何呢? 极有可能是串口号不对,于是打开我的电脑-》管理-》设备管理器,找到串口的条目,查看它的串口号,我的串口号竟然是12,在串口调试助手中压根没有121212。于是电脑给设备重新设置串口号,重新打开,OK。 如何测试usb转ttl呢? 我的想法是如果发送数据的话,对应的tx引脚应该有信号,如果将TX和RX连接到一起,那么发送出去的应该自己可以接收到。我没有示波器,就简单的使用万用表量它的TX引脚的电压,点击发送按钮,发现TX引脚的电压有波动即可。

    2.2.2 USB转TTL与单片机连接

    将usb转ttl的四个引脚接入到单片机的对应引脚即可(其实就是VCC接VCC,GND接GND,TX接RX,RX接TX)。没有采用外部供电,直接利用usb转ttl进行的5v供电

    2.2.3 在keil中写代码,对单片机的某一个I/O进行翻转电平的操作

    代码如下

    sbit LED=P0^0;
    while(1){
        LED = !LED
        Delay10ms(100);
    }
    

    2.2.4 编译程序,生成HEX文件

    使用keil创建相应的51工程,加入上述代码以及头文件,并对程序进行编译,生成相应的hex文件。

    2.2.5 烧录程序

    打开stc-isp下载工具,选择单片机型号,hex程序位置,点击下载即可,如果识别了单片机的话,会出现给MCU重新上电的字样,这个时候只需要关闭再打开MCU的电源开关即可,就会出现烧写程序的过程。

    2.2.6 用万用表量P0^0口

    查看电压是否1秒一次变化即可

    2.3 最小系统测试篇遇到的问题,回忆篇

    51单片机的电源供电问题,忘了接单片机的VCC引脚了(如果是这方面的问题,就检查几个关键地方,vcc和地接好了吗,tx和rx接好了吗,晶振接好了吗,复位电路先不用管,我是使用的万用表一个个的量的)
    晶振的电路没焊好(万用表搞定)
    usb转ttl找不到串口(软件问题的话,容易解决,也有可能是usb转ttl硬件有问题,驱动没有安装成功,导致识别不了硬件)

    3. 蓝牙模块工作篇

    从某宝上花了17大洋买了一个HC05蓝牙主从模块,有6个引脚(VCC,GND,TX,RX,AT,STATUS),前4个引脚与usb转ttl的接法相同(注意RX,TX交叉接线接入到单片机),AT和STatus引脚是我自己命的名字。 AT引脚高电平有效,用于蓝牙模块进入AT状态(所谓AT状态,即是其他程序可以通过它的引脚向蓝牙模块发送AT控制命令,例如设置波特率,查看版本号,设置主从模式),AT引脚悬空默认为低电平。Status引脚用于显示配对的状态(配对成功输出高电平,未配对输出低电平)

    3.1 蓝牙模块测试篇

    第一步:蓝牙模块既然包含串口,那么它应该可以跟usb转ttl直接连接,使用电脑向蓝牙模块发送命令。于是连接蓝牙模块与usb转ttl的对应引脚。
    第二步:将AT引脚悬空,使用手机搜索周围的蓝牙设备,发现有HC05的蓝牙(因为这个蓝牙模块默认是从模块,可以被收到)
    第三步:将AT引脚拉高电平,使其进入AT状态(按照文档描述,如果上电之后再置位AT,指示灯无变化,依旧是,如果上电之前拉高AT,指示灯转为1秒一次),然后通过电脑串口发送AT+VERSION?(注意需要换行)查看版本号,使用AT+UART?查看波特率(默认9600,不带校验)
    此文档有用: ATK-HC05-V11用户手册_V1.0.pdf (请自行搜索)
    第四步:实验了一下,我的模块有问题,就是上电之前拉高AT,模块不接受AT命令,只有上电后拉高AT才有用,不过不影响使用。
    第五步:将蓝牙模块和usb转ttl连接后,AT保持悬空,即蓝牙模块为从模块,手机安装蓝牙串口助手,打开手机蓝牙,然后搜索HC05,配对,然后打开手机端的蓝牙串口助手软件,向HC05发送消息,如果蓝牙模块工作正常,那么电脑端的串口调试助手应该收到手机发送的消息。同样的也可以通过电脑端发送消息,到手机端。

    消息传递流程如下:
    手机端蓝牙串口助手 -> 手机蓝牙 ->空气 -> HC05蓝牙模块 -> USB转ttl模块 -> 电脑的串口调试助手,反过来也是可行的(注意线路连接方式都是RX与TX交叉连接)

    3.2 蓝牙模块与单片机集成调试篇

    上面的测试已经证明了蓝牙模块是可以发送接收手机端消息的,现在开始将蓝牙模块与单片机的TX,RX接口连接起来,通过程序控制蓝牙模块与手机蓝牙进行沟通,从而达到利用手机蓝牙进行遥控的目的。

    main函数如下,主要设置串口波特率,以及开启串口中断

    //PCON:SMOD位默认为0,串行口波特率加倍位
    PCON = 0x80;                //SMOD=1;
    
    TMOD=0x20;          //8位自动加载计数器
    //TH1=0xfd;  TL1=0xfd;   for 11.0592MHZ and SMOD=0, 
    TH1 = 0xf3;//2400bps
    TL1 = 0xf3;
    TR1=1;    // T1
    //SCON: 0x50=SM0=0, SM1=1,REN=1
    REN=1;   
    SM0=0;
    SM1=1; //串口
    EA=1; //中断
    ES=1; 
    
    串口中断函数
    void serial() interrupt 4
    {
             char sbuf;
             sbuf=SBUF;
             switch (sbuf)
             {
                     case 'f': direc=4; break;
                     case 'b': direc=5; break;
                     case 'l': direc=6; break;
                     case 'r': direc=7; break;
                     case 's': direc=-1; break;
                     default : LED = !LED; //LED为一个I/O引脚,控制发光二极管
             }
             RI=0;
    } 
    

    3.3 遇到的问题:

    利用手机给蓝牙HC05发送消息,如果不是switch中的几个case的话,那么LED灯会明暗变化,但是刚开始的测试却始终不如意。而后仔细查看了代码,并没有发现什么错误,后来怀疑是波特率的问题,因为我的晶振是6Mhz的,蓝牙模块的波特率是960096009600

    采用波特率倍频,我手动计算了一下: 6∗1000000∗2/12/32/9600=3.2556*1000000*2 / 12 / 32 / 9600 = 3.255610000002/12/32/9600=3.255若对其取整为333. 然后使用3反代入到此式子中,我们有
    6∗1000000∗2/12/32/3=10416.7 6*1000000*2 / 12 / 32 /3 = 10416.7 610000002/12/32/3=10416.7 它与960096009600的波特率相差140014001400多,这个似乎差距太大了。我又尝试了其他几个参数,像480048004800, 192001920019200, 384003840038400都相差挺大的,估计就是这个原因。于是继续尝试,发现240024002400的话,相差不多。
    6∗1000000∗2/12/32/2400=13.026*1000000*2/12/32/2400 = 13.02610000002/12/32/2400=13.02 ,然后使用131313代入进去,其波特率结果为2403.82403.82403.8,与240024002400的波特率相差很小,估计是可以用的,但是看蓝牙模块的文档,发现它说不支持240024002400的,我不甘心,就使用usb转ttl模块(有没有发现此模块是不是很有用?)设置了一下240024002400,没想到AT命令还真的返回OK了,单片机程序也可以正常工作了。

    4. 小车驱动篇

    将两个L298N模块与单片机的P2口直接相连(小车4轮驱动,每个电机需要两个输入引脚,以及一个使能引脚,那就是12个引脚,我刚开始并不想支持调速的功能,因此使能引脚直接高电平了,就连接了8个I/O口)。注意L298N的GND引脚一定要和单片机的GND共地。

    关于L298N: 它的EN引脚用于使能,EN为高电平,才使能。另外两个输入引脚IN1,IN2根据电平的组合变化会有4种情况(00,10,01,11),电机相应的在00和11停止(这个停止是带电的,类似于锁死的感觉),在10正转,01反转。可以直接使用单片机的VCC和GND连接L298N的IN1和IN2,同时将EN端接VCC,看电机转不转就可以测试L298N模块了。

    编写程序,控制轮子的正转,翻转,停止等。基本上就是以下的这种代码

    void wheelForward(uchar which)
    {
            switch(which)
            {
                    case 1:
                    {        
                            wheel_1_1 = 0;
                            wheel_1_2 = 1;
                            break;
                    }
                    case 2:
                    {
                            wheel_2_1 = 0;
                            wheel_2_2 = 1;
                            break;
                    }
                    case 3:
                    {
                            wheel_3_1 = 0;
                            wheel_3_2 = 1;
                            break;                
                    }
                    case 4:
                    {
                            wheel_4_1 = 0;
                            wheel_4_2 = 1;
                            break;
                    }
            }
    }
    

    4.2 遇到的问题

    问题1: 刚开始L298N直接连接P0口,死活不转,而直接引出高低电平到某一个电机的IN1,IN2口,电机正常运转。于是猜测是I/O有问题,使用万用表测量,发现P0的I/O在输出高电平的时候,根本不是高电平,而后发了帖子,询问了一下才知道P0口在高电平是呈现高阻态的,需要外部焊接电路加上拉电阻才可工作。我不想焊接过多的电路,就将其I/O换到P2口,可以正常工作,帖子链接地址

    问题2: 我使用的是路由器的9v直流电源,使用其带动两个L298N,同时将L298N的输出的一个5V高电平接到单片机上给单片机供电,启动4轮驱动,电机只会翁的一声,然后啥也没有,二轮驱动也不转。 上网查看了不少资料,基本上都是电源功率过低,需要将单片机与L298N分别供电才可以。 于是使用笔记本的usb口给单片机供电,使用9v直流电源给电机供电,比刚才好了一些,两轮可以转,但是4个轮子还是转不了。没办法,想到自己有一个小的卡片相机,有镍氢电池8节,然后上网买了一个电池盒,装上去,电机转的吼吼叫,同时L298N给单片机供电也没问题。

    问题3:关于L298N同时给单片机供电的问题,大家可以在启动轮子转动的时候量一量单片机的电源电压,会发现在电机启动的一刹那,单片机的电压有一个瞬时的拉低,这样单片机就会复位了。

    5. 蓝牙遥控小车汇总篇

    第一步:部署小车,L298N,镍氢电池盒,蓝牙模块组装到一起
    第二步:编写代码,本来可以使用EN口进行调速控制的,但是考虑到还需要使用额外的I/O口,就先不打算做了。

    代码完成的功能:

    小车前进,后退,停止,左转,右转
    小车单个轮子的转动(用于测试)
    小车当前状态的获取(用于后期给小车增加其他模块的时候,例如温度模块,就可以读取温度了)
    小车命令帮助
    

    代码思路:

    首先完成单个轮子的控制
    再完成小车的控制
    再加入串口接收中断,收到不同命令,设置方向变量
    main程序读取方向变量控制不同的方向
    

    6. 思路篇

    一些比较有特点的思路:
    思路1:一个棘手的问题想实现这样的功能: 用户按键,小车才走,用户松开按键,小车停止。
    我的想法如下: 小车使用一个定时器T0,控制定时器的延时时间为100ms,用户每发送一个前进信号,小车会前进100ms,但是这100ms内小车还需要能够响应外部的命令。例如如果用户在t=0ms发送前进命令,然后在t=50ms发送左转命令,小车能够立刻左转,而不是继续前进100ms,然后才执行左转的命令。基本的代码思路是用户的每一个命令,都会重置timer0,timer0的超时中断函数会将小车停止。这样用户只要以连续的小于100ms间隔发送前进命令,小车就会一直前进,也就是说timer0的中断没有执行,如果用户间隔100ms还没有发送命令,那么小车停止。 当前我使用的蓝牙串口助手它的按键不支持连续发送,只能按下松开手,才会发送消息,这样我现在就把时间间隔设置为1000ms,用户只要以小于1000ms的间隔连续按键,小车就会一直前进,如果不按键,小车会继续前进1000ms才会停止。 后期打算找到蓝牙串口调试助手的源代码,修改它的源代码,设置成如果用户按下不丢,小车前进命令能够一直发送。

    思路2: 既然有了手机蓝牙,那么小车再想展示一些状态信息,就没必要使用像1602,12864之类的东东了,直接定时发给手机蓝牙模块就OK了。我现在并没有实现定时发送,不过支持了命令获取的功能。 当用户发送命令h到单片机,单片机会返回一个帮助界面,告知如何控制小车,例如"f"控制小车前进,"b"控制小车后退,当用户发送命令i到单片机,单片机会返回小车的一些状态信息,我当前只返回了一些简单的变量状态(后面想加入距离,温度,光敏都是可行的)。

    思路3:有了蓝牙,这个小车就可以被我们随心所欲的控制了。你既可以推命令到单片机,控制它,你又可以把单片机内部的当前状态拉出来。单片机本身又可以定期将它的状态向你的手机进行推送。这个我感觉还是很好玩的,有了这个代码的基本框架,后面有可能的话像实现一个小车的扩展功能,加上红外对管让它不撞墙,加上超声波让它测距,加上麦克风让它向着声音跑,加上人体感应让它做一个跟屁虫,甚至于加上一个智能化点的程序,让它能够在一个屋子里随便的转悠,然后记录屋里的情况。还想做的是加入一个wifi模块,能将它的状态信息上传到路由器里面(手里有一个坏的路由器华为hg255d,正在修理中,还没有摸清楚如何修),这样远在千里之外都可以访问小车上面传感器的情况了。还想加的是一个摄像头模块,不过单片机的处理能力有限,摄像头的解码对它是个大问题,估计很难办到(手头有优龙fs2401开发板,刚修好它的电源模块,正在研究中,不过前天它突然bios引导不起来了,也不知道是什么问题,关于这种arm的东西,还没有接触过,完全不懂刷bios,uboot等等的东西,看情况是要重新刷bios了)。

    后记:
    修改于2018年12月24日午饭后。此博客原本是直接从电子爱好者中把自己写过的内容粘贴过来,也没使用markdown,文章内容显得很乱,今天突然看到了,就花了会简单调整一下,希望能给大家一些更好的阅读体验。

    展开全文
  • 要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数。设置好蓝牙的名称、密码、波特率等待。 step1: 连接usb转ttl模块和蓝牙模块,把两个模块的VCC口相连...

    需要的工具:

    usb转ttl模块*1


    模块如下:

            要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机和蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数。设置好蓝牙的名称、密码、波特率等待。

    step1:

            连接usb转ttl模块蓝牙模块,把两个模块的VCC口相连,GND口相连,TX和RX交叉相连(既TX连RX,RX连TX)。

    然后下载蓝牙串口配置软件进行配置:提取码:6d32

    软件界面如下:

    step2:

            连接好两个模块之后,按住蓝牙模块上的小按钮(按住上电是配置模式,直接上电是正常使用模式),然后把usb转ttl模块插上电脑。

    选择好端口设置上的COM口,其它配置默认不需要改,点击打开串口。如果硬件连接和端口设置没问题的话这时候就可以连接成功了。

    之后点击AT按钮,如果左边界面出现OK字样就证明已经连接成功了,然后就开始根据需求进行配置


    手机连接51单片机+蓝牙

    1. 点击设置从机。
    2. 点击设置模式,在右上角改1为0然后点击手动发送。
    3. 点击设置波特率,PS:这里设置的波特率和刚刚端口设置中的波特率是不一样的,这个是正常模式下蓝牙和单片机通讯的波特率,端口设置中的波特率是配置模式下的波特率,修改这里的波特率不是改变配置模式的波特率,下次配置蓝牙模块的端口设置中的波特率还是保持默认。波特率要和单片机的波特率设置为一样,通常51单片机的程序都是用9600,这里默认9600。
    4. 设置密码,看个人喜好。
    5. 设置名称,看个人喜好。

    如果以上设置中出现什么问题的话,点击恢复出厂设置重新设置一边。如果没问题的话就可以开始把蓝牙换到单片机上进行使用了。

     

    step3:

            吧蓝牙和单片机串口进行连接,蓝牙和单片机的连接和上面的一样,注意TX和RX之间要交叉连接。

            只要连接好蓝牙,烧录好单片机程序,蓝牙就会把单片机串口发送来的数据向已经连接上的蓝牙设备进行发送。

    51单片机的demo:

    /*串口初始化配置*/
    void UartConfiguration()  
    {
        TMOD=0x20;      //设置计数器1的工作方式2
        TH1=0xfd;	    //设置计数器1的初值,决定波特率
        TL1=0xfd;		//设置计数器1的初值,决定波特率
        PCON=0x00;      // 波特率倍增0x00不加倍	 0x80加倍
        SCON=0x50;		//设置工作方式1 开启接受允许
        EA=1;		    //开启总中断
        ES=1;			//开启串口接受中断
        TR1=1;			//计数器1开始运行
    }
    /*发送数据*/
    void sendDate(char date)
    {
        SBUF=date;		  //接收到的数据放入发送缓存器发送
        while(!TI);       //等待发送数据完成
        TI=0;			  //清除发送完成标志位
    }
    
    /*主函数*/
    void main()
    {
        UartConfiguration();
    
        sendDate('1');  //发送字符1
    
        while(1);
    }
    
    /*中断函数*/
    void Uart() interrupt 4
    {
        uchar date;
        date=SBUF;        //取出接受到的数据
        RI=0;			  //清除接受中断标志位
    
        //收到的数据是date
    	
    }
    

    这是51单片机向串口发送数据的例程,其中while(!TI)是等待消息发送成功,如果发送不成功的话会一直等待阻塞程序。

            而且51单片机的串口中断是一个字节一个字节地接收数据的,比如手机向单片机发送了数据“123”,单片机中的中断函数Uart()会进入三次,把数据“123”分三次接收完,一次接收一个字符,所以要在其中添加自己的逻辑把单个字符组合成一个字符串来进行处理。

                                               

    展开全文
  • 首先将HC-06蓝牙通信模块和单片机串口通过杜邦线连接,接线如图所示:RX-P30 TX-P31tips:淘宝购买HC06模块的时候,卖家表示蓝牙模块的TX,RX端的丝印搞反了,所以如果你发现蓝牙模块无法和单片机通信的话,可以尝试...

    本篇介绍如何将蓝牙模块进入AT模式,调整波特率。

    工具:软件串口通讯助手,免安装,直接在win7电脑上运行。

    首先将HC-06蓝牙通信模块和单片机串口通过杜邦线连接,接线如图所示:
    RX-P30                TX-P31
    tips:淘宝购买HC06模块的时候,卖家表示蓝牙模块的TX,RX端的丝印搞反了,所以如果你发现蓝牙模块无法和单片机通信的话,可以尝试调换下TX,RX两端的杜邦线


    将单片机连上电脑,(电脑需要安装单片机的相关驱动,买单片机实验板时候卖家附送的驱动我发现在win10下没用,win7下正常运行),我的电脑——》计算机管理,端口显示端口4
    然后在打开串口调试助手软件。

    串口com4,波特率是9600,输入AT,得到OK就表明成功进入AT模式。

    之后在输入AT+BAUD2,将波特率改为2400.会显示OK2400.
    将串口助手波特率改为2400,输入AT显示OK,表明成功修改至2400



    展开全文
  • 不久前开始学习使用蓝牙模块,在模块51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。此次学习用到...

    不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。


    此次学习用到模块是HC-06蓝牙模块,如下图:

    该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试验。

    总结:在某宝购买时,最好货比三家,虽然模块不值钱,但是在购买过程遇到问题会耽误时间,影响开发,非常麻烦。

    单片机用了两个,分别是新手常用的开发板还有一个单片机最小模块,两者有什么区别我稍后会说明。

    开发板:


    单片机最小模块:


    我特别标注了两者的晶振,分别为12MHZ11.0594MHZ,就是晶振的不同导致我在学习中问题的发生。以下是学习试验过程。


    蓝牙模块的调试:

    接线,蓝牙模块的RX接转换模块的TX蓝牙模块的TX接转换模块的RX,如下图所示:


    接入电脑,在PC端下载好串口调试助手,软件自搜,此处不再赘述。

    附可能会用到的驱动:链接:https://pan.baidu.com/s/1bpYLfCr 密码:yabv

    进入到调试助手,其实基本不怎么用调参数了,蓝牙模块基本都默认设置好波特率为9600,因此直接启动软件调试即可。具体调参数的方法可以自行百度其他文章,都有很详细的介绍。

    启动串口,成功后左下角显示成功:


    发送AT指令,返回OK:


    表明串口正常,此时用手机连接蓝牙模块。手机端也是用到调试助手,请自行下载。

    搜索蓝牙模块:

    备注:我的蓝牙模块此前已经被我改名为Ezio,未改名前默认为HC06。


    连接成功:


    尝试发送消息hello:


    此时在PC端的串口助手上,可以收到来自手机端发送的消息:


    在此说明一点,在蓝牙模块上电以后,模块上的LED灯为闪烁状态,此时处于从机模式,与手机成功连接后,LED灯会变为常亮。自此,蓝牙模块调试成功,可以与单片机连接进行试验


    蓝牙模块与51单片机接线:

    和连接转换模块一样,蓝牙模块的RX连接单片机的TX,蓝牙模块的TX连接单片机的RX,此处说明单片机的RX和TX引脚分别为P3.0和P3.1,如图(图片来自网络):


    正确接线后,向单片机中写入程序,程序如下:

    #include <reg52.h>
    
    sbit P1_0 = P1^0;	//测试口,可用可不用
    sbit P1_3 = P1^3;	//输出口
    
    unsigned char tempbuf;	//存储接收到的信息
    
    /*初始化串口*/
    void BlueteethInit()
    {
    	SCON = 0x50;	//串口模式1,允许接收
    	TMOD = 0x20;	//T1工作模式为2,自动重装
    	PCON = 0x00;	//波特率不倍增
    
    	REN = 1;
    
    	TH1 = 0xfd;		//设置波特率为9600
    	TL1 = 0xfd;
    
    	RI = 0;
    
    	EA = 1;
    	ES = 1;
    
    	TR1 = 1;
    }
    
    void main()
    {
    	BlueteethInit();
    	P1_0 = 0;
    	P1_3 = 0;
    	TI = 0;
    	while(1)
    	{
    		if(tempbuf == 0x31)	//可以使用
    			P1_3 = 1;
    		if(tempbuf == 0)	//不可以使用
    			P1_3 = 0;
    		if(tempbuf == 'A')	//可以使用
    			P1_3 = 1;
    		if(tempbuf == 'B')	//可以使用
    			P1_3 = 0;
    	}
    }
    
    void Serial(void) interrupt 4
    {
    	tempbuf = SBUF;
    	RI = 0;	//读标志清零
    	SBUF = tempbuf;	//将内容返回到手机端,可在手机查看发送的内容
    	while(!TI);
    	TI = 0;	//写标志清零
    }

    该程序为最简单的测试程序,利用蓝牙接收手机发来的信息,控制P1.3口输出高或者低电平,以测试是否正确接收到信息。


    第一步,用蓝牙模块与开发板接线,并成功用手机与蓝牙模块连接,尝试发送信息,过程如图所示:


    无论是发送数字或者是其他字符,都可以看见返回的是乱码,因此可以知道,单片机接收的也是乱码,故程序中的判断:

    while(1)
    	{
    		if(tempbuf == 0x31)	//可以使用
    			P1_3 = 1;
    		if(tempbuf == 0)	//不可以使用
    			P1_3 = 0;
    		if(tempbuf == 'A')	//可以使用
    			P1_3 = 1;
    		if(tempbuf == 'B')	//可以使用
    			P1_3 = 0;
    	}

    无法正确执行,P1.3口自然也无法根据需要来输出高或者低电平。

    第二步,用蓝牙模块与单片机最小模块接线,成功用手机连接收尝试发送信息,如下图所示:


    可见,此时返回的内容与发出的内容相同,经测试此时程序也可以正确执行,使用万用表可以检查出P1.3口输出电平的变化,表明此时蓝牙模块可以正常使用。

    特别说明:

    if(tempbuf == 0x31)	//可以使用
    	P1_3 = 1;
    if(tempbuf == 0)	//不可以使用
    	P1_3 = 0;

    当发送数字消息时,应为十六进制,因此在判断时,如接收到1,应判断是否等于0x31,而不是判断是否等于1。此处经过测试,发送1时,判断tempbuf == 0x31,该判断有效;当发送0时,判断tempbuf == 0,判断无效。判断字符加单引号即可。

    第三步,为什么使用两个相同的单片机会导致结果不同?这也是困扰了我很久的问题,后来经过检查,才知道原来就是晶振的问题。此处PO一下大神关于晶振的说明,暂时未看懂:https://www.zhihu.com/question/30930577

    但可以得出的结论就是,如果使用串口通信,应使用的晶振为11.0594MHZ,否则可能出现乱码的情况。

    另附:开发板上的晶振如图:


    是可以更换的,某宝也有售,可以根据需要的晶振购买。


    展开全文
  • ·简介:由于业务关系,需要开发一个向单片机发送数据的应用,不过由于需求很简单,只  需要发送数据即可,所以该dome的功能只有发送数据功能,并没有对输入的数据  做进一步的处理 这里有蓝牙开发的基本...
  •  手机端打开编写的蓝牙通信软件,与单片机蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机单片机开始读取传感器信息,将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。...
  • 蓝牙(Bluetooth):是一种无线技术标准,可实现固定设备、移动设备...蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案, 蓝牙可连接多个设备,在与单片机连接使用也得到了广泛应用。
  • 我们平时用蓝牙,一般是单片机的串口与蓝牙的串口连接,实现数据传输,同时,也会用到mcu的其他一些功能,比如IIC,比如定时器,ADC等。但对于一些功能相对较少的产品,或者要求小体积的产品,这时候可以考虑把mcu省...
  • 手机是安卓系统的,蓝牙模块采用hc-06,单片机用msp430f149.具体要求是手机发数据能通过蓝牙模块传给单片机然后做出相应的反应(如控制LED的亮灭等)。
  • 最近辛辛苦苦的终于把落下了七八个月的Android蓝牙开发搞完了,其中的痛苦不堪回首啊。感谢那些帮了大忙的老师和同学们!辛苦归辛苦,收获总是有的,...而单片机上的蓝牙模块手机蓝牙连接有点不同,它的UUID号需要
  • 3、单片机TxD RxD+蓝牙模块RxD TxD手机蓝牙 只能收不能发 电路查了又查,单片机和app的程序改了又改,在第三点里连最简单的一个字符都收不到,前面两点进行长字符串传输毫无问题。现在求大神给个思路。 补充一下...
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...
  • 单片机或者在其他领域中,蓝牙的传输是比较重要的,虽然理论只有10米的范围可以传输数据,但是被许多开发者所需求,个人在开发中也是需要蓝牙传输,浏览了许多谷歌的APi文档和博客之后,决定好好写一篇关于蓝牙...
  • 1.单片机发的是ASCII码,手机这边收的是
  • 之前两篇都是在说手机的连接,连接方法,和主动配对连接,都是手机手机的操作,做起来还是没问题的,但是最终的目的是与单片机蓝牙模块的通信。   下面是到目前为止尝试的与单片机的通信方法,没有成功,但是...
  • android手机接收并波形图显示单片机通过蓝牙传输的传感器数据
  • 打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机...
  • 一、App的简单介绍 首先APP的功能描述如下,他可以发送6个数据并接收4个数据。并且数据全部以浮点型数据出现。并保留有判断框,内置要进行数据之间的比较,让判断框的内容发生改变。基本uI界面如下。...
  • android物联网初步,利用手机蓝牙与单片机通信,实现led灯开关和定时
  • Android通过蓝牙接收单片机发来的数据。
1 2 3 4 5 ... 20
收藏数 4,575
精华内容 1,830
关键字:

蓝牙与单片机