蓝牙模块控制单片机_单片机蓝牙模块控制 - CSDN
  • HC-05蓝牙串口通信模块应该是使用最广泛的一种蓝牙模块之一了。为什么呢? 因为HC05模块是一款高性能主从一体蓝牙串口模块,可以不用知道太多蓝牙相关知识就可以很好的上手。说白了,只是个蓝牙转串口的设备,你...

    HC-05蓝牙串口通信模块应该是使用最广泛的一种蓝牙模块之一了。为什么呢?

    因为HC05模块是一款高性能主从一体蓝牙串口模块,可以不用知道太多蓝牙相关知识就可以很好的上手。说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。

    但是就是这么一个很常见的模块,网上很多的博客写的都是错的,或者都是很不详细的。

    所以本文就介绍一下这款蓝牙通信模块的使用,包括蓝牙模块的调试、手机与蓝牙模块之间的传输、手机蓝牙控制STM32单片机,应该是逐渐深入的一个过程。但是这仅仅是使用,以后有时间应该会对蓝牙有一个稍微深度的学习,而不能仅仅是浮于表面,只会用。

     

    模块名称:HC-05蓝牙串口通信模块

    参考资料:HC-05蓝牙串口通信模块官方资料包

    知识储备:【STM32】串口通信基本原理(超基础、详细版)

    其他模块:USB转TTL模块、手机蓝牙串口助手app

    手机蓝牙串口助手软件,可以点击链接下载:蓝牙串口。因为这是我见过所有手机端界面最好看的了,其他的界面都有点太糟糕了。

     

    蓝牙模块的调试

    准备工作

    USB转TTL模块与HC-05蓝牙模块的接线:

    两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。如下图所示:

    这个时候就要将转换模块连接到电脑上,然后利用串口调试助手进行蓝牙模块的调试。

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

    蓝牙模块的调试

     

    HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。

     

    • 当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;
    • 当模块处于命令响应工作模式时能执行AT命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。

    怎么进入命令响应工作模式?

    进入命令响应工作模式有两种方法:

     

    • 模块上电,未配对情况下就是AT模式,波特率为模块本身的波特率,默认:9600,发送一次AT指令时需要置高一次PIO11;
    • PIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,可以直接发送AT指令。

    什么叫做置高一次PIO11?

    在蓝牙模块中有一个小按键,按一下就置高一次PIO11。也就是说,第一种方法需要每发送一次AT指令按一次;而第二种方式是长按的过程中上电,之后就无需再管了,直接发送AT命令即可。

    需要注意一下,两种进入命令响应工作模式的方式使用的波特率是不一样的,建议使用第二种方式。

    怎么区分进了命令响应工作模式呢?

    在蓝牙模块上有灯,当灯快闪的时候,就是自动连接工作模式;当灯慢闪的时候,就是命令响应工作模式。

    AT命令

    进入到命令响应工作模式之后,就可以使用串口调试助手进行蓝牙调试了。

    首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:

     

    常用AT指令
    指令名 响应 含义
    AT OK 测试指令
    AT+RESET OK 模块复位
    AT+VERSION? +VERSION:<Param> OK 获得软件版本号
    AT+ORGL OK 恢复默认状态
    AT+ADDR? +ADDR:<Param> OK 获得蓝牙模块地址
    AT+NAME=<Param> OK 设置设备名称
    AT+NAME? +NAME:<Param> OK 获得设备名称
    AT+PSWD=<Param> OK 设置模块密码
    AT+PSWD? +PSWD:<Param> OK 获得模块密码
    AT+UART=<Param1>,<Param2>,<Param3> OK 设置串口参数
    AT+UART? +UART:<Param1>,<Param2>,<Param3> OK 获得串口参数

    对于AT指令,有几点注意:

     

    • AT+NAME?:获得设备名称,这个AT指令有很大可能性是没有返回的,因为我也看到了很多的例子……,但是其他的指令都是没有问题的,直接设置设备名称就行了;
    • AT+UART?:获得串口参数,串口的参数一共有三个,波特率、停止位、检验位。其取值如下:

     

    串口参数
    参数名称 取值
    波特率

    2400、4800、9600、19200、38400、5760、

    115200、230400、460800、921600、1382400

    停止位

    0:1位

    1:2位

    校验位 0:NONE  1:Odd  2:Even

    其默认值为:9600,0,0。

    例子:

    本文中,蓝牙串口的波特率设置成115200。之后的内容,就会采用这个波特率来进行通讯了。

     

    手机与蓝牙模块之间的传输

    直接将蓝牙模块与转换模块连接,再讲其连接到电脑上,蓝牙模块直接进入自动连接工作模式。

    此时手机打开蓝牙串口调试应用,用其来连接蓝牙模块。手机蓝牙串口助手软件,可以点击链接下载:蓝牙串口。万分推荐这款,因为界面脱离了那种黑不溜秋的感觉,比较简洁、清爽。

    这个软件的使用:点击界面右下角蓝牙的标志,选择蓝牙进行连接。

    然后在电脑上的调试助手和手机的蓝牙串口调试应用之间就可以相互传输了,比如:

    可以清楚的看到:电脑向手机发送了“hello you”,手机向电脑发送了“hello world”。

     

    手机蓝牙控制STM32单片机

    之前的两个例子都是相比较而言比较简单的,这个例子将会涉及到程序的内容了。

    实现功能:手机通过蓝牙,向STM32单片机发送消息,STM32接收到消息之后原封不动的返回给手机。当然如果掌握了这个例子,也可以修改成,手机发送特定的消息,然后,STM32单片机做出相对应的动作。比如:点亮LED等、发动电机等等。

    连接说明

    使用USART1进行试验,也就是说STM32选取PA9、PA10来和HC-05进行连接。同时手机通过蓝牙来和HC-05进行连接。

    原理就是:手机通过蓝牙传输到HC-05上,再通过串口通信和STM32通信;而之前一般都是电脑上通过USB线转串口的方式,通过串口和STM32通信。本质上没有区别的。

    这个时候就应该更加深刻地体会到了本文开篇的一句话:说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。蓝牙的相关一切都被封装起来了,都不需要接触到。

    STM32控制程序

    #include "stm32f10x.h"
    
    
    void My_USART1_Init(void)
    
    {
    
    GPIO_InitTypeDef GPIO_InitStrue;
    
    USART_InitTypeDef USART_InitStrue;
    
    NVIC_InitTypeDef NVIC_InitStrue;
    
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能
    
    
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
    
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
    
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    
    
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
    
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
    
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    
    
    USART_InitStrue.USART_BaudRate=115200;
    
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    
    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
    
    USART_InitStrue.USART_Parity=USART_Parity_No;
    
    USART_InitStrue.USART_StopBits=USART_StopBits_1;
    
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;
    
    
    USART_Init(USART1,&USART_InitStrue);
    
    
    USART_Cmd(USART1,ENABLE);//使能串口1
    
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
    
    
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
    
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
    
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
    
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
    
    NVIC_Init(&NVIC_InitStrue);
    
    
    }
    
    
    void USART1_IRQHandler(void)
    
    {
    
    u8 res;
    
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    
    {
    
    res= USART_ReceiveData(USART1);
    
    USART_SendData(USART1,res);
    
    }
    
    }
    
    
    int main(void)
    
    {
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    My_USART1_Init();
    
    while(1);
    
    
    }

     

     

    这段程序和【STM32】串口相关配置寄存器、库函数(UART一般步骤)中的程序一模一样,几乎没有什么改动。

    区别就是,在UART实验中,USART1是和USB转串口模块连接在一起的,然后与电脑上的串口调试助手进行通信;现在改成USART1是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。

    展开全文
  • 这是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,文章内容显得很乱,今天突然看到了,就花了会简单调整一下,希望能给大家一些更好的阅读体验。

    展开全文
  • 蓝牙模块 硬件连接3、手机端apk 功能实现 1.简介 通过蓝牙通讯 使用手机来控制 单片机 上 LED 灯的亮灭。 1)硬件使用 89c52 单片机 2)BT06 蓝牙模块 3) Android 手机一部 手机 —(蓝牙连接)—> BT06 ----...

    1.简介

    通过蓝牙通讯 使用手机来控制 单片机 上 LED 灯的亮灭。

    1)硬件使用 89c52 单片机
    2)BT06 蓝牙模块
    3) Android 手机一部

    手机 —(蓝牙连接)—> BT06 ----(串口通信)–> 单片机 -----> LED

    在这里插入图片描述

    2.蓝牙模块 硬件连接

    蓝牙模块与 51 开发板接线主要有 4 根线需要接,分别为 VCC、GND、TXD、RXD,蓝牙模块上的 VCC 接 到开发板上的 VCC 针脚,蓝牙模块的 GND 接到开发板上的 GND 针脚,蓝牙模块的 TXD 接到开发板上的 P30 针脚,蓝牙模块的 TXD 接到开发板上的 P31 针脚。
    在这里插入图片描述
    单片机上电之后,手机会搜索到 一个蓝牙名称为 “BT04-A” 的蓝牙信号,就是这个蓝牙模块。

    在这里插入图片描述

    3、手机端apk 功能实现

    手机端主要是通过蓝牙连接,发送信号给单片机蓝牙模块

    1. 代码结构
      在这里插入图片描述
      2)AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="myapplication.lum.com.ledcontrol">
    
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    1. activity_mani.xml 布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    <Button
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:id="@+id/connect_id"
        android:textSize="30dp"
        android:text="连接蓝牙"/>
    
    
        <Button
            android:layout_width="180dp"
            android:layout_height="60dp"
            android:id="@+id/led_id"
            android:textSize="30dp"
            android:text="开灯"/>
    
    
    </LinearLayout>
    

    4) mainActivity.java 功能文件

    这里 我知道自己买的蓝牙模块的物理地址 44:44:1B:0F:0D:B8 ,就可以直接手动连接 蓝牙,然后通过 蓝牙物理地址 找到 连接的设备,进而连接socket 等,

    package myapplication.lum.com.ledcontrol;
    
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothManager;
    import android.bluetooth.BluetoothSocket;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.provider.Settings;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.lang.reflect.Method;
    import java.util.List;
    import java.util.Set;
    import java.util.UUID;
    
    import static android.bluetooth.BluetoothProfile.GATT_SERVER;
    
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private String TAG = "LUM: ";
    
        private Button buttonConnect, buttonLed;
        private BluetoothAdapter mbluetoothAdapter;
        private String bluetoothDeviceMacAddress = "44:44:1B:0F:0D:B8"; //Bluetooth module physical address  
        private BluetoothDevice bluetoothDevice = null; // Connected Bluetooth device
        private BluetoothSocket btSocket = null; // Bluetooth communication socket
        private final static String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB"; // SPP service UUID number
        private final static int RESULT_CODE = 100;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initView();
        }
    
        private void initView() {
            mbluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //get the default bluetooth adapter
            buttonConnect = (Button) findViewById(R.id.connect_id);
            buttonLed = (Button) findViewById(R.id.led_id);
    
            buttonConnect.setOnClickListener(this);
            buttonLed.setOnClickListener(this);
    
            IntentFilter filter = new IntentFilter();
            filter.addAction(BluetoothDevice.ACTION_FOUND);  //Bluetooth search
            filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
            filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
            registerReceiver(mReceiver, filter);
    
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.connect_id:
                    Log.i(TAG, "check link");
                    //Jump directly to the Bluetooth settings interface
                    if ("连接蓝牙".equals(buttonConnect.getText().toString())) {
                        if (!mbluetoothAdapter.isEnabled()){
                            startActivityForResult(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS), RESULT_CODE);
                        } else {
                            connectBtSocket();
                        }
    
                    } else {
                        disconnect();
                    }
                    break;
                case R.id.led_id:
                    Log.i(TAG, "led control");
                    if (btSocket != null && btSocket.isConnected()) {
                        if ("开灯".equals(buttonLed.getText().toString())) {
                            send(1);
                            buttonLed.setText("关灯");
                        } else {
                            send(2);
                            buttonLed.setText("开灯");
                        }
                    }
            }
    
        }
    
        public void send(int command) {
            try {
                if (btSocket != null) {
                    OutputStream os = btSocket.getOutputStream();   //Bluetooth connection output stream
                    os.write(command);
                } else {
                    Toast.makeText(this, "请先连接蓝牙", Toast.LENGTH_SHORT).show();
                }
    
            } catch (IOException e) {
            }
        }
    
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == RESULT_CODE) {
                connectBtSocket();
            }
        }
    
        private void connectBtSocket() {
            // Get the handle of the Bluetooth device
            bluetoothDevice = mbluetoothAdapter.getRemoteDevice(bluetoothDeviceMacAddress);
            //Turn off scanning before pairing
            if (mbluetoothAdapter.isDiscovering()) {
                mbluetoothAdapter.cancelDiscovery();
            }
            // Get the connected socket
            try {
                btSocket = bluetoothDevice.createRfcommSocketToServiceRecord(UUID
                        .fromString(MY_UUID));
                btSocket.connect();  //Connection socket
            } catch (IOException e) {
                Toast.makeText(this, "Connection failed, can't get Socket!" + e, Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
    
            if (btSocket.isConnected()) {
                Log.i(TAG, "socket connected");
                Toast.makeText(this, "connect success", Toast.LENGTH_SHORT).show();
                buttonConnect.setText("蓝牙已连接");
            } else {
                Log.i(TAG, "socket didn't connected");
                Toast.makeText(this, "connect failed", Toast.LENGTH_SHORT).show();
            }
        }
    
    
        private void disconnect() {
            try {
                if (btSocket != null) {
                    btSocket.close();
                }
            } catch (IOException e) {
            }
            buttonConnect.setText("连接蓝牙");
        }
    
        // Help us find the physical address of the Bluetooth module that needs to be connected
        private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Log.i(TAG, "Searched Bluetooth device;  device name: " + device.getName() + "  device address: " + device.getAddress());
                }
                if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                    Log.i(TAG, "ACTION_ACL_CONNECTED");
                    if (btSocket.isConnected()) {
                        buttonConnect.setText("蓝牙已连接");
                    }
                }
                if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
                    Log.i(TAG, "ACTION_ACL_CONNECTED");
                    if (btSocket.isConnected()) {
                        buttonConnect.setText("连接蓝牙");
                    }
                }
            }
        };
    
        public void onDestroy() {
            super.onDestroy();
            unregisterReceiver(mReceiver);
            Log.i(TAG, "Unregister");
        }
    }
    
    

    4. 单片机端 程序

    
    #include <reg52.h> //51头文件
    
    sbit LED1 = P1^0; //位定义 LED1硬件接口
    void delay(unsigned int z)//毫秒级延时
    {
    	unsigned int x,y;
    	for(x = z; x > 0; x--)
    		for(y = 114; y > 0 ; y--);
    }	
    
    
     /******************************************************************/
    /* 串口中断程序*/
    /******************************************************************/
    void UART_SER () interrupt 4
    {
    	unsigned int n; 	//定义临时变量
    
    	if(RI) 		//判断是接收中断产生
    	{
    		RI=0; 	//标志位清零
    		n=SBUF; //读入缓冲区的值
    
    		switch(n)
    		{
    			case 1:	LED1 = 0;	break;	//亮灯
    			case 2:	LED1 = 1;	break;	//灭灯
    		}
    	}
    
    }
    
    
    
    //蓝牙初始化
    void boothint(void)
    {
       
       	SCON = 0x50; 	// SCON: 模式1, 8-bit UART, 使能接收 
    	TMOD |= 0x20;
    	TH1=0xfd; 		//波特率9600 初值
    	TL1=0xfd;
    	TR1= 1;
    	EA = 1;	    //开总中断
    	ES= 1; 		//打开串口中断
    
    
    }
    void main()
    {
    	boothint();
    	while(1)
    	{
    
    	}
    }
    

    文件参考:
    安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下)
    https://blog.csdn.net/u010898329/article/details/82177958

    展开全文
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...

    系列博文:

    (1)安卓手机与蓝牙模块联合调试(一)——蓝牙模块的串口通讯 

    (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)

    (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下)

    本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机通过蓝牙与单片机通信-发送指令/接收数据​​​​​​​


    忙里偷闲,承接上一篇文章继续

    安卓手机与蓝牙模块联合调试(一)——蓝牙模块的串口通讯 - CSDN博客

    本篇将实现两个实例,手头正好有8位的单片机,索性就用来练手了。将会提供两个例子,一个是基于STM8的库函数实例,一个是基于STC89C52的实例。

    1.首先了解下单片机串口通讯线的接法。这个比较重要,建议参考文章。

    (1)HC-05初探 - 骑着蜗牛逛世界 - 博客园      https://www.cnblogs.com/LittleHann/p/5621937.html

    (2)HC-05 蓝牙模块的调试与使用 - CSDN博客      https://blog.csdn.net/txf1984/article/details/46553715

     

    2. 准备工作和单片机原理图。

           首先看下我用到的硬件支持,一块STM8S103F2P6最小系统板,一个ST-Link下载器,一个HC-05的模块(暂时先调试HC-5的模块,CC2541单片机端的代码是一样的)

    最小系统的原理图如下,大家按照上面两个博文中的接线方法接好单片机,特别注意蓝牙模块的TX/RX与单片机的TX/RX要交叉相接

    3. 单片机的代码,使用STM8库函数编写。

    首先看下目录结构,本项目使用的是IAR编译器

    下面贴出来main函数,注释在代码中已经描述的很清楚了,大家可以自行参考。

    /*************
    ** Author   : 江涛
    ** Date     :  2018/08/28
    ** Describe : 蓝牙控制单片机开关灯
    **************/
    /* Includes -----------*/
    #include "stm8s.h"
    #include <string.h>
    
    /********************************************
    **  TestLed        PB5  测试LED
    **********************************************/
    
    /**串口1接收数据标志位**/
    unsigned char Usart1_bufStart_or_bufSotp = 0 ;
    /**串口1数据,这里10个字节够放命令了,大家可以根据实际需要调整数组长度**/
    char Usart1BufData[10];
    /**串口数据数目自增量,用来统计数目是否达到数组最大长度**/
    char Usart1BufConst;
    
    /****以下是定义的命令*****/
    char LED_ON[10] = "ON\n";  
    char LED_OFF[10] = "OFF\n";
    
    void Delay(uint16_t nCount)
    {
      /* Decrement nCount value */
      while (nCount != 0)
      {   
        nCount--;
      }
    }
    
    /*************
    * 初始化串口UART1
    **************/
    void initUart1()
    {
      // 串口设置
      UART1_DeInit();
      // 9600波特率,8位数据位,一位停止位,
      UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);//UART1_MODE_TX_ENABLE);
      // 使能串口接收中断
      UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
    }
    
    /*********
    * 端口配置
    **************/
    void initGPIO(){
      // LED灯的GPIO口初始化
      GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
      GPIO_WriteHigh(GPIOB , GPIO_PIN_5); // 关测试灯
      
    }
    
    /*****************
    *  程序入口
    *******************/
    void main(void)
    {
    
      // 初始化系统时钟,
      CLK_HSICmd(ENABLE);
      CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
      //内部时钟16M,8分频
      CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);    
      
      initGPIO();
       
      initUart1();
      
      enableInterrupts(); // 使能中断
           
      while (1)
      {    
        if(Usart1_bufStart_or_bufSotp)
        {
           Usart1_bufStart_or_bufSotp = 0 ; 
                  
           if(strcmp(Usart1BufData,LED_ON)==0)
           {
              GPIO_WriteLow(GPIOB , GPIO_PIN_5);         
           }
           else if(strcmp(Usart1BufData,LED_OFF)==0)
           {
              GPIO_WriteHigh(GPIOB , GPIO_PIN_5);
           }
                  
           Usart1BufConst = 0 ;
           memset(Usart1BufData,0,10);//清0数组   
        }    
      }
    }
    
    
    #ifdef USE_FULL_ASSERT
    
    /**
      * @brief  Reports the name of the source file and the source line number
      *   where the assert_param error has occurred.
      * @param file: pointer to the source file name
      * @param line: assert_param error line source number
      * @retval : None
      */
    void assert_failed(u8* file, u32 line)
    { 
      /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    
      /* Infinite loop */
      while (1)
      {
      }
    }
    #endif

     项目中还有个it.c文件,内容如下:

    /* Includes ------------------------------------------------------------------*/
    #include "stm8s.h"
    
    /* Private typedef -----------------------------------------------------------*/
    
    extern unsigned char Usart1_bufStart_or_bufSotp;
    extern char Usart1BufData[10];
    extern char Usart1BufConst;
    
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    /* Private function prototypes -----------------------------------------------*/
    /* Private functions ---------------------------------------------------------*/
    /* Public functions ----------------------------------------------------------*/
    
    
    #if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \
        defined(STM8S003) ||  defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903)
    /**
      * @brief UART1 TX Interrupt routine.
      * @param  None
      * @retval None
      */
     INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
     {
        /* In order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction.
        */
     }
    
    
    /**
      * @brief UART1 RX Interrupt routine.
      * @param  None
      * @retval None
      */
     INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
     {
        /* In order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction.
        */  
         
         Usart1BufData[Usart1BufConst]=UART1_ReceiveData8();
         UART1_SendData8(UART1_ReceiveData8()); 
         // 收到了结束符号
         if(Usart1BufData[Usart1BufConst]==0x0A)
         {
           Usart1_bufStart_or_bufSotp=1;    
         }
         else
           Usart1BufConst++;
       
          UART1_ClearITPendingBit(UART1_IT_RXNE); // 清除标志位
          
     }
    #endif /*STM8S208 or STM8S207 or STM8S103 or STM8S903 or STM8AF62Ax or STM8AF52Ax */
    
    /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

    主要代码就是这些了,注释中已经写的很清楚了。

    4.接好线看下运行的效果 。

    过后放上一个视频连接,实在因为gif的效果不明显。 

     

    好了,STM8蓝牙控制LED亮灭的功能基本实现了,下一遍将实现蓝牙和STC89单片机的联调。

    当这个系列结束之后我会将代码一并上传到Git。博文更新的话,可能因为工作原因会断断续续,希望大家见谅。如果觉得有帮助或者有设么其他好的建议可以在博文下留言,赞赏码没有别的意思,这是个知识付费的时代,可能付费了才会更珍惜学习的不易,当然也是作者创作的动力所在,哈哈。


     

     

     

     

    展开全文
  • 不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。此次学习用到...
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) (4)安卓手机与蓝牙模块联合调试(四)—— 单片机数据...
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) (4)安卓手机与蓝牙模块联合调试(四)—— 单片机数据...
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...
  • 要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机和蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数。设置好蓝牙的名称、密码、波特率等待。 step1: 连接usb转ttl模块和蓝牙模块,把两个模块的VCC口相连...
  • 使用蓝牙模块也有段时间了,更新…… 现在市面上用的蓝牙芯片大部分是ble的了,也就是低功耗透传模式。最近用到蓝牙SOC(片上系统),和大家分享下。 我们平时用蓝牙,一般是单片机的串口与蓝牙的串口连接,实现...
  • 蓝牙模块与单片机连接,如何用单片机控制蓝牙模块
  • 51单片机蓝牙模块的串口51单片机蓝牙模块的串口通信C程序通信C程序
  • 请问HC05 蓝牙模块怎么 让手机与单片机通信 程序要怎写 蓝牙模块要怎么设置
  • 蓝牙舵机篇 引语 本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波模块的测距程序,第三篇会将两者组装在一起。最终目的:通过手机连接蓝牙向单片机发送信号,...
  • 基于CC2541蓝牙模块单片机的串口通信,包括 APP与源码、PCB封装、串口调试助手工具等
  • HC-06蓝牙模块:1、低电压3.3v工作,蓝牙模块RXD接51单片机TXD(P3.1),蓝牙模块TXD接单片机RXD(P3.0)。注意:给51单片机烧写程序时不要先连接超声波模块。烧写完程序后再接线。2、学习单片机蓝牙模块通信,实质...
  • 之前两篇都是在说与手机的连接,连接方法,和主动配对连接,都是手机与手机的操作,做起来还是没问题的,但是最终的目的是与单片机蓝牙模块的通信。   下面是到目前为止尝试的与单片机的通信方法,没有成功,但是...
  • 蓝牙模块怎么与stm32单片机通信,可以通过蓝牙模块发送数据给单片机
  • ·简介:由于业务关系,需要开发一个向单片机发送数据的应用,不过由于需求很简单,只  需要发送数据即可,所以该dome的功能只有发送数据功能,并没有对输入的数据  做进一步的处理 这里有蓝牙开发的基本...
  • 蓝牙模块HC05和单片机连接的基本设置。源码在下一个文件中。
1 2 3 4 5 ... 20
收藏数 2,886
精华内容 1,154
关键字:

蓝牙模块控制单片机