精华内容
参与话题
问答
  • 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是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。

     

    展开全文
  • 51单片机蓝牙小车

    千次阅读 多人点赞 2019-02-25 20:41:23
    51单片机蓝牙小车(是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。) 摘要 本次设计选择基于蓝牙遥控的多功能智能小车为对象。选用STC98C52RC单片机作为主控芯片,电机驱动采用L293N ,...

     

    51单片机蓝牙小车(是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。)

     

    摘要   本次设计选择基于蓝牙遥控的多功能智能小车为对象。选用STC98C52RC单片机作为主控芯片,电机驱动采用L293N ,电源部分采用两节3.7V锂电池供电.采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车.

     

    关键词  

    51单片机

    L298N_电机驱动

    蓝牙遥控

     

    目录

    1. 前言

    1.1.  系统研究背景

    1.2. 系统研究的意义和目的

    2. 系统概述

    2.1.  系统的结构

    2.2.  系统的功能

    2.3.  开发环境

    3.  系统实现

    3.1. 相关技术技术

    3.2.  硬件实现

    3.3.  软件实现                  ​

    源程序


    1. 前言

    1.1. 系统研究背景

            蓝牙属于短距离内进行无线控制和收发的通信技术,伴随着科技的飞跃性发展,也让蓝牙找到了发展的空间,它可以代替和取代落后的数字化硬件设备之间繁琐的电缆连接。在蓝牙创造的初期,没有人预料到蓝牙会有如此大的潜力和前景,而现在的发展也是完全超出了我们的预期,因为蓝牙的安全性高,制造成本低廉和所消耗的功率也是同类产品中最低的,所以被很多人使用,越来越受到了广大消费者的欢迎,基于蓝牙技术的产品也在不断的更新和投入市场。

           蓝牙技术是近年来出现的新技术是一种短距离无线通信和信息传输的新型通讯科技,它使数据线的硬件设备接收更方便快捷。它可以广泛应用于世界各地,是一个蓝牙设置一个通用的范围,频率调制技术的使用,以防止外部干扰和多一些。低成本,低功耗和小辐射,和加密设置,让蓝牙的安全性更高;应用范围广,这些特点使得蓝牙技术被广泛的应用在我们日常生活中的蓝牙也支持一对一和一对多传输的通信连接,和多个蓝牙成为微网,也有网络的特点。

         在现在的智能时代,小车智能控制,方便了人们的使用。在51单片机的基础下,通过蓝牙来控制小车的驾驶。



    1.2. 系统研究的意义和目的

            因为无线技术的广泛使用,我们在研究无线和有线通信技术的方法中了解到蓝牙系统的小区域性有很大的技术突破,在国际上也得到了广泛的采纳,在市场上也有很大的需求。这也使蓝牙技术的发展成为了趋势之一,蓝牙可以发送和接受语音和数据,满足了大多数人的需求,它也融合了其他相关产品的特点,也是这样技术变得更多样性。然而,蓝牙的安全性不足,而且在小区域范围内的一点对多点的通信受到了很大的限制,这些都是其本身需要改进和完善的

          可以使人们更方便,更简单的控制小车。实现了无线控制小车,摆脱了有线控制的不方便,更智能。


    2. 系统概述

    2.1.  系统的结构

                                                                       系统框图

     

     

    2.2.  系统的功能

    51单片机的基础下,通过蓝牙来控制驱动,此驱动能把5~12V的电压,一部分给小车轮子转动,一部分通过降压,稳压,最终降为5V来供给此驱动,单片机和传感器供电。

     

    2.3.  开发环境

    AT89C5RC单片机:

              AT89C52是一种8位单片机,它是在MCS-51单片机系列上加强了一些功能后升级得到的产物。它的作用基本上就是把外界的数据和命令在中断和时钟的帮助下,在自身内部储存器上把使用者的数据进行处理。AT89C52 由8位的内部处理器,内部数据储存器(RAM,有256个字节)内部储存器有8K的大小,输入和输出双向口有32个,16位的定时器和5个两级中断,全双工串行通信口一个和时钟电路组成。

             AT89C52能够自主地执行给它的指令,也就是你把所需要的指令写在单片机的内部储存器上,它会一步步执行。AT89C52可以在功耗特别低的情况下工作,就是设置成空闲选择和掉电模式两种状态来实现低功耗。

     

                                                                         AT89C52

           单片机与外界的通讯是依靠它自身的I/O 口进行的,对单片机I/O 口的控制就是对单片机的控制。I/O 口的存在不仅可以实现数据的传输,还可以改变电平和信号的性质,最重要的一点就是I/O 口可以实现与外部不同电路的连接来使单片机工作。

             AT89C52单片机上我们通常使用的是4个独立的双向通用I/O 口:P0口、P1口、P2和P3口。由于外部设备的工作速率比较慢或者很快的时候,我们可以采用同步传送的方式,而单片机存在的异步传送是为了更加简练的和硬件连接进行传出。也可以通过中断传送和DMA传送来完成。AT89C52单片机还可以实现外部接口单独的编址和外部端口和存储器的统一编制两种方式。AT89C52单片机上一共有32个I/O 口,不同的I/O 口实线的作用和运行的方式都有其自己的方式,我也要通过这次课程设计,更好地了解,更熟练的运用。


    3.  系统实现

    3.1. 相关技术技术

    蓝牙技术,驱动模块,

     

    3.2.  硬件实现

    HC-06蓝牙模块

    其TX接单片机的RX,RX接单片机的TX,VCC接5V(或3.3V),GND接单片机的地。HC-06蓝牙模块是通过一款手机APP(蓝牙串口助手)作为中间媒介,在蓝牙串口助手发送相关的数据到串口,串口再把相关信息送到蓝牙模块,蓝牙模块再把相关信号送到单片机中。

                                                                                  HC-06蓝牙模块


                                                          HC-06蓝牙模块和51单片机连接



     

    L298N电机驱动模块,

    该该电机可以驱动2路直流电机,使能端ENA,ENB,为高电频有效,

    通过单片机的输入信号给IN1和IN2来控制左轮,输入信号给IN3和IN4来控制右轮

    IN1和IN2,分别给0,1  :正转

     IN1和IN2,分别给1,0  :反转

    IN1和IN2,分别给1,1 :停止

    IN1和IN2,分别给0,0  :停止

    IN3和IN4,分别给0,1  :正转

    IN3和IN4,分别给1,0  :反转

    IN3和IN4,分别给1,1 :停止

    IN3和IN4,分别给0,0  :停止

     

    L298N的主要引脚功能如下:

    +5V:芯片电压5V;

    VCC:电机电压,最大可接50V;

    GND:共地接法;

    Output1—Output2:输出端,接电机1;

    Output3—Output4:输出端,接电机2;

    EN1、EN2:高电平有效,EN1、EN2分别为 IN1和IN2、IN3和IN4的使能端;

    Input1~ Input4:输入端,输入端电平和输出端电平是对应的;

      

                                                                      L298N



    3.3.  软件实现
                     

                                                                         程序流程图

     

                

     

    51单片机,源程序:

    sbit in1 = P1^0;//左电机
    sbit in2 = P1^1;//左电机
    sbit in3 = P1^2;//右电机
    sbit in4 = P1^3;//右电机
    
    char i;
    
    /*前进*/
    void forward()
    {
    
        in1=1;
        in2=0;
        in3=1;
        in4=0;
    }
    
    /*后退*/
    void back()
    {
        in1=0;
        in2=1;
        in3=0;
        in4=1;
    }
    
    
    
    /*左转*/
    void left()
    {
        in1=1;
        in2=1;
        in3=1;
        in4=0;
    }
    
    /*右转*/
    void right()
    {
        in1=1;
        in2=0;
        in3=1;
        in4=1;
    }
    
    /*停止*/
    void stop()
    {
        in1=1;
        in2=1;
        in3=1;
        in4=1;
    }
    
    
    void main (void)
    {
          TMOD=0x20;                         //设置T1为工作方式2
          TH1=0xfd;                        //装入初值,比特率为9600bps
          TL1=0xfd;
    
          TR1=1;                              //开启T1
          REN=1;                             //接收允许
    
          SM0=0;                             //方式1
          SM1=1;
    
          EA=1;                               //开全局中断
          ES=1;                                //开串口中断
    
    while(1)
    
        {
            i=SBUF;//SBUF为单片机接收到的数据,单片机接收到的数据都存放在SBUF里;
    
            RI=0;
    
            if (i==0x02){forward();}     //如果蓝牙助手发送0x02,小车前进
    
            if (i==0x08){back();}        //如果蓝牙助手发送0x08,小车后退
    
            if (i==0x01){left();}         //如果蓝牙助手发送0x01,小车左转
    
            if (i==0x03){right();}        //如果蓝牙助手发送0x03,小车右转
    
            if (i==0x05){stop();}        //如果蓝牙助手发送0x05,小车停止
        }
    
    }

     

    3.4.  系统测试

    小车能实现基本功能,成功地用蓝牙控制小车。测试了一段时间,单片机工作稳定,蓝牙稳定的控制,小车较好的按照控制方向行走。

     


    4.  系统使用说明

    1.      为小车装上两节锂电池,来供电。

    2.     打开总开关,在手机端,打开一个蓝牙通讯助手(在手机应用商店可以找到下载),连接上此小车的蓝牙(HC-06),如图:

     

                                        蓝牙 HC-06模块

     

     



     

    3.     然后就可以在手机端按相应的前进,后退,左转,右转,停止等,如图:

     

                                            APP

     

    解析:前进,后退,左转,右转,停止,都对应着程序中相应的信息,如图;

    当手机端发送 0x02 给蓝牙模块,就会执行 forward()函数; 小车会向前走

    当手机端发送 0x08 给蓝牙模块,就会执行 back();函数;,小车会向后走

    当手机端发送 0x01 给蓝牙模块,就会执行 left();函数;,小车会向左走

    当手机端发送 0x03 给蓝牙模块,就会执行 right()函数;,小车会向右走

    当手机端发送 0x05 给蓝牙模块,就会执行stop()函数;,小车会停止

    具体的编辑如图:

                                              APP2

     

    最后这是小车的整体模型;

     

                                                         整体图

     

      注:上面有个RC522读卡器的,哪个是方便后面的课设,在这里,大家可以忽略哈。

    5.  总结

         本设计采用的是STC89C52RC单片机,这主要是因为该单片机的稳定性比较好和执行指令的速度很快。还可以采用其它系列的单片机。电机驱动采用L293N ,稳定电压,充足地向直流电机供电和稳定控制;电源部分采用两节3.7V锂电池供电,电压稳定,电流充足,还可以循环充电,节能环保。采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车,简单方便经过自己不断的搜索努力以及老师的耐心指导和热情帮助,本设计已经基本完成。

            过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学两年的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这两个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。  由于自身水平有限,设计中一定存在很多不足之处,敬请各位批评指正.


    6.  参考文献

    C语言程序设计 :清华大学出版社作者:谭浩强

    51单片机C语言教程:电子工业出版社 ,作者:郭天祥

     

    希望对你有帮助。

     

    为了大家方便,我上传了手机APP在网盘:https://pan.baidu.com/s/1UNjlUhUQa25K2RNW8hjwOQ

      提取码:wn7k 

     

     

     

    展开全文
  • 蓝牙控制单片机LED 的亮灭

    千次阅读 2019-10-09 19:54:15
    通过蓝牙通讯 使用手机来控制 单片机 上 LED 的亮灭。 1)硬件使用 89c52 单片机 2)BT06 蓝牙模块 3) Android 手机一部 手机 —(蓝牙连接)—> BT06 ----(串口通信)–> 单片机 -----> LED 2.蓝牙模块 ...

    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

    展开全文
  • 手机蓝牙控制单片机

    热门讨论 2012-11-18 09:28:45
    通过手机蓝牙向单片机发送数据,从而控制单片机
  • 基于蓝牙或者wifi远程控制的智能,模式有按键控制、手机控制、自动红外感应控制等,该文件为51单片机程序(Keil版)
  • ,其操作流程和使用方法简单,一种深受广大编程小镇的喜爱今天为大家介绍一种利用它开发手机APP的实战经历 ——手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android...

    目录

    (一)前期软件准备和硬件准备

    ( 二 ) 实现的思路和操作原理

    ( 三) 具体的操作方法

    MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直深受广大编程人员的喜爱,所以今天为大家介绍一个实例——手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信。 
      

    (一)前期软件准备和硬件准备

     软件准备主要是keil uvision,stc-isp-15xx-v6.85
     硬件准备主要是有一个蓝牙模块 、一个便宜的单片机 、一个蓝牙可以正常使用的手机和编程电脑 ;  蓝牙模块需要和单片机连接,具体的操作方法:VCC接VCC,GND接GND,TXD接P30,RXD接P31
      


    ( 二 ) 实现的思路和操作原理

     我们知道手机和单片机是两个互不相连的事物 ,所以要实现他们之间的通信,我们需要一个信使来充当中间媒介的作用 。而那个信使就是上面提到的蓝牙模块 。 这个蓝牙模块一方面可以接收到手机APP发送的数据并将它传达给单片机 ,另一方面单片机也可以将反馈数据通过蓝牙模块进而发送到手机App上 。这就实现了单片机和手机之间的交互通信 。 

    ( 三) 具体的操作方法


     首先我们需要  MIT Appinventor 制作一个简单的组件页面 ,具体情况如下图所示  :
     这个布局还有待优化 ,实现最基本的功能也足够了 


     接下来是逻辑层面的设计 
     [ 这个可以用来实现手机APP对蓝牙的选择连接 ]
     列表选择框(选择蓝牙)的启用为真,按钮(断开)的启用为假。选择蓝牙时将蓝牙客户端的地址及名称显示出来供用户选择。、
     
     蓝牙所发送的数据相关设置也必不可少 ,本文让蓝牙发送的数据为1或0 ,你来传递给单片机,进而控制LED灯的亮灭。
     ![ 较为简单的逻辑设计 ,这只是一个简单的框架,主要设计的是通过按钮的开关来控制灯的亮灭 ]
     然后是通过发送零或一来使单片机Led灯发亮或暗 的控制的控制逻辑
     [ 在文本框输入1或0,点击确认发送即可完成相应功能 ]
      上面的一系列操作完成后,我们已经可以实现手机单方面对单片机进行控制。 在这里我们可以把手机形象化的比喻为命令的发出者 ,发出者通过蓝牙模块将数据传达给单片机 ,单片机又根据内部的程序,从而实现对LED灯的控制 ( 单片机的相关配合程序下文会详细给出 )下面我们来实现单片机对手机反馈数据 这一流程的操作 ,遵循单片机反向反馈数据的原理 ,和相关知识。我们可以有下面的尝试 
    [ 通过显示框找到蓝牙接收到的数据显示出来 ]

     


      **另大一部分便是单片机的配合程序了** 

     

    #include <reg52.h> //51头文件
    
    sbit LED1 = P2^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 0:    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 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;       //开总中断
    }
    void main()
    {
        boothint();
        while(1)
        {
         
            SBUF=9;   //发送单个字符
            while(!TI);TI=0; //发送完成标志
        }
    }

    到目前为止,软件设计和单片机内部程序的设计的所有细节已经全部讲到 ,然后就是软件下载或者是调试的过程了 ,在整个界面的上面有一个连接(Connect)选项,推荐使用AI侣,这要求手机下载一个Appinventor的app,然后让手机和电脑在同一个局域网下,通过扫描二维码就可以在线调试看效果了,是不是有点小激动呀!  

    特别注意:测试蓝牙通讯的单片机不要用51单片机!!!会出现乱码,具体原因可以看我的这篇博客,帮你完美实现蓝牙的双向通信功能。

    https://blog.csdn.net/weixin_42619971/article/details/107298406

     
     
     
     
     
    展开全文
  • 这边如果只是LED的话可以直接通过芯片来供电,电视由于考虑到家用电器的220V电压因此增加电子继电器的环节,此电子继电器可控制220V的电器,因此LED可以被大多数家用电器代替。本项目中的电机通过两个引脚的高低...
  • 实现的功能有:实现电器开关的控制,电机正反转控制,接收热感应器返回的信息.
  • 自己想写个APP用来控制51单片机上LED和风扇的开关,在这学期尝试做了一下最终实现了。本来想着能在APP上输入一些字,在单片机上的显示屏上显示,但由于时间关系,等放假有空了,再实现吧。 欢迎使用Markdown编辑...
  • Android手机蓝牙控制单片机实现智能家居源码
  • 本设计由STC89C52单片机电路+8位LED电路+蓝牙模块电路+电源电路组成。 1、通过手机APP可以控制8路LED的亮灭。 2、通过手机APP可以控制8路LED的亮度。每个的亮度有3档。 3、可以发送指令控制8个全灭和全亮...
  • 通过手机发送命令给HC-06,使AT89C52单片机读取DS18b20的数据,并返回给手机上。
  • 首先,这是一篇总结性的文章。 其次,这是这篇文章的开头: 写这篇文章主要将这个项目的APP实现过程从头到尾写出来。也算是给自己第一个项目的总结和对同样挣扎在相似项目的小萌...蓝牙打开和搜索并显示在列表  ...
  • 51单片机蓝牙控制风扇

    千次阅读 热门讨论 2015-09-30 21:59:18
    这个是我大二才学51单片机的时候做的一个项目,其实这个项目比较简单,只不过是我们自己把它想得太难了,下面我来总结一下具体设计过程,我会上传代码和研究报告:点击这里! 首先买一个蓝牙模块,我买的是HC-06,在...
  • 1.软件部分介绍  微信小程序是一种新的应用,用户不需要下载应用只用通过扫二维码或者打开链接就能使用,使用完后不需要卸载,直接关闭就行了。微信在2017年初推出微信小程序开发环境。...是一种全新的 开发模式。...
  • 51单片机太阳能锂电池无线蓝牙APP光照控制路灯122 本系统由STC89C52单片机、太阳能电池板、锂电池充放电保护、 升压模块、蓝牙模块、高亮LED、A/D采样PCF8591、光照检测。 1、通过太阳能给锂电池充电,具有充电...
  • 51单片机蓝牙小车(精要版)

    千次阅读 多人点赞 2019-11-24 23:10:34
    51单片机蓝牙小车(精要版) 实现:通过手机与小车的蓝牙通信,实现手机控制小车前后左右的移动。 这是博主学了51单片机第一次做的单片机项目,选择了许多人喜欢的蓝牙小车作为第一个项目。 准备材料: 1.小车亚克力...
  • 基于蓝牙单片机控制系统(stc)
  • #include <reg52.h>//这是巡线小车,我想用手机 蓝牙HC05控制小车启动 但是一直不会动啊 求帮忙 时间紧迫啊 #define uchar unsigned char #define uint unsigned int sbit en1=P1^5; /* L298?Enable A 电机pwm...
  • STC15单片机 模块化程序 关于RGB的设计,自己写了一个手机APP通过蓝牙控制RGB的颜色变化   pcb下载 电路图: PCB.rar (4.52 MB, 下载次数: 92)  stc15单片机完整源程序下载: 彩灯.rar (109.72 ...
  • 基于51单片机蓝牙控制板,AD工程压缩。含PCB图。板载俩个继电器,可直接控制
  • 需要先往单片机里下载什么源程序(串口程序)吗?。。。如果有知道的,请不吝赐教,万分感谢![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/30.gif)![图片说明]...
  • 设计基于单片机(STC89C516RD+)的蓝牙(HC-05主从一体)控制LED,以手机作为终端将控制指令经蓝牙通信系统发送给单片机,再由单片机接收并执行控制指令处理显示代码后,将数据内容串行输出并控制译码电路完成串并...
  • 这个是当初实训自己在网上下载寻迹的的源码,在这个...每个模块之间都是独立的,上电先进入红外控制,然后根据按键选择功能。代码可供学习,可实际使用,编译器是keil4。蓝牙遥控需要下载蓝牙串口app,配对后可以遥控。
  • 详情咨询QQ2672243803,免费提供资料,免费讲解
  • 手机控制51单片机蓝牙点亮led

    热门讨论 2013-12-03 16:39:34
    手机通过蓝牙控制51单片机蓝牙点亮led,内有手机端的apk

空空如也

1 2 3 4 5 ... 20
收藏数 496
精华内容 198
关键字:

蓝牙控制单片机