• 这是基于51 单片机蓝牙程序 本人亲自编写 亲测可用 波特率9600 希望对你们有所帮助
  • 通过蓝牙通讯 使用手机来控制 单片机 上 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

    展开全文
  • 要想使用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”分三次接收完,一次接收一个字符,所以要在其中添加自己的逻辑把单个字符组合成一个字符串来进行处理。

                                               

    展开全文
  • 不会java的小白,在使用的单片机蓝牙功能时难道只能上百度下载别人的蓝牙app软件吗?幸运的是一个基于云端开发app的网站来了。App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和...

         欢迎大家访问我的github:https://github.com/Iamttp 有问题一起讨论呀!

    简介

    不会java的小白,在使用的单片机的蓝牙功能时难道只能上百度下载别人的蓝牙app软件吗?幸运的是一个基于云端开发app的网站来了。
     App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。除此之外它也正式支持乐高NXT机器人,对于Android初学者或是机器人开发者来说是一大福音。因为对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。(百度百科)
     因为网上这方面的资料比较少,而自己又在这方面踩了不少坑,所以将单片机、手机常用的app蓝牙通信分享出来,希望一起学习呀!

    手机发送数据到单片机实现


     首先进入其网站,这需要 _ _ (你懂的),当然也可以用App Inventor广州服务器。这里可以参考其他文章。进入后可以看到Appinventor分为界面设计(Designer)以及代码逻辑块(Blocks),可以在右上角切换中英文。

        

     

    1. 首先是界面设计,不用太华丽,当然也不要像我这样难看。利用左栏的布局(Layout),可以整理按钮(Button)和标签(Label)的位置。如果要使用蓝牙还要在连接(Connectivity)里面加入蓝牙客户端(BluetoothClient)。
    2. 之后是逻辑块设计,首先是选择蓝牙以及断开蓝牙的列表选择框以及按钮逻辑设计,思路就是在手机app启动时,列表选择框(选择蓝牙)的启用为真,按钮(断开)的启用为假。选择蓝牙时将蓝牙客户端的地址及名称显示出来供用户选择。

        这样基本的蓝牙通信界面就出来了(先不要喷呀!)做到这里请先试试效果,程序不可能在你写好每个功能后,一运行,然后简直完美。程序需要逐渐壮大,一个功能一个功能的测试,这应该也是软件工程的一个基本思想。

        在整个界面的上面有一个连接(Connect)选项,推荐使用AI伴侣,要求手机下载一个Appinventor的app,然后手机和电脑在同一个局域网下,扫描二维码就可以在线调试看效果了。是不是有点小激动呀!

        上面没有错误后只需加入这类的简单代码块就可以控制单片机了(发送数据)。记得配合单片机的串口通信代码(外加蓝牙)。

    单片机发送数据到手机实现

        但是万一我们需要单片机发送给手机呢?这里我踩了好多坑,网上这方面的教程几乎找不到。这也是这篇文章的重点,首先我们考虑一下如果我们一直执行数据接收,数据一定会乱套的。这样我们需要先用app发送一个数据,然后手机app方面开始执行接收数据程序,单片机则根据接收到的数据发送相应的数据。这样就可以一起配合完成数据通信了,并且不会乱套。

        而假如要一直更新某个数据怎么办呢?单片机方面可以在while(1)里面循环判断接收的数据,然后确认是否发送某个变量的值。而手机app则可以通过定时器在间隔指定时间执行指定函数,发送数据(相当于控制码,控制要接收什么数据),然后接收单片机的数据。(没错,我自己也迷糊了,可以看下面的代码块,一目了然)

    1. 在组件里面加入定时器,然后设置定时间隔单位ms,这样每隔500ms就会执行计时器计时函数块。

        2.在代码逻辑块中加入如下图代码块,具体原理上面已经解释。

        更新1(之前没注意这个问题):

        问题:这里因为定时器设置的启用定时(启用定时指一开始就定时,一直定时是指不止定时执行一次),所以会在还没有连接蓝牙客户端时就开始运行上面的代码块。

        解决方案:所以需要在”当Screen,初始化“那个代码块下添加设置定时器启用假,相应的在“当列表选择框1选择完成”那个代码快下添加设置定时器启用真。

        更新2: 这里省略了全局变量的定义块,大家自己找找这个块吧!然后省略了设置标签值为全局变量的代码块,有了这个就可以显示出全局变量了。

     

        3.之后是根据手机app编写单片机的串口通信程序,如果按照上面的代码块,则单片机的程序应该为:

    while(1)
    {
        if(接收为1)
        {
            发送指定变量值;
        }
        if(接收为0)
        {
            发送另一个指定变量值;
        }
    }

        到了这步就可以下载试试了。文采不好,有什么问题一起交流。

     


     

    2020.5.20:

    找到之前的一个麦克拉姆轮小车的蓝牙APP程序 (只有发送数据到单片机上的功能):

     

     

     

     

    大家评论我都看了,大部分问题集中在App Inventor的配置与前期使用上,而这篇文章初衷是希望解决单片机发送数据到APP这个关键问题上。

    同时因为作者已经很久没有接触App Inventor了,原因详见https://blog.csdn.net/qq_40515692/article/details/100639331,所以也不会再更新App Inventor的入门使用。/ w \

    所以希望读者通过评论和网上其他资料解决入门问题。当然如果没有解决,作者还是很欢迎大家继续评论讨论!

     

    常见问题汇总:

    1. 打开连接控制端后是一整块黑屏 ?

    在手机设置->蓝牙里面,有一个不常用类型设备可以与买来的蓝牙模块配对,密码一般是1234,配好了再重新打开弄好的app就可以与蓝牙连接了。 总之就是需要根据你手机的蓝牙设置匹配一下,这样APP才能够检测到。

    实在没有成功,你可以网上随便下一个蓝牙APP,根据你手机的蓝牙设置匹配一下,然后用下的那个APP确认连接(连接成功,蓝牙模块的指示灯闪烁速度会发生变化),确认可以正常连接后(硬件基本没问题),就再自己参考参考别人的教程或上面的教程写appinventor的程序,然后用自己写的APP连接,测试程序。

     

    2. 507 错误?

    如果是和HC05通信,HC05没有修改主从模式,应该不会出现这个问题。

    出现这个问题,我现在推测的原因是手机-手机,手机-电脑等可能的连接方式时,因为蓝牙连接只能在服务器与客户端之间连接,所以会出现507错误。

     

    3. 一次多个数据的发送接受?

    详见评论:

    接收单字节无符号数是:比如我下位机发个0x1D7(471),APP就接收个471吗?那我要发好几个数并接收这几个数,是用那个接收无符号字节到列表(字节数)那个控件吗?

    经过我的测试接收无符号字节到列表(字节数)可以用来接收下位机发来多个数据,我那个是用多个传感器采集数据正好可以用那个控件。

     

    展开全文
  • 一、蓝牙单片机怎么连接 如图,GND和VCC就接地和电源 RXD和TXD分别接单片机的RXD和TXD RXD:接收数据Receive(rx)Data TXD:发送数据Transmit(tx)Data 单片机的RXD和TXD在哪里呢?打开单片机的...

    HC-06从机模块基本使用方法

     

    一、蓝牙和单片机怎么连接

     

     

     

    如图,GNDVCC就接地和电源 

     

    RXDTXD分别接单片机的RXDTXD

     

    RXD:接收数据 Receive(rx) Data

     

    TXD:发送数据 Transmit(tx) Data

     

    单片机的RXDTXD在哪里呢?打开单片机的原理图

     

    图示P3.0P3.1就是RXDTXD接口,把蓝牙的接口与它们连接好

    这个时候蓝牙上面的指示灯是一闪一闪的(只要通电它就会一闪一闪)

     

    一、用串口助手调试蓝牙(AT指令)

    打开设备管理器,查看单片机与计算机连接的串口号是COM6

     

    打开串口助手,找到串口号COM6,打开串口(还要注意波特率,默认9600,如果有改动而不记得的话只能一个个试过去啦~

     

    输入“AT”,单击“发送”,收到“OK”

     

    一、常用的AT指令

     

    1.测试通讯

    发送:AT

    返回:OK

     

    2.改蓝牙串口通讯波特率(这个改过之后必须要马上调整串口助手中的波特率!)

    发送:AT+BAUD1

    返回:OK1200

    发送:AT+BAUD2

    返回:OK2400

    1----1200

    2----2400

    3----4800

    4----9600

    5----19200

    ......(反正就是数字+1,波特率*2

    8----115200

    ......

    C----1382400

    我们就用默认的9600吧,这个和之后串口收发的代码也有关系,就不调整啦

     

    3.改蓝牙名称(name可改为你给蓝牙取的名字)

    发送:AT+NAMEname

    返回:OKname

     

    4.改蓝牙配对密码

    发送:AT+PINxxxx

    返回:OKsetPIN

     

    二、蓝牙与计算机不使用代码配对

    打开控制面板->查看设备和打印机->右键添加设备

     

    选中后单击下一步(我改过蓝牙名的,原来默认是linvor,不过这个买的蓝牙不一样名字就不一样,相信能找到的......

    等一会儿之后会跳出以下界面,选择“输入设备的配对码”这一项

    输入刚刚设定的配对码,我设的是1234

    稍等后配对成功。然后右键查看该设备属性

    我的串口号是COM12,每个人可能不一样,记住这个串口号!

     

    一、烧录通讯代码

    把我上一篇写的RS232串口通信的代码烧录进单片机。代码实现的功能是发送‘a’返回‘b’,否则返回‘c’。我这部分代码写的很简单,有需要可以自己调整。

    注:烧录的时候一定要把蓝牙拔掉,因为蓝牙的连接会干扰数据线的通信!

    我的代码中用的波特率是9600,晶振是11.0592MHz的,如果其他的话需要调整代码!

     

    二、使用蓝牙通信测试

    1.重新将蓝牙与单片机进行连接。

    特别要注意这个时候蓝牙的RXD接单片机的TXD,蓝牙的TXD接单片机的RXD!这是因为之前我们使用AT指令的时候用的是单片机上的数据线与计算机进行通信的,而单片机接收到什么数据即蓝牙接收到了什么数据,所以蓝牙与单片机的接线口是一致的。而我们用蓝牙进行通信时,蓝牙收到数据后将收到的数据发送给单片机,即蓝牙的发送端应接单片机的接收端,蓝牙的接收端应接单片机的发送端。(希望我这样讲能看的明白......

     

    2.打开串口助手,选择串口号COM12(即之前蓝牙的串口号),打开串口

    这时蓝牙上的指示灯是常亮的,不会一闪一闪,表示蓝牙与计算机成功连接啦~

     

    3.发送‘a’,成功返回‘b’!

     

    转载于:https://www.cnblogs.com/Donut/p/4054348.html

    展开全文
  • 不久前开始学习使用蓝牙模块,在模块与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的功能只有发送数据功能,并没有对输入的数据  做进一步的处理 这里有蓝牙开发的基本...
  • 我们平时用蓝牙,一般是单片机的串口与蓝牙的串口连接,实现数据传输,同时,也会用到mcu的其他一些功能,比如IIC,比如定时器,ADC等。但对于一些功能相对较少的产品,或者要求小体积的产品,这时候可以考虑把mcu省...
  • 打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机...
  • 前言上篇文章我们介绍到了开发经典蓝牙和单片机通讯的过程,安卓通讯之《蓝牙单片机通讯助手》①集成工作 ,我们这里还要兼容最新的安卓6.0及以上的系统,因为从6.0以后的权限机制和以往的不一样,我们需要在代码中...
  • 安卓蓝牙连接单片机蓝牙模块,获取蓝牙模块数据,根据数据进行绘图
  • android手机接收并波形图显示单片机通过蓝牙传输的传感器数据
  •  手机端打开编写的蓝牙通信软件,与单片机蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机单片机开始读取传感器信息,将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。...
  • (1)安卓手机与蓝牙模块联合调试(一)—— 蓝牙模块的串口通讯  (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮...
  • 刚好碰到这蓝牙通信方面的项目,上网也看过其他人在蓝牙这方面写的博客,但大多都不全,给一些初触蓝牙的开发者造成一定的麻烦,自己当初也费了不少劲。所以把自己参考网上的一些资料用Android studio写的代码完全放...
  • 蓝牙模块:HC05 ...蓝牙单片机接线: 5V–5V GND–GND TX–3.0 RX–3.1 第一次需要用常规方式将下方代码写入 main.c #include <reg52.h> #include “stc_isp_download.h” sbit LED = P0^0...
  • (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...
  • 下面的文字只是关于蓝芽技术的调制算法方面,我认为只需要将蓝芽模块加在单片机上就可以了,而不必通过单片机编程来实现具体的算法,只需要编写使两个模块的接口就可以,也就是单片机发送信号时的激励程序,接受外来...
  • 最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^。 1、Android蓝牙编程  蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique ...
  • 手机是安卓系统的,蓝牙模块采用hc-06,单片机用msp430f149.具体要求是手机发数据能通过蓝牙模块传给单片机然后做出相应的反应(如控制LED的亮灭等)。
1 2 3 4 5 ... 20
收藏数 4,510
精华内容 1,804