草庐IT

【51】HC-06蓝牙模块使用

歡、 2023-07-13 原文

说到蓝牙模块,就不得不说下主、从机:

主机 : 用于向从机下发指令,能够搜索从机并主动建立连接的一方。

从机 : 用于接收主机下发的命令,不能主动建立连接,只能等别人连接自己。

主从一体 : 能够在主机和从机模式间切换,即可做主机也可作从机。

HC-06与HC-05不同的是 :

  1.   HC-05一般都是主从机一体,既可以设置为主机也可以设置为从机。
  2.   而HC-06在市场上分为两种情况,一种是:主从机一体;另外一种是:只有从机功能。

当购买回来的蓝牙模块需要进行设置时(如主从机设置、波特率、蓝牙名称以及密码修改等):

进入AT指令方法,具体要看手册,不同模块有不同进入方法,我这里的商家给的资料是:

1、接线方法:

2、指令测试:

打开串口,设置与蓝牙模块相同波特率:

3、主、从机模式设置:

 主、从机模式需要通过设置实现(蓝牙模块都默认为从机模式,不需要改请忽略),既通过串口发送AT指令设置:

AT+ROLE设置主从模式: AT+ROLE?是查询主从状态;AT+ROLE=1是设成主;AT+ROLE=0是设成从。 (由于我的HC-06是只有从机模式,设置不了,就不演示设置过程了)。

4、波特率设置:

        波特率一般默认为9600。波特率越低,传输速度越慢,但也不是越高越好,看具体情况而定,一般单片机用的都是9600。(注意:蓝牙模块的波特率需要和单片机的相同,否则传输不了数据

这个默认波特率不是每个蓝牙模块都一样的,有的蓝牙模块默认波特率是115200,使用的时候需要看下商家资料。或者每个波特率试着改一下,总能试出来蓝牙模块的默认波特率。

指令代码部分先还有很多(比如:改蓝牙名称、蓝牙密码),感兴趣的话可以看一下数据手册,这里就不说那么多。

------------------------------分界线---------------------------

来到实际使用部分内容。

这里需要讲一下晶振,这个关乎蓝牙模块能否发送、接收数据成功。

C51开发板上的晶振有11.0592Mhz的,也有12Mhz的。

11.0592Mhz的使用串口可以省略很多问题,因为11.0592就是为了串口而生的,在设置波特率的时候可以不用考虑误差问题,误差会使蓝牙模块接收到错误的数据,所以在使用串口时一般考虑用11.0592晶振:

先说11.0592MHz的使用方法,打开ISP烧录软件。

一、设置波特率:

按步骤1~8设置。其中3、4、5、6步在C51系列单片机是固定的,也就是说除了上面设置的这几个外其它选项都是其它单片机型号的。

二、把生成代码复制到代码中,稍微修改下:

  

  这样波特率就设置好了。

三、然后把代码烧录进单片机

(在烧录程序时单片机TXD、RXD引脚不能连接其它模块,否则烧录不上):

#include <REGX52.H>

//串口初始化
void UartInit(void)		//9600波特率 @11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;			//设置定时初始值
	TH1 = 0xFD;			//设置定时重载值
	ET1 = 0;			//禁止定时器%d中断
	TR1 = 1;			//定时器1开始计时
	ES = 1;				//打开串口
	EA = 1;				//打开总中断
}

void main()				//主程序
{
	
	UartInit();		 //串口初始化
	while(1)
	{
			
	}
}

void Uart_Bluetooth() interrupt 4		//串口中断
{
	 if(RI == 1)		//接收
	{
		P2 = SBUF;	 	//把接收数据赋给单片机P2口(该接收数据是16进制)
		RI = 0;			//软件置0
	}
}

四、烧录完成后进行接线:

 五、去应用商店下载手机蓝牙调试助手

(我用的是这个,用其他的也行)

打开应用,发送00(代表0x00),单片机P2口会全部置0,可以发送其它的

比如:FF(代表0xFF,单片机P2口全部置1)。

可用万用表测电压的变化。

因为我是在程序中把 SBUF 赋给了 P2 口,所以只有P2口有反应。

# 11.0592MHz 完

-------------------------------分界线-------------------------------

下面讲12MHz 的使用

一、配置波特率

 因为9600波特率误差在8.5%,所以配4800波特率,发现误差还是很大(6.99%),把波特率倍速勾上:

 勾选上以后误差已经很小(0.16%),现在可以用了。

老规矩:

#include <REGX52.H>

void UartInit(void)		//4800波特率 @12.000MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF3;			//设置定时初始值
	TH1 = 0xF3;			//设置定时重载值
	ET1 = 0;			//禁止定时器%d中断
	TR1 = 1;			//定时器1开始计时
	ES = 1;				//打开串口
	EA = 1;				//打开总中断
}

void main()          //主程序
{
	UartInit();		 //串口初始化
	while(1)
	{
			
	}
}

void Uart_lya() interrupt 4		//串口中断
{
	 if(RI == 1)
	{
		P2 = SBUF;	 	//把接收数据赋值到单片机P2口
		RI = 0;
	}
}

别急,蓝牙的波特率还没有设置,也要进行4800波特率设置,保证跟单片机一致,这样才能确保数据的正确传输与接收。

1.接线方法:

2.串口AT指令发送,设置蓝牙模块波特率:

3.单片机与蓝牙接线 :

4.发送指令

 

蓝牙将接收的数据发送给单片机,LED全部点亮:

有关【51】HC-06蓝牙模块使用的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

随机推荐