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

                                               

    展开全文
  • 手机打开蓝牙可以搜索到蓝牙芯片并可以连接连接码为1234。系统开启后数码管全0,继电器低电平,LED灯不亮。 手机连接到系统后,扫描二维码,得到一串数字后,输入该串密码,得以解锁继电器。输入密码,支持断点续...

    一.实验结果

    手机安装HC-PDA-ANDROID.apk软件后,开启系统。手机打开蓝牙可以搜索到蓝牙芯片并可以连接,连接码为1234。系统开启后数码管全0,继电器低电平,LED灯不亮。

    手机连接到系统后,扫描二维码,得到一串数字后,输入该串密码,得以解锁继电器。输入密码,支持断点续传密码,如本次输入“123”,再次输入“456”,即可完成输入“123456”。输入错误可以选择按键S5清空输入后重新输入。单片机暂时内部设置密码为“12345678”。输入密码的过程中,流水灯会展示输入密码的最后一个字符的ASCII码,用于指示传输过程中字符是否正确被接收。如果输入了错误的密码,则会返回一串错误提示消息,并将数码管清空。输入错误的字符后,流水灯全亮。

    输入正确的密码后,继电器高电平,LED构成回路后点亮,返回给手机端计费信息和成功解锁提示。数码管开始计时,每10毫秒变动一次,8个数码管两个一组,分别显示小时、分钟、秒、十毫秒。当处于计费状态时,手机端发送数据,返回无法发送的字样。按下按键S4后,停止计费,返回到手机端计时时长和本次费用,数码管清零,等待下次解锁。

    二.单片机工作原理

    51单片机有P0、P1、P2、P3四个端口。本次实验将其中P0用于数码管的显示数字,P1用于流水灯的显示,P2端口的第1位(P2^1)接在继电器的DIO端,在单片机内控制高低电平。P3端口的第0位连接蓝牙的TX端,是单片机串口的接收端,P3端口的第1位连接蓝牙的RX端,是单片机串口的发送端。按键S4在内部连接P3端口的第2位,为外部中断0。按键S5在内部连接P3端口的第3位,为外部中断1。开启定时器0,设置好计数器的初始值;外部中断0,1打开;串口中断打开,设置好波特率9600,0,0与蓝牙模块一致即可。

    串口的中断触发后,需要软件清除RI(接收中断)与TI(发送中断)值为0,SBUF存放串口接收数据或发送数据,在C语言代码中赋值相同寄存器,在物理上分为发送和接收,每次1字节缓冲。

    定时器0设置工作方式0,13位计数器,计数到8192。晶振为11.0592MHz,每个机器周期需要12个时钟周期,计数5000次,所以每次进入中断的时间为5000*12/11.0592M=0.00543s,所以每次进入中断时间为0.005秒,数码管需要每10ms进入一次,所以每次加到2的时候,数码管变动。计数器初值为(8192-5000),分别存放入TH0与TL0,高低位。

    外部中断直接设置触发方式ITx=0/1低电平触发或下降沿触发后,开启外部中断,EXx=1后,编写相应中断函数即可。

    蓝牙模块首先按住复位键上电,即进入AT指令模式,对它输入AT指令进行设置名字、串口波特率、主从回环等后,连接到单片机上即可使用。

    三.模块工作原理

    二维码扫描APP:

    通过谷歌开源ZXing库开发了一款安卓APP,并安装到手机,扫描出数据后通过蓝牙模块输入到单片机中。

    扫描后为“12345678”。


    蓝牙模块HC-05:

    TX连接单片机P3.0口,RX连接单片机P3.1口。

    在蓝牙模块连接到单片机上前,首先通过USB-TTL转接器,连接到电脑上后,通过串口调试助手调试。首先进入命令调试模式,输入AT指令,设置模块的参数。

    设置蓝牙的名称,用指令

    AT+name=”LiMou”\r\n          设置蓝牙模块名字为LiMou,方便后续查找。

    设置自动连接模式的串口波特率为9600,用指令

    AT+uart=9600,0,0\r\n             设置波特率为9600,停止位1位,无校验位。

    用于手机与单片机之间的通信者,发送密码到密码上,在接入计费系统时,向手机端发送解锁成功标志,并提供计费标准。解锁失败发送解锁失败指示。

    测试问题:

    如果串口收不到数据,换一个模块。

    如果单片机收到数据错误,调整波特率,通过串口助手调节。

    继电器模块:

           继电器电源连接VCC,GND接地,DIO连接单片机P2.1端口,继电器的模块的开闭表示单车的开闭锁。在继电器下接入一个LED的小灯,用它的亮灭来表示继电器是否上电,是否已经开锁。

           LED:

    连接通过继电器构成回路,长脚(正极)接电源,短脚(负极)接继电器常闭端,继电器公共触点引到地,构成回路,点亮小灯(在继电器DIO高电平时)。


    数码管:

           给P1口送编码即可,0-F的编码分别为0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71。

    其中P2^6为段选通,P2^7为位选通。

    用于计时模块和指示通过蓝牙传入的密码数据。

    按键:

           根据不同按键连接的端口触发不同的中断,编写对应的中断函数。在本系统中,外部中断0通过独立键盘模块按键S4实现,低电平触发,在计费状态下,停止计费,并向手机发送计费结果。

           外部中断1通过独立键盘模块按键S5实现,下降沿触发,当在非计费状态下,清空数码管显示为全0。

          

    流水灯:

    流水灯连接到单片机的P1端口,直接对P1口赋值即可,高电平为灭,低电平亮。用于指示接收数据的ASCII码和错误输入提示,全亮。


    51单片机代码:

    #include "reg51.h"
    #include <intrins.h>
    sbit lock = P2 ^ 1;
    sbit dula = P2 ^ 6;
    sbit wela = P2 ^ 7;
    
    unsigned char digit_led_pointer = 0;
    unsigned char count = 0;
    unsigned char opened = 0;
    
    unsigned char code table[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };	// 数码管0-f表
    
    unsigned char led[] = { 0, 1, 2, 3, 4, 0, 0, 0 };	//存放8个数码管显示的数字
    
    
    void delay(unsigned int i)		//延迟函数
    {
    	while (--i);
    }
    
    void clear_digit(void)			//清空数码管,全变成0
    {
    	unsigned char i = 0;
    	for (; i < 8; ++i)
    		led[i] = 0;
    	digit_led_pointer = 0;
    }
    
    
    void send(unsigned char dat)	//通过串口发送到蓝牙模块上,蓝牙模块发送出去一个字节的字符
    {
    	ES = 0;
    	SBUF = dat;
    	while (!TI);
    	TI = 0;
    	ES = 1;
    }
    
    void send_str(unsigned char * str)	//通过蓝牙模块发送一个字符串
    {
    	while (*str != '\0')
    		send(*str++);
    }
    
    
    void display(unsigned char dig)		//输入密码阶段的显示,在已经输入的密码后续进行输入
    {
    	led[digit_led_pointer++] = dig;
    	if (digit_led_pointer == 8)
    	{
    		//判断如果输入密码为12345678的话,返回解锁成功
    		if (led[7] == 8 && led[6] == 7 && led[5] == 6 && led[4] == 5 && led[3] == 4 && led[2] == 3 && led[1] == 2 && led[0] == 1 && (opened == 0))
    		{
    			//开锁状态置位
    			opened = 1;
    			lock = 1;	//开锁继电器,高电平,点亮LED
    			clear_digit();
    			send_str("price: 1Yuan/min\n");
    			send_str("lock successfully!\n");
    		}
    		else
    		{
    			delay(10000000);	//输入8位密码后,延迟显示错误密码
    			clear_digit();
    			//解锁失败
    			send_str("lock fail!\n");	//向手机发送提示信息
    		}
    		digit_led_pointer = 0;
    	}
    }
    
    
    //计时模块,每次进入该函数,为10毫秒
    void time_add_10ms()
    {
    	led[7]++;
    	//100进位,每次10毫秒
    	if (led[7] == 10)
    	{
    		led[7] = 0; led[6]++;
    	}
    
    	if (led[6] == 10)
    	{
    		led[6] = 0; led[5]++;
    	}
    
    	//60进位,为秒数
    	if (led[5] == 10)
    	{
    		led[5] = 0; led[4]++;
    	}
    
    	if (led[4] == 6)
    	{
    		led[4] = 0; led[3]++;
    	}
    	//分钟数
    	if (led[3] == 10)
    	{
    		led[3] = 0; led[2]++;
    	}
    
    	if (led[2] == 10)
    	{
    		led[2] = 0; led[1]++;
    	}
    	//小时数,如果100个小时清零
    	if (led[1] == 10)
    	{
    		led[1] = 0; led[0]++;
    	}
    
    	if (led[0] == 10)
    		clear_digit();
    }
    
    //定时器0,为1号中断
    void timer0_ISR(void) interrupt 1
    {
    	if (opened == 1)
    	{
    		//晶振为11.0592MHz,每个机器周期需要12个时钟周期,计数5000次,所以每次进入中断的时间为
    		//	5000*12/11.0592M=0.00543s,每次进入add_10ms函数需要计数2次,所以每次count==2的时候,数码管显示+1
    		TL0 = (8192 - 5000) % 32;
    		TH0 = (8192 - 5000) / 32;
    		count++;
    		if (count == 2)
    		{
    			//达到10ms了
    			time_add_10ms();
    			count = 0;
    		}
    	}
    }
    
    
    
    void uart() interrupt 4
    {
    	unsigned char ky;
    
    	if (RI)
    	{
    		RI = 0;		//需要软件清除标志位
    		ky = SBUF;	//接收到的数据保存到
    		if (opened == 1)
    		{
    			send_str("can't stop, please press the button S4!\n");	//计费状态不接受输入,并返回提示信息。
    			return;
    		}
    		ES = 0;
    		P1 = ky;	//data send to Port 1,通过流水灯显示接收到的数据的ASCII码
    
    		//根据收到的数据进行异常处理或数码管输入
    		if (ky >= '0'&&ky <= '9')
    		{
    			display(ky - '0');
    		}
    		else if (ky >= 'a' && ky < 'f')
    		{
    			display((unsigned char)((ky - 'a') + 10));
    		}
    		else
    		{
    			//错误数据,流水灯全亮。
    			P1 = 0x00;
    		}
    		ES = 1;
    	}
    }
    
    void init_uart()
    {
    	TMOD = 0x25;            //定时器1工作方式2,计数器0工作方式1
    	SCON = 0x50;            //串口工作方式1
    	EA = 1;             //开总中断
    	ES = 1;             //开串口中断
    	TH1 = 0xfd;            //串口波特率9600
    	TL1 = 0xfd;
    	TR1 = 1;             //定时器1工作	
    }
    
    void timer0_init(void)
    {
    	TMOD &= 0xF0;	//计数器0方式0
    	TL0 = (8192 - 5000) % 32;	//计数5000次
    	TH0 = (8192 - 5000) / 32;
    	count = 0;
    	ET0 = 1;		//开启计时器和中断
    	TR0 = 1;		
    }
    
    void init_EX(void)
    {
    	EX0 = 1;
    	IT0 = 0;
    	EX1 = 1;		//开启外部中断 0
    	IT1 = 1;          //设置成低电平触发,1为下降沿触发
    }
    
    //把计时费用转换成字符串发送给手机端
    void num2str(int cost)
    {
    	while (1)
    	{
    		if (cost / 10 != 0)
    			send(cost / 10 + '0');
    		else
    		{
    			send(cost + '0');
    			break;
    		}
    		cost %= 10;
    	}
    }
    
    //外部中断0,S4按下停止计费
    void Ex0_IRQ(void) interrupt 0
    {
    	//不在计费状态下没反应
    	if (opened == 1)
    	{
    
    		int time;
    		opened = 0;
    		send_str("duration:");
    		send(led[0] + '0'); send(led[1] + '0'); send(':');
    		send(led[2] + '0'); send(led[3] + '0'); send(':');
    		send(led[4] + '0'); send(led[5] + '0');
    		send('\n');
    		time = ((led[0] + led[1]) * 60 + (led[2] * 10 + led[3]));
    		send_str("cost: RMB "); num2str(time + 1); send('\n');
    		lock = 0;
    		clear_digit();
    	}
    }
    
    //外部中断1,2号中断,S5按下后清空数码管
    void Ex1_IRQ(void) interrupt 2
    {
    	//不在计费状态下才有反应
    	if (opened == 0)
    	{
    		digit_led_pointer = 0;
    		clear_digit();
    	}
    }
    
    void main()
    {
    	unsigned char num = 0;
    	//初始化
    	init_uart();
    	timer0_init();
    	clear_digit();
    	init_EX();
    	lock = 0;
    	while (1)
    	{
    		//显示数码管
    		for (num = 0; num < 8; ++num)
    		{
    			wela = 1;
    			P0 = _crol_(0xfe, num);	//选中数码管,循环左移
    			wela = 0;
    			dula = 1;
    			P0 = table[led[num]];
    			delay(100);
    			dula = 0;
    		}
    	}
    }


    展开全文
  • 不久前开始学习使用蓝牙模块,在模块与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,否则可能出现乱码的情况。

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


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


    展开全文
  • 使用无底板的HC-05蓝牙模块,包括连线,通过SSCOM32进行配置,编写安卓端的程序实现和蓝牙模块的通信,数据传输

    买个蓝牙模块以为是HC-06,没有底板,测试半天反应,后面才发现是HC-05,HC-05和HC-06的测试方法稍有不同

    一、HC-05蓝牙模块连线

    先上一个自己的接线(有点丑,凑活着测试一下)


    下面是接线原理图,HC-06,HC-05,HC-04的接线原理图后面的资料里面有


    我当时不知道自己的蓝牙模块的型号,就先给蓝牙模块上点,然后一一将PIO0-PIO11引脚接到开发板的LED灯上,根据灯的闪亮情况就知道是HC-05还是HC-06了,两个的LED灯的接线引脚不同,HC-05是PIO8,而HC-06是PIO1

    接线的时候,蓝牙模块TXD引脚接单片机的RXD,蓝牙模块TXD引脚接单片机的TXD,电源接3.3V(我直接接到开发板的3.3V电源),GND接地,LED接指示灯(也是直接接到开发板的LED),KEY可以悬空,但是配置的时候要先接高电平

    二、配置蓝牙模块

    开始不知道模块是主机还是从机,反正是手机搜索不到,配置蓝牙模块的时候要TTL-USB转接器,连接方式电源接电源,地接地,蓝牙模块TXD接转接器RXD,蓝牙模块RXD接转接器TXD,测试的时候把蓝牙模块的LED灯接上(我接到开发板的,记得上电),要用指示灯判断蓝牙模块的状态

    接好蓝牙模块和TTL-USB转接器的连线后,就可以将转接器接到电脑,对于HC-05模块转接器接电脑之前要把KEY引脚接到一个高电平(我接到开发板的高电平的),然后再把转接器接到电脑,等待指示灯间隔大概一秒闪一下,就连接上了,连上之后将KEY悬空,如果不把KEY引脚接到高电平,直接接转接器,指示灯会闪的很快,这是没连上的

    连接上之后就可以用软件测试了,用串口调试助手和SSCOM32都可以,建议用SSCOM32,因为HC-05发送时要换行,SSCOM32有自动换行,如果用串口调试助手的话,要自己加上一个换行,串口调试助手好像只能找到COM1-COM4,我接到COM5的就找不到端口了

    选择对应的端口号,HC-05的波特率一定要设置成38400,自动换行,下面是我测试命令,更多的命令在后面的文件中有,那个AT+NAME?获得名字好像不能用,设置名字可以用



    HC-05的常用命令

    设置名字:AT+NAME=MYBT

    获得波特率:AT+UART?

    设置波特率:AT+UART=4800

    获得密码:AT+PSWD?

    设置密码:AT+PSWD=1234

    获得主从模式:AT+ROLE?

    设置主从模式:AT+ROLE=1或0(1是主模式,0是从模式),设置成从模式才能被手机搜索到

    3、蓝牙模块连接手机进行数据传输

    要将蓝牙模块设置从模式哦

    首先要将蓝牙模块和单片机连接好,前面已经说过了

    我们的测试思路是将蓝牙模块和手机模块连接,连接后蓝牙模块对于单片机来说就是串口通信了,所以使用串口通信就可以使用蓝牙模块了

    测试程序是单片机收到什么数据就发送什么数据回去


    下面是单片机的程序

    注意要将波特率设置成蓝牙模块一样的波特率,前面蓝牙设置成的4800,所以串口的也要设置成4800(11.0592MHZ的晶振)

    程序将接收到的数据返回去,下载程序的时候要和蓝牙模块断开,因为都要用RXD,TXD,下载完后再连接蓝牙模块

    #include<reg51.h>
    void UsartConfiguration();
    void main(){
    	UsartConfiguration();
    	while(1);
    }
    
    void UsartConfiguration(){
    	SCON=0x50;		//设置为工作方式1			
    	TMOD=0x20;		//设置计数器工作方式2
    	PCON=0x80;		//波特率加倍
    	TH1=0xF4;		//计数器初值设置,波特率是4800
    	TL1=0xF4;
    	ES=1;			//开中断
    	EA=1;						
    	TR1=1;			//开计数器
    }
    void Usart() interrupt 4{
    	unsigned char receiveData;
    	
    	receiveData=SBUF; 	//接收数据
    	RI = 0;           
    	SBUF=receiveData; 	//将接收到的数据返回
    	while(!TI);		  
    	TI=0;			  
    }

    单片机的程序写好了,然后就是安卓端的程序了,安卓端为了最大的简化代码,我们最简单的写程序,实现和单片机的数据传输,只要可以和单片机通信,其他的程序在此基础上进行进一步扩充就比较容易了

    1.蓝牙模块和单片机连接好之后,指示灯会快速闪烁,打开手机蓝牙,如果蓝牙模块连接正确,配置正确,就可以搜索到,然后配对,如果不知道蓝牙模块的密码或者名字,可以自己用AT命令配置成自己知道的再去配对,配置方法前面已经说过了

    2.安卓端的程序

    为了最大化的简化代码,实现通信,安卓程序我们写的比较简单,写之前先参考下:http://www.cnblogs.com/cxcco/archive/2012/01/15/2322783.html 关于安卓蓝牙开发

    连接之前一定要先配对,蓝牙要打开,程序发送26个英文字母,手机收到26个英文字母,程序流程大概就是  

    获得适配器->从适配其中取得已经配对的设备->找到要配对的设备->和该设备建立连接->获得输出和输入流->进行数据传输

    下面是主要程序:


    public class MainActivity extends Activity {
    	
    	private BluetoothAdapter mBtAdapter;
    	private TextView inforTV;
    	private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    	
    	
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
            inforTV = (TextView) findViewById(R.id.show_infor);
            
            //取得蓝牙适配器
            mBtAdapter = BluetoothAdapter.getDefaultAdapter();
            if(mBtAdapter != null){
            	if(!mBtAdapter.isEnabled()){
            		Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            		startActivity(intent);
            	}        	
            }
            //myHandler = new MyHandler(MainActivity.this.getMainLooper());
            //获得已经配对的设备
            Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
            
            BluetoothSocket socket = null;
            InputStream inStream = null;
            OutputStream outStream = null;
    		
            if(pairedDevices.size() > 0){
            	for(BluetoothDevice device : pairedDevices){
            		inforTV.append(device.getName()+"\n"+device.getAddress()+"\n\n");
            		//从已经配对的设备中找到要连接的设备,在测试时将MYBT改成自己的蓝牙模块的名字
            		if("MYBT".equals(device.getName())){
            			try {
            				//和已经配对的要连接的设备建立连接
    						socket = device.createRfcommSocketToServiceRecord(MY_UUID);
    						socket.connect();
            			} catch (IOException e) {
    						inforTV.append("创建或连接异常!\n");
    						if(socket != null){
    							try {
    								socket.close();
    							} catch (IOException e1) {
    								inforTV.append("关闭异常!\n");
    							}
    						}
    					}
            			inforTV.append("创建成功!\n");
            			try {
            				//获取输出和输入流
    						outStream = socket.getOutputStream();
    						inStream = socket.getInputStream();
    					} catch (IOException e) {
    						inforTV.append("获取流异常!\n");
    					}
            			inforTV.append("获取成功!\n");
            			try {
            				//输出一个字母时,接收一个字母
            				for(int i=0; i<26; i++){
            					outStream.write('A'+i);
            					inforTV.append(""+(char)(inStream.read()));
            				}
    					} catch (IOException e) {
    						inforTV.append("传输失败!\n");
    					}
            		}
            	}
            }
            else{
            	inforTV.append("未发现设备!\n");
            }
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
    }
    




    修改程序时,要将MYBT该成自己的蓝牙模块的名字,运行程序后等待连接一会,如果连接成功了,蓝牙模块的指示灯会快速闪两下后停一会儿,然后快速闪两下,程序在后面的资料里后。

    以上就是全部的HC-05的蓝牙模块的连接,配置,和安卓的通信,希望可以和大家继续探讨。

    资料链接:

    串口调试助手,SSCOM32软件


    蓝牙模块简单的安卓通信程序


    HC-05,HC-06蓝牙模块资料


    展开全文
  • 51单片机蓝牙模块的串口51单片机蓝牙模块的串口通信C程序通信C程序
  • 基于51单片机蓝牙模块的部分资料,可供朋友们学习和参考,包含模块资料和代码
  • 51单片机上的串口,连接到HC-05单片机模块,通过向蓝牙发送数据,从而与单片机进行数据传输,可以在手机蓝牙串口上,进行单片机控制,例如蓝牙
  • 1.首先需要确保你有以下软件和实物...2.有了这些软件和实物之后,下面我们开始用51单片机蓝牙模块实现正向和逆向流水灯: 1)先新建一个工程:如下图所示(如果有朋友不知道如何新建工程的,可以参考我之前的一篇...

    1.首先需要确保你有以下软件和实物:
    1)手机上需要下载蓝牙串口app
    2)电脑上安装了可以用来写51单片机代码的Keil编译软件:Keil4或者Keil5和stc-isp烧录软件
    3)蓝牙模块
    4)焊有多个LED灯的51单片机
    2.有了这些软件和实物之后,下面我们开始用51单片机和蓝牙模块实现正向和逆向流水灯:
    1)先新建一个工程:如下图所示(如果有朋友不知道如何新建工程的,可以参考我之前的一篇博客https://blog.csdn.net/weixin_45870610/article/details/104372952)
    在这里插入图片描述

    2)因为我们这里需要对蓝牙模块进行初始化等操作,为了减轻main.c文件的负担,并且使代码更加清晰,下面我们会新建一个BLUETOOTH文件夹.
    (1)在这里插入图片描述
    (2)
    在这里插入图片描述
    然后就完成BLUETOOTH文件夹的新建啦:
    在这里插入图片描述
    (3)建立bluetooth.c和bluetooth.h文件(Ctrl+N---->Ctrl+S)
    在这里插入图片描述
    在这里插入图片描述
    (4)我们需要把bluetooth.c和bluetooth.h文件加到BLUETOOTH文件夹里面:
    在这里插入图片描述
    在这里插入图片描述
    3)加入.c文件之后我们可以需要先写好main.c、bluetooth.c和bluetooth.h的代码,最后再把.h文件加到BLUETOOTH
    以下是main.c的代码内容:

    #include <reg52.h>
    #include <bluetooth.h>
    sbit LED1 = P1^0;
    extern uchar tempbuf;
    
    void main()
    {
      unsigned int a;
      BLUETOOTH_Init();
      while(1)
      {
    	  while(tempbuf=='0')	   
          { 
    		 P1 = P1 << 1;
    	     a = 500;  //可以随意定,可以改变两个LED灯亮的时间间隔
    	     while(a--);//软件延时
    	     if(P1 == 0)
    	     {
    	         P1 = 0xff;//不能写二进制,这里全部是1,熄灭,转换为十六进制
    		     a = 500;
    		     while(a--);//软件延时
    		 }
    		 
    	 
          }
    	  while(tempbuf=='1')
    	  {
    	  	 P1 = P1 >> 1;
    	     a = 500;
    	     while(a--);//软件延时
    	     if(P1 == 0)
    	     {
    	         P1 = 0xff;//不能写二进制,这里全部是1,熄灭,转换为十六进制
    		     a = 500;
    		     while(a--);//软件延时
    	     }
          }
       }
    }
    
    
    

    以下是bluetooth.c的代码内容:

    
    #include <bluetooth.h>
    
    
    unsigned char tempbuf;	//存储接收到的信息
    
    void BLUETOOTH_Init(void)	//
    {
        TH1 = 0xFD;	 //晶振12 波特率设为9600
        TL1 = TH1;
        TMOD |= 0x20;	 //定时器1方式2
        SCON = 0x50;	 //串口接收使能
        ES = 1;			 //串口中断使能
        TR1 = 1;		 //定时器1使能,启动定时器
        TI = 1;			 //发送中断标记位,必须设置
    	EA = 1;
    } 
    
    void Serial(void) interrupt 4
    {
    	tempbuf = SBUF;
    	RI = 0;	//读标志清零
    }
    
    

    对以上的定时器和中断的相关知识陌生的朋友可以参考我之前的一篇博客https://blog.csdn.net/weixin_45870610/article/details/104374799

    以下是bluetooth.h的代码内容:

    
    
    #ifndef __BLUETOOTH_H__
    #define __BLUETOOTH_H__
    
    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    void BLUETOOTH_Init(void);
    
    
    #endif
    

    4)最后再添加.h文件在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    编译之后的可以看到以下画面啦:
    在这里插入图片描述
    5)编译成功之后需要生成hex文件,连接好51单片机和蓝牙模块之后进行烧录(忘记怎么生成hex文件的朋友可以参考我之前的一篇博客https://blog.csdn.net/weixin_45870610/article/details/104372952)
    6)打开手机上的蓝牙串口app,根据代码可以知道,当我从手机上发送数字0时会实现正向流水灯,发送数字1时可以实现逆向流水灯。
    以上就是用51单片机和蓝牙模块实现正向和逆向流水灯的具体实现过程和代码了,希望我写明白了,也希望你看明白了哈哈

    展开全文
  • 蓝牙模块HC05和单片机连接的设置测试源代码
  • 请问HC05 蓝牙模块怎么 让手机与单片机通信 程序要怎写 蓝牙模块要怎么设置
  • 使用蓝牙模块也有段时间了,更新…… 现在市面上用的蓝牙芯片大部分是ble的了,也就是低功耗透传模式。最近用到蓝牙SOC(片上系统),和大家分享下。 我们平时用蓝牙,一般是单片机的串口与蓝牙的串口连接,实现...
  •  HC-05蓝牙模块为主从一体的蓝牙模块,并可与手机实现实时的通信。将单片机的串口通信通过HC-05进行扩展从而实现无线通信,更可使用手机来控制单片机完成工作。 要完成单片机与Android手机的无...
  • 51单片机蓝牙模块

    2019-06-22 17:03:53
    51单片机蓝牙模块,是在蓝牙通讯的基础上,进行蓝牙51模块与外部蓝牙发射接收设备之间,相互收发数据。并且其引脚为VCC,GND,TXD,RXD,可以通过串口通信与外部上位机或单片机通信。 代码如下(注意蓝牙模块是5V...
  • 蓝牙模块HC05和单片机连接的基本设置。源码在下一个文件中。
  • 之前两篇都是在说与手机的连接连接方法,和主动配对连接,都是手机与手机的操作,做起来还是没问题的,但是最终的目的是与单片机蓝牙模块的通信。   下面是到目前为止尝试的与单片机的通信方法,没有成功,但是...
  • 定义了单片机引脚 与 各个模块连接  进行 模块测试,分析遇到的问题。====&gt;&gt; 完成了 模块的测试,以及完成了 蓝牙控制小车前进 .....      2. 整个小车系统的...
  • 蓝牙舵机篇 引语 本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波...会使用HC-05蓝牙模块,了解51单片机的串口通信。2.会用51单片机输出pwm波,并校正舵机的误...
  • 基于51单片机HC-06蓝牙模块使用,里面包含程序方便新手入门
  • 该程序实现了51单片机蓝牙通信程序,并在适当地方做了注释
  • 蓝牙模块:BT08(兼容HC-06、HC-05) 参考代码:这里 说明 该App功能为通过蓝牙接收单片机采集的温度传感器数据,同时可以通过蓝牙发送预设温度数据给单片机 蓝牙通信代码仿照参考代码进行编写,不再提供...
1 2 3 4 5 ... 20
收藏数 906
精华内容 362