蓝牙单片机通信hc05_蓝牙hc程序(实现app与单片机stm32f103的通信) - CSDN
  • 蓝牙(Bluetooth):是一种无线技术标准,可实现固定设备、移动设备...蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案, 蓝牙可连接多个设备,在与单片机连接使用也得到了广泛应用。

    蓝牙(Bluetooth):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案, 蓝牙可连接多个设备,在与单片机连接使用也得到了广泛应用。

    1、端口连接
    与单片机串口连接时,两者之间 相互可以读写。例如51给HC-05传递数据,即51向HC-05写数据,HC-05从51读取数据,那么串口连接处51的写端P3.1引脚(TXD)就与HC-05读端(RXD)相连,反之蓝牙向51传递数据时,HC-05写端(TXD)T与51的读端P3.0引脚(RXD)相连,所以通常为以下连接方式即可实现数据传送。
    注意:只有正确连接读写端才能正常通信。
    端口连接
    2、电平选择
    一般情况下,蓝牙不能正常工作的原因出在电源这得可能比较小,大多数蓝牙模块电压范围比较大,像HC-05蓝牙模块一般在3.3~6V,单片机电源都在这个范围内。不过不排除部分3.3V蓝牙,所以在连接电源前一定按照技术手册,连接正确电源,并保证正负极不能接反。
    3、蓝牙配置
    设置决定了蓝牙模块自动连接工作后的角色,主角色(Master)会自动搜索配对连接,从角色(Slave)只被动接受连接,不会主动搜索,回环角色(Loopback),属于被动连接,接收远程蓝牙主设备数据并将数据原样返回给远程蓝牙主设备。如果两个HC05模块要建立连接,其中一个必须设置为主角色,另外一个可以设置为从角色或回环角色,如果一个HC05模块和电脑蓝牙或者手机蓝牙通信,一般电脑或手机可以主动建立连接,所以HC05可以使用从角色,出厂默认也是设置为从角色的。
    4、AT指令
    在控制电平信号下,可以对蓝牙的一些特性参数进行查询课更改。
    AT+XXX? //查询参数XXX
    AT+XXX=mmm //设置参数XXX为mmm
    例如: 命令: AT+NAME?\r\n //查询蓝牙名称
    返回:+NAME:ChunyuY19 //蓝牙名称为:ChunyuY19
    命令: AT+NAME=Xidian\r\n //设置蓝牙名称为:Xidian
    返回: OK //返回提示符:OK
    命令: AT+PSWD?\r\n //查询蓝牙配对密码
    返回:+PSWD:1234 //配对密码为:1234
    命令: AT+ROLE?\r\n //查询蓝牙模式
    返回:+ROLE:0 //0:从角色,1:主角色,2:回环角色
    注意!!每行命令必须以更多AT命令\r\n结尾,更多的AT指令一般技术手册都会给出,活在网上查询。
    5、实现基于STC51单片机的蓝牙与手机通信
    首先,给单片机载入串口通信程序,注意!!一般下载程序时单片机与蓝牙断开,避免因蓝牙占用单片机串口导致程序无法烧写。载入程序后,按照上图给出的读写连接方式连接,并给给单片机及HC-05连接合适电源,一般都用单片机板子上电源。手机端需先在浏览器上搜索并下载“蓝牙串口调试助手”。
    上电后,蓝牙指示灯一般进入快闪状态,即等待蓝牙连接(从模式),用手机搜索并连接单片机上的蓝牙,配对密码默认为1234。配对成功就可以发送数据给蓝牙,如下图,至此基于STC51单片机的蓝牙与手机通信成功。

    因为毕业设计需要用到无线传输,第一次接触蓝牙串口通信,芯片用的HC-05。调试了一天,复制了不少例程,一直无解认为是程序问题。直到看到这篇文章才发现自己引脚就接错了……
    一定记住单片机TX接蓝牙RX,单片机RX接蓝牙TX。一定记住单片机TX接蓝牙RX,单片机RX接蓝牙TX。一定记住单片机TX接蓝牙RX,单片机RX接蓝牙TX。重要的事说三次。

    附基于STM32的HC-05串口通信框架代码

    #include "stm32f10x.h"    
    #include "stm32f10x_rcc.h"    
    #include "stm32f10x_gpio.h"    
    #include "stm32f10x_usart.h"   
    #include "stm32f10x_crc.h"  
    #include "system_stm32f10x.h"   
    #include "stdio.h"   
      
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  
      
    void RCC_Configuration(void);    
    void GPIO_Configuration(void);   
    void USART_Configuration(void);   
    void delay_ms(u16 time);  
    void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data);  
    void UART_PutStr (USART_TypeDef* USARTx, uint8_t *str);
    int Putchar(int c);
      
    int main()  
    {  
        SystemInit();  
        RCC_Configuration();    
        GPIO_Configuration();     
        USART_Configuration();
    		GPIO_SetBits(GPIOB,GPIO_Pin_5);		
        while(1)  
        {  
          UART_PutStr(USART1, "hello world!"); 
    			delay_ms(1000);			
        }   
          
    }  
    void RCC_Configuration(void)      
    {       
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);       
    }     
        
    void GPIO_Configuration(void)      
    {      
      GPIO_InitTypeDef GPIO_InitStructure;      
          
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           
      GPIO_Init(GPIOA, &GPIO_InitStructure);                
          
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        
      GPIO_Init(GPIOA, &GPIO_InitStructure);                 
           
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    
      GPIO_Init(GPIOB, &GPIO_InitStructure);     
    }  
    void USART_Configuration(void)
    {    
           
        USART_InitTypeDef USART_InitStructure;                   
      
        USART_InitStructure.USART_BaudRate = 9600;                    
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
        USART_InitStructure.USART_StopBits = USART_StopBits_1;       
        USART_InitStructure.USART_Parity = USART_Parity_No;        
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
        USART_Init(USART1,&USART_InitStructure);                    
        USART_Cmd(USART1,ENABLE);    
    }  
    void delay_ms(u16 time)       
    {      
      u16 i=0;      
      while(time--)       
      {      
        i=12000;      
        while(i--);      
      }      
    }   
    int Putchar(int c)                                             
    {    
        if (c == '\n'){putchar('\r');}                                
        USART_SendData(USART1,c);                                  
    		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){};
        return c;                                                       
    }   
    void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data)  
    {  
        USART_SendData(USARTx, Data);  
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}  
    }  
    void UART_PutStr (USART_TypeDef* USARTx, uint8_t *str)    
    {    
        while (0 != *str)    
        {    
            UART_PutChar(USARTx, *str);    
            str++; 		
        }    
    }  
    
    

    程序员开源交流QQ群 792272915

    展开全文
  • 因为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是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。

     

    展开全文
  • 蓝牙模块HC05单片机连接的设置测试源代码
  • 请问HC05 蓝牙模块怎么 让手机与单片机通信 程序要怎写 蓝牙模块要怎么设置
  • 在51单片机上的串口,连接到HC-05单片机模块,通过向蓝牙发送数据,从而与单片机进行数据传输,可以在手机蓝牙串口上,进行单片机控制,例如蓝牙
  • 51单片机 HC05蓝牙模块

    2019-07-11 13:14:21
    一、注意事项 1、烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写...1、硬件:单片机STC89C52RC开发板,蓝牙模块HC05 2、软件:串口工具SSCOM3.3,手机蓝牙客户端 手机蓝牙客户端链接:http://mobile.baidu.co...

    一、注意事项

    1、烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响。

    2、执行HC05集命令时,均以\r\n结尾。串口中断若选择“发送新行”时,不用添加\r\n。原理相同。

    二、准备软硬件

    1、硬件:单片机STC89C52RC开发板,蓝牙模块HC05

    2、软件:串口工具SSCOM3.3,手机蓝牙客户端

         手机蓝牙客户端链接:http://mobile.baidu.com/simple/item?docid=5014650&source=aladdin@wise_app_13@button&from=1015530c&ala=wise_app@strong@蓝牙串口调试助手&go_bfe=1action=content&action=content

    三、蓝牙模块HC05端口定义(6引脚)

    state——蓝牙连接状态,未连接输出低,连接后输出高

    TX——信号发

    RX——信号收

    GND——地

    +5V

    EN——使能端,需要进入AT模式时接3.3V,接单片机i/o引脚即可,高电平

    四、进入AT模式进行参数和状态的设置

    两种工作模式:命令响应工作模式和自动连接工作模式

    命令响应工作模式(AT模式)

    state——接任意单片机i/o

    rx——接usb转串口的tx端,P3^0

    tx——接usb转串口的rx端,P3^1

    gnd——接地

    5v——接5V电

    en——接任意单片机i/o,高电平

    1、需要接通en,并给高电平

    2、通信线路:电脑-->usb转串口-->hc05蓝牙模块(电脑与蓝牙模块间进行串口传输)

    3、按住蓝牙模块的key键不松,单片机开发板上电,蓝牙模块指示灯进入慢闪状态,说明进入AT模式

    4、通过电脑串口工具可以设置蓝牙的工作参数与状态

    5、执行电脑串口工具SSCOM3.3,设置比特率38400,8位数据,1位停止位

    6、发送测试指令AT\r\n,如果返回OK表示通信正常。

    7、可以执行自己所需的命令了。

    8、发送恢复默认状态指令AT+ORGL\r\n,如果返回OK表示设置成功。

    出厂默认状态:

    ①.设备类:0

    ②.查询码:0x009e8b33

    ③.模块工作角色:Slave Mode

    ④.连接模式:指定专用蓝牙设备连接模式

    ⑤.串口参数:波特率—38400bits/s;停止位:1位;校验位:无

    ⑥.配对码:“1234”

    ⑦.设备名称:“H-C-2010-06-01”

    ..

    9、设置波特率9600与单片机串口匹配,1停止位,0校验位

    · 执行AT+UART=9600,1,0\r\n。返回OK

    10、查看UART状态是否更改成功,执行AT+UART?,返回+UART:9600,1,0  OK

    11、参数状态设置完毕,可断电,准备进入工作模式

    五、进入自动连接工作模式进行蓝牙匹配

    state——接任意单片机i/o

    rx——接单片机的tx端,P3^1,与命令相应模式相反

    tx——接单片机的rx端,P3^0

    gnd——接地

    5v——接5V电

    en——可不接

    1、不需要接通en

    2、通信线路:手机蓝牙控制端-->hc05蓝牙模块-->单片机

    3、单片机开发板上电,蓝牙模块指示灯进入快闪状态,说明进入自动连接工作模式

    4、手机开蓝牙,即可搜到蓝牙模块,连接

    5、打开手机端蓝牙串口工具,连接成功,蓝牙模块指示灯进入双闪状态

    6、至此连接成功,准备发送数据

     

    #include <reg52.h>

    void main(void)

    {

    while(1);

    }

    设置参数状态,匹配测试用上述几行代码即可。

     

    五、利用蓝牙向单片机发送数据

    1、通信线路:手机蓝牙控制端输出字符‘0’-->hc05蓝牙模块-->单片机接收字符‘0’(单片机与蓝牙模块间进行串口传输)-->单片机控制灯1亮

    2、通信线路:手机蓝牙控制端输出字符‘1’-->hc05蓝牙模块-->单片机接收字符‘1’(单片机与蓝牙模块间进行串口传输)-->单片机控制灯2亮

    3、通信线路:手机蓝牙控制端输出其它字符-->hc05蓝牙模块-->单片机接收该字符(单片机与蓝牙模块间进行串口传输)-->单片机控制灯3亮

    4、该程序源码

    #include <reg52.h>

    typedef unsigned char u8;
    typedef unsigned int u16;
    u8 r_buf; //蓝牙接收到的字符存储缓冲区
    sbit led1 = P1^0; //灯1,当接收字符0时,灯1亮
    sbit led2 = P1^1; //灯2,当接收字符1时,灯2亮
    sbit led3 = P1^2; //灯2,当接收其它字符时,灯3亮
    sbit led4 = P1^3; //蓝牙连接状态灯,当蓝牙连通时,灯4亮
    sbit state = P3^6; //蓝牙连通的状态标志位
    void delay(u16 z) //延迟函数
    {  
    u16 x,y;  
    for(x=z;x>0;x--)   
    for(y=125;y>0;y--); 

    void InitUART() //串口初始化9600
    {
    //初始化串口定时器9600
    TMOD = 0x20;
    PCON = 0x00;
    SCON = 0x50;   
           TH1 = 0xFD;
           TL1 = 0xFD;
    TR1 = 1;
    ES = 1;
    EA = 1;
    }
    void SendOneByte(unsigned char c) //发送字符函数
    {
        SBUF = c;
        while(!TI);
        TI = 0;
    }
    void main(void)
    {
        InitUART();
    led1 = 1;
    led2 = 1;
    led3 = 1;  
    led4 = 1;
    r_buf = '2';
    while(1)
    {
    if(state == 1)//蓝牙连通状态判断
    {
    led4 = 0;    //如果蓝牙匹配成功,灯4亮
    }
    else
    {
    led4 = 1;    //如果蓝牙匹配不成功,灯4不亮
    }
    }
    }
    void UARTInterrupt(void) interrupt 4 //串口接收字符
    {
        if(RI)
        {
            RI = 0;
            //add your code here!
    r_buf = SBUF;
    if(r_buf == '0')//如果为字符‘0’,灯1亮
    {
    led1 = 0;
    delay(1000);
    led1 = 1;
    }
    if(r_buf == '1')//如果为字符‘1’,灯2亮
    {
    led2 = 0;
    delay(1000);
    led2 = 1;
    }
    else //如果为其它字符,灯3亮
    {
    led3 = 0;
    delay(1000);
    led3 = 1;
    }
       SendOneByte(r_buf);//回发该字符
        }
    }




    转载于:https://www.cnblogs.com/gundan/p/8118902.html

    展开全文
  • STC89C52通过HC-06蓝牙模块与Android手机通信   如需转载请标明出处:http://blog.csdn.net/itas109  QQ技术交流群:129518033  2017-11-04补充 注意问题: 1.确保上位机波特率为9600 2.确保下位机的波特...

    STC89C52通过HC-06蓝牙模块与Android手机通信

     

    如需转载请标明出处:http://blog.csdn.net/itas109 

    QQ技术交流群:129518033

     2017-11-04补充

    注意问题:

    1.确保上位机波特率为9600

    2.确保下位机的波特率为9600,下位机的晶振应该为11.0592MHz

    3.本教程中接收指令的是字符1、2、3,不是16进制的0x01、0x02、0x03

    4.可能跟上拉电阻有关系,但是不少人反应不需要上拉电阻,时间长了我也不知道了

     

    环境
             1、任意单片机开发板即可(当时用的芯片STC90C516RD+),约定为下位机
              2、无线蓝牙串口透传模块 HC-06从机
              3windows xp操作系统
              4、Android智能手机(蓝牙串口通信助手软件),约定为上位机

    二、连接的部分电路图(有集成板子的直接插上就可以了,但是要注意若单片机的TXD无上拉能力需要加上拉电阻)

          上拉电阻的阻值有人问我,我当时用的是1KΩ。

     

    三、下位机测试程序

    (各位大神如果分数比较多可以赞助我一下,就1个积分)

    程序地址(整个工程):http://download.csdn.net/detail/itas109/5430553

          

       /***********************************************************
    
    STC90C51RD+与HC-06蓝牙连线:
    
             蓝牙  STC90C51RD+
    
             RXD    TXD
    
             TXD    RXD
    
    其他连线:
    
             P2.0、P2.1、P2.3分别接一个指示灯
    
     
    
    !!!!
    
    !!!!注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
    
    !!!!
    
     
    
    手机采用蓝牙串口通信助手
    
    最后已改用Android自编蓝牙通信软件
    
                                                   By itas109
    
                                                   http://blog.csdn.net/itas109
    
    ***********************************************************/
    
    #include <reg52.h>
    
    #include <intrins.h>
    
    unsigned char tmp;
    
    unsigned int c=0;
    
     
    
    sbit led1=P2^0;                      //指示灯0
    
    sbit led2=P2^1;                           //指示灯1
    
    sbit led3=P2^3;                           //指示灯3
    
     
    
    void init();   //串口初始化
    
    void send(unsigned char a);     //单字节发送函数
    
    void ctrl(); //接收处理函数
    
     
    
    void main()
    
    {
    
                       init();
    
              while(1)
    
              {         
    
                      if(RI==1)                     //是否有数据到来
    
                      {
    
                       RI = 0;
    
                      tmp = SBUF;                   //暂存接收到的数据
    
                                           ctrl();
    
                                           }      
    
              }
    
    }
    
     
    
     void init()        //串口初始化
    
     {
    
                       ES=0;                                                                       //关中断
    
                         SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,
    
                                                                                                             //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变
    
     
    
                         TMOD = 0x20;                        //定时器1工作于方式2,8位自动重载模式,用于产生波特率
    
              TH1=TL1=0xFD;                       //波特率9600 (本次测试采用晶振为11.0592)
    
              
    
              PCON &= 0x7f;                       //波特率不倍增
    
              TR1 = 1;                                                                  //定时器1开始工作,产生波特率
    
                                                                                                             //发送标志位置0
    
                         TI=0;                                                                        //接收标志位置0
    
                         RI=0;
    
                         
    
                         //EA=0;
    
                   ES=1;
    
     
    
     
    
              led1=0;                                    //初始化设置3个指示灯全亮
    
                         led2=0;
    
                         led3=0;
    
     }
    
       
    
    void send(unsigned char a)      //单字节数据发送
    
    {                                                                //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
    
             TI=0;         
    
             SBUF=a;
    
             while(TI==0);
    
             TI=0;
    
     
    
             if(c%2)                                           //发送指示灯标志,每接收一次,此灯亮灭交替
    
              led3=1;
    
             else
    
              led3=0;
    
             c++;
    
    } 
    
     
    
    void ctrl()                      //接收处理函数
    
    {
    
                                         switch(tmp)
    
                                           {
    
                                                case '1':
    
                                                            led1=1;                           //收到字符1,指示灯0灭
    
                                                            send(tmp);
    
                                                            break;                                           
    
                                                   case '2':                                         //收到字符2,指示灯1灭
    
                                                             led2=1;
    
                                                             send(tmp);
    
                                                             break;
    
                                                   case '3':                                   //收到字符3,指示灯0、1亮
    
                                                             led1=0;
    
                                                             led2=0;
    
                                                             send(tmp);
    
                                                             break;
    
                                                   case '4':                                         //收到字符4,指示灯0、1灭
    
                                                              led1=1;
    
                                                              led2=1;
    
                                                              send(tmp);
    
                                                              break;
    
                                                   case '5':                                         //收到字符5,指示灯3亮
    
                                                            led3=0;
    
                                                            send(tmp);
    
                                                            break;
    
                                                   default:                   //其他,灯全灭
    
                                                              led1=1;
    
                                                              led2=1;
    
                                                              led3=1;
    
                                                              send(tmp);
    
                                           }
    
    }
    
    


    四、上位机软件可以用蓝牙串口通信助手软件

     

     

    觉得文章对你有帮助,请扫描二维码捐赠给博主,谢谢!

     

     

    如需转载请标明出处:http://blog.csdn.net/itas109 

    QQ技术交流群:129518033

     

     

    展开全文
  •  HC-05蓝牙模块为主从一体的蓝牙模块,并可与手机实现实时的通信。将单片机的串口通信通过HC-05进行扩展从而实现无线通信,更可使用手机来控制单片机完成工作。 要完成单片机与Android手机的无...

      51单片机是市面上比较普及的单片机种类,同时也深受广大电子爱好者的青睐。在51单片机的众多功能中串口通信占据了重要的地位,通过串口通信,我们可以实现51单片机与其他设备的互联,增加了学习的趣味性。

      HC-05蓝牙模块为主从一体的蓝牙模块,并可与手机实现实时的通信。将单片机的串口通信通过HC-05进行扩展从而实现无线通信,更可使用手机来控制单片机完成工作。

     要完成单片机与Android手机的无线通信,首先我们要在写好单片机的控制程序,因为HC-05只是对串口通信功能进行延伸, 并不能独立完成通信。

     编写串口通信的程序中首先我们要对串口的配置进行初始化

    void UartConfigurationInit()
    {
        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;       //开总中断
    }

    配置好串口后,在编写发送函数前我们需要对串口发送数据的原理有个了解:

    转码过程:

    发送十进制数:查询ASCII码表后发送相应的字符 ,如SBUF=65;则会收到字符‘A’;

    发送字符:原样输出

    发送字符串:强行对SBUF传递字符串会造成输出乱码,得不到想要的结果。想要发送字符串则需要运用指针,每次发送时发送指针指向的那个字符,因为发送频率很快,最后输出时组合起来还是一条字符串。

    实现整数转为字符串发送:

       0x30对应的字符‘0’,当我们要发送一个整数时,需要将该整数按最高位到最低位得到顺序依次发送,发送时需要在原始数据上加上0x30或者48,则会输出相应的数字字符。


    字符发送函数:

    void PostChar(uchar character)  
    {     
    	    SBUF=character;   //发送单个字符
    	    while(!TI);TI=0; //发送完成标志 
    }

    字符串的发送需要依靠字符发送函数来实现:

      这里加了一个延时函数delay(),因为在实际与手机通信中我发现发送速度过快会产生严重的数据丢失,因此加上一个延时可以较好的保证数据的准确度,具体延时数据根据大家实际需要调整。

    void  PostString(uchar *p)  
    {  
    	    while(*p)  	   //若指针指向的地址为空,则跳出循环
    	    {  
    	        PostChar(*p); //指针第一次默认指向首地址
    			delay(20);  //延时,作用为提高发送准确度
    	        p++;  
    	    }	  
    }

    十进制数据发送:

     因为十进制数据不能直接发送,所以要先加上0x30或者48后再转为字符型。

    void IntConversionChar(uint number)
    {
           uint model;	//模
           uint numberByte; //十进制数据不同位上的值
    
         for(model=1000;model>=1;model=model/10) //model的取值根据实际需要选择,选择过大会浪费资源
    
          {
                numberByte = number/model;	//相除取整
    			//当取到整数数据的最高位时,将其加上0x30或者48并转为字符型后发送
                if(numberByte >=1 ) PostChar((uchar)(numberByte%10+0x30));
          		//if(numberByte >=1 ) PostChar((unsigned char)(numberByte%10+48));
    	  }	
    }

    以上就是51单片机使用HC-05蓝牙模块与Android手机通信的程序的要点和原理。

    完整程序:

    https://download.csdn.net/download/qq_41570228/10398277



    展开全文
  • Android通过蓝牙接收单片机发来的数据。
  • 手机打开蓝牙可以搜索到蓝牙芯片并可以连接,连接码为1234。系统开启后数码管全0,继电器低电平,LED灯不亮。 手机连接到系统后,扫描二维码,得到一串数字后,输入该串密码,得以解锁继电器。输入密码,支持断点续...
  • d手机通信程序 程序完成了51单片机和手机的字符和数字通信,并有完整的注释,原理介绍可查看我的其他文章 前找了很久才找到了,传上来更大家共享下,希望对大家有帮助,欢迎下载或者永久保存。
  • 做课程设计之时,用到了蓝牙通信,本人使用STC15单片机的最小系统进行主从蓝牙之间的通信蓝牙配置(配置方法见上一篇文章)好了之后,在串口上可以通信,但到了最小系统就是不能通信,经过多方查找原因,最终发现...
  • 最近用89c51单片机HC05蓝牙模块进行了匹配和数据对接。 总体上匹配成功,数据也可以发送接收成功,但是发现一个奇怪的问题,有时候发送一个一字节的数据,低四位正常接收,高四位接受异常。 比如发送0x10 接受为0...
  • 基于51单片机HC-08蓝牙程序,初学51可以试做一下蓝牙遥控小车。
  • 单片机传来多字节数据,想让前一个字节显示在一个textview,后一个字节显示在另一个texiview里该怎么弄呢
  • 蓝牙HC05是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一...
  • 通过蓝牙助手(或串口调试助手)调试,HC-05与PC机能正常通信; 与89C51相连接,HC-05也能接收到数据,但接收到的是乱码。 二、解决办法 波特率一致(我设置的是4800); 波特率加倍(不知道为啥要加倍,或者可能是...
  • 打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机...
  • 程序完成了51单片机和手机的字符和数字通信,并有完整的注释,原理介绍可查看我的其他文章。
1 2 3 4 5 ... 20
收藏数 539
精华内容 215
关键字:

蓝牙单片机通信hc05