蓝牙模块学习笔记(1)
蓝牙Host Controller Interface笔记
1.概述HCI提供了一个统一的使用蓝牙控制器(BR/EDR Controller,BR/EDR/LE Controller,LE Controller,AMP Controller等)的方法,它屏蔽了蓝牙的基带部分,提供了统一的数据进入基带的方法。
首先,蓝牙的BaseBand部分有以下几种控制器:• BR/EDR Controller• BR/EDR/LE Controller• LE Controller• AMP Controller前三种称为primary Controller,AMP是蓝牙3.0后加上的,支持High Speed传输。
下图为简单的架构:两个设备间数据的流向如下图:MANDS AND EVENTS通过HCI接口,Host与controller通过Command和Event的形式进行通信,其中command 是Host传给controller的,Event是controller反馈给Host的,如下图所示:Command和Event根据不同的类型进行了以下分组,具有以下几种:每一组内有一个或者对个Command和Event,举例如下:可以看出,Generic event组内有三种Event,Device SetUp组内只有一种reset Command。
Command和Event的种类很多,这里不具体介绍,参考Spec704-1000的具体说明。
3.HCI Data Format由上可知,HCI有三种数据,Command、Event和Data,这三种类型的HCI Data分别有不同的格式。
需要注意的是,HCI Data都是Little Endian formats的,负数的存储形式为2进制补码。
在Host和Controller之间由HANDLES来识别不同的通道,一共有三种:• Connection Handles• Logical Link Handles• Physical Link Hand les其中,Connection Handles用于primary controller(除AMP外),另外两用用于AMP Controller。
蓝牙技术学习笔记
UAP 高地址部分 8bit LAP 低地址部分 24bit
b) AM_ADDR(主设备分配给处于 Active 状态的从设备的活动成员地址(Active Member
Address),AM_ADDR 长度为 3bit,最多 8 个设备,主设备的 AM_ADDR 地址固定为
000)。 c) PM_ADDR(从 Active 状态进入 Park 状态的蓝牙设备,将得到一个守候成员地址(Parked
c) 链路数目:主设备和各个从设备间最多只有一条 ACL 链路,但是可以有多条 SCO 链路。 8. 语音编码
蓝牙技术中的语音编码可采用脉冲编码调制 PCM 或连续变化斜率比较调制 CVSD 两种方 式,具体采用何种方式决定于高层。 9. 差错控制 蓝牙技术的基带层内共定义了 1/3FEC,2/3FEC 以及 ARQ3 种差错控制方式。对于 SCO 链 路上语音包的差错控制方式采用 1/3FEC,对于 ACL 链路上数据包的差错控制方法采用 2/3FEC,每个包内的包头位都采用 1/3FEC 差错控制。 10. 蓝牙数据包结构 Packet(包)是蓝牙系统在物理信道上的传输单位,不同的包占用的时隙个数、包长度、包 上的位数值都有较大差异。 蓝牙包分为访问码(Access Code)、包头(Header)、有效载荷(Payload)3 部分。
蓝牙技术的操作模式 Profile 1、为什么要定义操作模式 蓝牙技术所支持的设备种类繁多,需要许多特有的通信协议来支持相应的设备类型。制定操作 模式的最大目的是确保蓝牙设备的互通性。 2、每个操作模式实现互通性的方法 每个操作模式实现互通性的方法,是从通信协议层与应用层两个层着手,制定设备操作在该操 作模式下应该遵守的规范。 每个操作模式代表某个设备在某种应用场合必须遵守的规范,操作模式的名称反映了操作模式 所定义的应用场合。 3、蓝牙技术标准定义的各种操作模式 目前,在蓝牙技术中定义了 13 种操作模式,大致可分为 4 类:通用模式与服务发现应用操作模 式,所有蓝牙设计都必须符合通用操作模式的规范;与电话相关的操作模式;串行端口操作模式; 普通对象交换操作模式。各种模式关系如图:
ESP32_IDF学习1【基本内容】
ESP32_IDF学习1【基本内容】学校⽼师留了个作业,让⽤剩下⼀半的寒假学学ESP32,做蓝⽛透传+STA&AP模式下⼯作的http服务器,但是不准⽤Arduino当场就傻了:ESP32我刚刚好就会⼀⼿Arduino;乐鑫那套ESPIDF太难啃,之前点了个灯就去快乐stm32了;micropython......刷完固件发现蓝⽛⽀持跟【数据删除】⼀样,还不如⽤c写——⼀咬⽛⼀跺脚,回头肝ESPIDF吧总体思路:资源少,跟着官⽅⾛准没错,硬啃就完事了这个系列笔记可以供只接触过单⽚机开发(STM32、51基础)和硬件相关知识但没有接触过⽹络相关知识的同学翻阅学习项⽬⽂件夹构建ESP-IDF项⽬由各种“组件”构成,你需要什么功能就要往⾥扔进去什么组件如果你的代码⾥⽤了⼀堆WiFi的库函数,但是没把WiFi组件加⼊进去,你是没办法⽤WiFi功能的项⽬保存在项⽬⽂件夹下,它的根⽬录如下所⽰:├── CMakeLists.txt Cmake使⽤的⽂件├── other_documents 其他⽂件├── main 存储主程序│├── CMakeLists.txt│├── component.mk 组件的make file│└── main.c└── Makefile 由传统的GNU make程序使⽤的Makefile需要注意的是:ESP-IDF并不是项⽬⽂件夹的⼀部分,它更像是⼀个⾃助编译器,项⽬⽂件夹通过idf.py esptools等⼯具和{IDF_PATH}与ESP-IDF⽬录建⽴联系;同样,esp的开发⼯具链也独⽴于项⽬存在,通过{PATH}对项⽬进⾏作⽤项⽬建⽴前,esp-idf会通过idf.py menuconfig配置出Makefile,这些配置保存在sdkconfig中。
sdkconfig会被保存在项⽬⽂件夹的根⽬录CMakeLists.txt通过idf_component_register将项⽬⽂件夹下⾯的组件进⾏注册,如下所⽰idf_component_register(SRCS "foo.c" "bar.c"INCLUDE_DIRS "include"REQUIRES mbedtls)SRCS给出了源⽂件清单,能⽀持的源⽂件后缀名为.c .cpp .cc .SINCLUDE_DIRS给出了组件中⽂件的搜索路径REQUIRES不是必须的,它声明了其他需要加⼊的组件通过这个txt⽂档,esp-idf就能知道你往⾥扔了什么组件,然后在编译的时候就会把这些组件编译链接进去(可以理解成操作系统的静态链接)当编译完成后,⽂件根⽬录下会多出build⽂件夹和sdkconfig⽂件,build⽂件夹⽤来存放编译过程中的⽂件和⽣成的⽂件,sdkconfig⽂件是在menuconfig的过程中产⽣的,如果曾经多次重新设置过menuconfig,还会发现多出了以.old结尾的config⽂件另外组件也可以⾃制,详细内容参考官⽅教程;⽽idf.py 的底层是⽤Cmake、make⼯具实现的,所以也可以直接⽤这些⼯具进⾏编译(不过应该没⼈这么⼲)CMake与component组件【摘⾃官⽅⽂档】⼀个ESP-IDF项⽬可以看作是多个不同组件(component)的集合,组件是模块化且独⽴的代码,会被编译成静态库并链接到应⽤程序。
zigbee学习笔记
关于ZIGBEE技术Zigbee的由来在蓝牙技术的使用过程中,人们发现蓝牙技术尽管有许多优点,但仍存在许多缺陷。
对工业,家庭自动化控制和遥测遥控领域而言,蓝牙技术显得太复杂,功耗大,距离近,组网规模太小等,而工业自动化对无线通信的需求越来越强烈。
正因此,经过人们长期努力,Zigbee协议在2003年中通过后,于2004正式问世了。
Zigbee是什么Zigbee是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的CDMA网或GSM网,每一个Zigbee网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里;另外整个Zigbee网络还可以与现有的其它的各种网络连接。
例如,你可以通过互联网在北京监控云南某地的一个Zigbee控制网络。
不同的是,Zigbee网络主要是为自动化控制数据传输而建立,而移动通信网主要是为语音通信而建立;每个移动基站价值一般都在百万元人民币以上,而每个Zigbee―基站‖却不到1000元人民币;每个Zigbee 网络节点不仅本身可以与监控对对象,例如传感器连接直接进行数据采集和监控,它还可以自动中转别的网络节点传过来的数据资料; 除此之外,每一个Zigbee网络节点(FFD)还可在自己信号覆盖的范围内,和多个不承担网络信息中转任务的孤立的子节点(RFD)无线连接。
每个Zigbee网络节点(FFD和RFD)可以可支持多到31个的传感器和受控设备,每一个传感器和受控设备终可以有8种不同的接口方式。
可以采集和传输数字量和模拟量。
Zigbee技术的应用领域Zigbee技术的目标就是针对工业,家庭自动化,遥测遥控,汽车自动化、农业自动化和医疗护理等,例如灯光自动化控制,传感器的无线数据采集和监控,油田,电力,矿山和物流管理等应用领域。
另外它还可以对局部区域内移动目标例如城市中的车辆进行定位.通常,符合如下条件之一的应用,就可以考虑采用Zigbee技术做无线传输:1.需要数据采集或监控的网点多;2.要求传输的数据量不大,而要求设备成本低;3.要求数据传输可性高,安全性高;4.设备体积很小,不便放置较大的充电电池或者电源模块;5.电池供电;6.地形复杂,监测点多,需要较大的网络覆盖;7.现有移动网络的覆盖盲区;8.使用现存移动网络进行低数据量传输的遥测遥控系统。
hc05蓝牙模块工作原理(一)
hc05蓝牙模块工作原理(一)HC05蓝牙模块工作原理简介HC05蓝牙模块是一种常见的串口透传蓝牙模块,它可以与其他蓝牙设备配对,实现无线通信、数据传输等功能。
本文将对HC05蓝牙模块的工作原理进行介绍。
HC05蓝牙模块的硬件配置HC05蓝牙模块通常由蓝牙芯片、无线电信号收发模块、外围电路(如电源管理、信号转换等)组成。
其中蓝牙芯片采用了市场上常见的TI、CSR等厂商的芯片,模块外形一般为长方形,尺寸大小根据厂商的不同而有所区别。
HC05蓝牙模块的通信协议HC05蓝牙模块的通信协议包括基础蓝牙协议和蓝牙串口协议。
基础蓝牙协议包括蓝牙设备之间的配对、连接、认证和加密等工作;蓝牙串口协议是在基础蓝牙协议的基础上衍生出来的,它定义了蓝牙模块与外部设备之间的数据传输格式、速率等信息。
HC05蓝牙模块的工作模式HC05蓝牙模块有两种工作模式:命令模式和通信模式。
命令模式下,用户可以通过串口发送AT指令来设置模块的参数,包括蓝牙名字、波特率、工作模式等内容;通信模式下,模块会将串口接收到的数据通过蓝牙发送出去,或者将从蓝牙接收到的数据通过串口输出。
HC05蓝牙模块的接口定义HC05蓝牙模块一般有6个引脚,分别是VCC、GND、TXD、RXD、EN、STATE。
其中,VCC和GND是模块的供电引脚,TXD和RXD是串口通信引脚,EN是模块的使能引脚,STATE是模块的状态引脚。
HC05蓝牙模块的使用方法使用HC05蓝牙模块需要先将模块接上电源,然后通过串口发送AT指令来设置模块的参数。
设置完成后,可以将蓝牙模块与其他蓝牙设备进行配对,实现数据传输等功能。
具体操作方法可以参考模块厂商提供的使用手册或者相关资料。
总结本文介绍了HC05蓝牙模块的硬件配置、通信协议、工作模式、接口定义和使用方法等方面,需要用到的朋友可以按照上述方法进行操作。
需要注意的是,蓝牙模块在工作过程中需要注意电源供应和信号接口的选择,以免造成不必要的损失。
低功耗蓝牙(BLE)学习记录
RW_BLE_CORE记录传输信道BLE的传输信道在2.4G频段有40个channel。
包括2种物理信道:广播信道和数据信道。
数据帧中设置Access Address用于标识该信道,防止信道碰撞。
Channel MAP如下:数据帧通信蓝牙帧结构如下:Preamble:根据Access Address而定,假如AA的LSB(最右bit)bit为1,则前导便是10101010b,反之则为01010101b。
Access Address:广播帧的AA为:0x8E89BED6。
其他情况可以是一个32bit的随机数。
AA需满足以下条件·不超过连续6个1或者0。
·与广播帧的AA不同bit超过1个。
·不能4byte相同。
·0 1跳变不能超过24次·MSB 6bit 0 1跳变超过2次。
以下逐个介绍PDU。
一、Advertising Channel PDU蓝牙广播帧帧结构其中Header的帧格式如下:其中,a、广播帧类型(PDU Type)分为以下几类:• ADV_IND: connectable undirected advertising event• ADV_DIRECT_IND: connectable directed advertising event• ADV_NONCONN_IND: non-connectable undirected advertisingevent• ADV_SCAN_IND: scannable undirected advertising eventb、Length:3~37bytes广播帧分为很多种,其区别就是payload所代表的意义不同,以下分别对几种广播帧作分别阐释:1、ADV_INDADV_IND的payload格式如下:在广播帧帧头中的TxAdd位是广播地址的标示位:TxAdd==0:AdvA地址为公用地址;TxAdd==1:AdvA地址为随机地址。
知识点0301蓝牙串口模块
+5V
GNDTXຫໍສະໝຸດ RX蓝牙串口模块正面图的上方第
一个引脚代表+5V,依次为
GND,TX,RX
2、绘制接线图
nano板与蓝牙串口的搭接图(蓝牙串口 RX,TX端分别连至nano板TX,RX端)
3、应用电路搭接
nano板上的(RX、 TX)接口接至蓝 牙串口端的(TX、 RX),电源与接 地对应相连
三、编程与调试
3、程序下载及运行
演示运行效果
知识点0301 蓝牙串口模块
主讲人:宁波鄞州职业教育中心学校 陈浙 (Arduino功能模块与应用)
一、蓝牙串口介绍 二、应用电路搭接 三、编程与调试
一、蓝牙串口介绍
1、蓝牙串口介绍
1. 核心模块使用HC-06从模块,引出接口包括 VCC,GND,TX,RX
2. led指示蓝牙连接状态,闪烁表示没有蓝牙连接,常亮表示 蓝牙已连接并打开了端口
3. 底板3.3V LDO,输入电压3.6~6V,未配对时电流约 30mA,配对后约10mA,输入电压禁止超过7V
4. 接口电平3.3V,可以直接连接各种单片机 5. 空旷地有效距离10米 6. 配对以后当全双工串口使用,无需了解任何蓝牙协议,但
仅支持8位数据位、1位停止位、无奇偶校验的通信格式, 不支持其他格式
波特率 编号
7 8 9 A B
对应 波特率
57600 115200 230400 460800 921600
3、改蓝牙名称 发送:AT+NAMEname 返回: OKname 4、改配对密码 发送:AT+PINxxx 返回:OKsetpin
6
38400
C
1382400
二、应用电路搭接
[蓝牙] 1蓝牙核心技术了解(蓝牙协议架构硬件和软件笔记)
[蓝牙] 1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料。
由于有些文章只做参考或统计不足,如涉及版权请在下面留言~。
同时我也在博客分类中新建一个蓝牙通信分类,用来研究分享蓝牙相关技术。
下载连接:Bluetooth PROFILE SPECIFICATIONS (基本涵盖所有蓝牙协议)、buletooth core 2.1-4.0 SPECIFICATION(三蓝牙版本的核心协议v2.1\v3.0\v4.0)、蓝牙核心技术与应用马建仓版(蓝牙协议相关初学者必读,开发者参考)蓝牙核心技术概述(一):蓝牙概述蓝牙核心技术概述(二):蓝牙使用场景蓝牙核心技术概述(三):蓝牙协议规范(射频、基带链路控制、链路管理)蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、A VDTP、A VCTP)有道笔记分享链接:/share/?id=950d00cefa9b7fd3c559eec34 9805b24&type=note下面是摘抄笔记内容:蓝牙核心技术概述(一):蓝牙概述蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。
能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。
蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。
其数据速率为1Mbps。
采用时分双工传输方案实现全双工传输。
蓝牙模块介绍
蓝牙模块介绍:主机模块实物与从机一样,模块上有白点,主机模块会自动和从机模块配对,省却配对的麻烦,适合在需要两个设备间通过蓝牙串口无线通信的应用,无需电脑.蓝牙透传模块可以让你原来使用串口的设备摆脱线缆的束缚在10米范围内实现无线串口通信。
使用该模块无需了解复杂的蓝牙底层协议,只要简单的几个步骤即可享受到无线通信的便捷。
蓝牙透传模块只有4个AT指令,分别是测试通讯,改名称,改波特率,改配对密码,AT指令必须从TXD,RXD信号脚设置,不能通过蓝牙信道设置。
发送AT指令的设备可以是各种类型的MCU(比如51,avr,pic,msp430,arm等),也可以是电脑通过串口(PC串口接MAX232以后或者USB转串口)发送。
特别注意:1、主机模块和从机模块均不能切换工作模式,只能是单一的工作模式(主或从)2、主机模块只能配对HC06的从机模块,主机模块之间不能配对连接,主机模块也不能跟带蓝牙的电脑或者手机等其他蓝牙设备配对3、从机模块可以跟带蓝牙的电脑或者部分带蓝牙的手机配对使用,从机模块之间不能连接,如果电脑没有蓝牙适配器,可以购买我们的蓝牙适配器(地址:/item.htm?id=137********&),4、主机模块的AT指令比从机模块少了AT+NAME指令,其他指令相同5、主机模块和从机模块的接口均为3.3V电平,可以直接连接各种TTL电平带串口MCU(5V的MCU请串联1K电阻)直接连接,设置参数可以用MCU或者本店的USB转串口,或者增加MAX232转换电路后的电脑串口小常识:TXD:发送端,一般表示为自己的发送端,正常通信的时候接另一个设备的RXD。
RXD:接收端,一般表示为自己的接收端,正常通信的时候接另一个设备的TXD。
正常通信时候本身的TXD永远接设备的RXD!自收自发:顾名思义,也就是自己接收自己发送的数据,也就是自身的TXD接到自身的RXD,用来测试本身的发送和接收是否正常。
蓝牙模块应用必读
蓝牙模块应用必读
双击自动滚屏发布者:admin 发布时间:2008-3-12 10:49:48 【字体:大中小】
购买蓝牙模块的用户,使用中请注意以下几点:
1、供电问题:蓝牙模块供电为3.3V,百米蓝牙模块供电采用两级供电,包括VCC和PAVCC,其中PAVCC 是功率扩展电源,使用中一定要两个都供给3.3V。
2、接地问题:模块中有多个GND引脚,使用中应将全部GND接地。
3、PIO引脚指示问题:在模块应用中,有的PIO是蓝牙模块工作状态指示,建议您最少引出一个做为工作状态监测引脚,如PIO5,未建链时输出800ms的脉冲信号,建链后输出200ms的脉冲信号,详细引脚功能定义请参考相应免费蓝牙固件应用说明。
4、音频应用:
音频应用中,如果您的电路板上有别的音频电路,建议将蓝牙模块单独稳压供电,减少干扰噪声。
蓝牙模块的MIC输入与SPK输出采用平衡电路接法,与外围电路连接时需要平衡非平衡转换器件,详细请看最新音频电路参考设计。
5、不用的引脚:模块中可能有许多你不需要的引脚,不用的引脚一律悬空。
6、SPI接口:SPI接口是模块固件升级和参数修改有接口,共4条线,在布设PCB板时,建议引出焊盘,便于今后固件维护。
7、GC-05/06的兼容问题:GC-05是百米蓝牙模块,GC-06是10米蓝牙模块,两者引脚完全兼容,建议您在PCB布板时,按GC-05设计,然后按需要插入GC-05、06都可以,这样在产品应用中更换10米100米不同功率的模块时,更方便。
cc2540
cc2540cc2540篇1:cc2540 cc2541 低功耗实测和总结CC2541 CC2540 实现超低功耗是非常重要的:我们来总结一下实现方法:1,有定时器在跑时会一直跑在PM2电流在300uA左右。
没有定时器跑后会到PM3,电流会少于10uA。
这个定时器是指osal的定时器,例如:启动了osal_start_timerEx( keyfobapp_TaskID, KFD_TOGGLE_BUZZER_EVT, 2000 );但没到时间:需要说明的是keyfob中的低功耗一直都是进不去PM3的,这是由于有一个查询电量的定时器一直在跑:osal_start_timerEx( keyfobapp_TaskID, KFD_BATTERY_CHECK_EVT, BATTERY_CHECK_PERIOD );把它注释掉就会进PM3了。
电流小于10uA 。
因此,如果你想低功耗到但是又想启用定时器是不现实的。
2,如果有外部中断,比如开关量如按键,一定,一定,一定需要用下降沿中断,目前我上升沿中断调不出来,并且,常态时如果是低电平输入,会比较耗电。
实测,低电平输入会比高电平输入多200uA左右。
总结一下:常态下是PM1要进入PM2,首先,确认你的option的编译宏设置了POWER_SAVING然后代码中,需要执行osal_pwrmgr_device( PWRMGR_BATTERY );即可,电流还有200uA呀,怎么办?要进入Pm3,需要你没有osal的定时器在跑。
详见我们提供的例程。
附件例程上电就广播30s,电流500uA,使用AmoBleTool.apk连接后,电流在小于10uA此时,已经开通了3个电平中断,分别是P0.0,p0.1与p0.4任意一个中断产生,AmoBleTool.apk都键收到数据,请注意观察。
电流测试方法为在供电电路上串一个电流表即可。
cc2540篇2:Ti CC2540蓝牙模块学习笔记整理Ti CC2540蓝牙模块学习笔记整理接触CC2540几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好多没闹明白的地方,以后应该还会继续向里面更新~一、整体1.TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置、网络处理器配置2.协议栈最顶层2个通用profile:GAP 通用访问配置文件层Generic Access ProfileGATT 通用属性配置文件层Generic Attribute Profile3. GAP:处理设备的接入方式及接入过程:①设备发现②链路建立③链路终止④启动安全功能⑤设备配置(主要是连接参数配置)GATT:完成服务器与客户端之间通信的相关子过程4.BLE支持40个信道的跳频机制,其中3个通道用于Advertise,剩下的用于数据通信5.OS抽象层:疑问如何配置一个新的任务,任务的优先级,事件触发机制,消息的传递 6.主要用于实现的是2个代码文件:OSAL_SimpleBLEPeripheral.c 任务回调函数数据的定义和任务初始化函数定义作为OSAL的外部全局变量SimpleBLEPeripheral.c BLE应用程序的实现代码,该源文件调用一系列的API函数,完成复杂的蓝牙协议通过const pTaskEventHandleFn tasksArr[] 数组来存储要调用的函数simpleBLEPeripheral.h 一些常量的定义,和蓝牙应用程序任务初始化和任务回调函数声明。
功放模块蓝牙模块实习报告
实习报告实习内容:功放模块蓝牙模块实习时间:XXXX年XX月XX日实习单位:XXXX科技有限公司一、实习背景及目的随着科技的不断发展,无线音频传输技术逐渐普及,蓝牙作为一种无线传输技术,在音频领域得到了广泛应用。
本次实习旨在了解蓝牙模块在功放模块中的应用,掌握蓝牙模块与功放模块的接线和使用方法,提高自身实际操作能力。
二、实习内容及过程1. 实习内容(1)了解蓝牙模块的基本原理及功能。
(2)学习蓝牙模块与功放模块的接线方法。
(3)掌握蓝牙模块的使用方法,实现音频播放。
2. 实习过程(1)了解蓝牙模块的基本原理及功能蓝牙模块是一种无线通信模块,具有较远的传输距离和较高的传输速率。
其主要功能是实现设备之间的无线连接,以便进行数据传输和音频播放。
(2)学习蓝牙模块与功放模块的接线方法根据参考资料,蓝牙模块与功放模块的接线方法如下:① 将蓝牙模块的电源输入接口与功放模块的电源输入接口连接。
② 将蓝牙模块的音频输出接口与功放模块的音频输入接口连接。
③ 将功放模块的输出接口与音箱的输入接口连接。
(3)掌握蓝牙模块的使用方法,实现音频播放根据参考资料,蓝牙模块的使用方法如下:① 开启蓝牙模块的电源开关。
② 打开手机或其他音频设备的蓝牙功能,与蓝牙模块进行配对连接。
③ 选择合适的音频文件,通过蓝牙模块传输至功放模块,实现音频播放。
三、实习心得与体会通过本次实习,我对蓝牙模块在功放模块中的应用有了更深入的了解,掌握了蓝牙模块与功放模块的接线和使用方法,实际操作能力得到了提高。
同时,我也认识到无线音频传输技术在现代生活中的广泛应用,以及其在提高生活质量方面的重要作用。
实习期间,我遇到了一些问题,如蓝牙模块与功放模块的接线顺序、音频传输延迟等。
在请教同事和查阅资料后,我成功解决了这些问题,并逐渐掌握了蓝牙模块的使用方法。
这使我深刻体会到学习过程中遇到问题是正常的,关键是要勇于请教、积极解决问题,这样才能不断提高自己。
总之,本次实习让我对蓝牙模块在功放模块中的应用有了更深入的了解,使我掌握了相关操作技能,为今后的工作和学习打下了坚实的基础。
HCO5学习笔记
不同的厂家产的蓝牙模块可能会有所不同,需要对厂家要取数据资料,充分了解后再去做实验,减少盲目实验造成的损失。
所用蓝牙模块如图:EN:模式转换引脚STATE:状态输出引脚所用手机蓝牙通讯软件为:蓝牙串口助手(正点原子提供)以下是本人所认为的易错点:1.连接错误:(1)AT 模式下,在使用电脑的串口助手与蓝牙模块进行通讯(中间为单片机上的CH340转串口模块将USB—>TTL电平)时注意HC05_RXD接单片机RX相应HC05_TXD接单片机TX(注意有些单片机上TX与RX的标注是针对于某些设备的,因此有时也会出现HC05_RXD接单片机TX相应HC05_TXD接单片机RX,鉴于大家买的单片机可能不同,这里我感觉可以将两者都试一下,第一种不行换第二种接法)注意波特率为38400(2)数据传输模式下,HC05_RXD一定是接单片机相应串口的TX,HC05_TXD 一定是接单片机相应串口的RX。
在该种模式下我是先使用了波特率9600没有成功,换成38400实现了数据的成功传输。
建议大家都试一试。
2.不要生搬串口程序,在串口程序中有许多标志变量,其不一定适合于蓝牙通信所传输的数据,乱用可能会导致意想不到的错误。
建议先进行简单的中断串口收发实验,然后再根据个人想法设计好所需的中断服务函数。
3.由AT转换成数据传输模式时要先将EN接地,然后像蓝牙发送模块重置指令。
4.实验过成功,通过电脑串口助手发送了AT指令,第一次是加了标点符号的没有成功而去掉标点后成功接收到了’’OK”.如AT+VERSION?失败而AT+VERSION成功。
建议大家都试一试。
程序如下:主函数:#include "stm32f4xx.h"#include "delay.h"#include "led.h"#include "urss.h"extern u16 STA;extern u8 data[DATAMAX];extern u8 res;int main(){u16 i=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);led_init();urss_init(38400);delay_init(168);uart_init(38400);HCO5_SendData(" Preparation is ok!\n");LED=1;while(1){if(res!=0){delay_ms(100);if(STA==1){for(i=0;i<res;i++){USART_SendData(USART2,data[i]);while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);}HC05_StateExpression(DATA_LENGTH, res);USART_SendData(USART2,res);while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);STA=0;res=0;}else res=0;}LED=~LED;delay_ms(500);}}urss.c(主要配置文件)#include "urss.h"#include "sys.h"#include "usart.h"#include "delay.h"u16 STA=0;u8 data[DATAMAX];u8 res=0;void urss_init(unsigned int bound)//{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_ART_BaudRate=bound;USART_ART_HardwareFlowControl=USART_HardwareFlowControl_ None ;USART_ART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_ART_Parity=USART_Parity_No ;USART_ART_StopBits=USART_StopBits_1 ;USART_ART_WordLength=USART_WordLength_8b ;USART_Init(USART2,&USART_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn ;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);USART_Cmd(USART2,ENABLE);}u8 TransData(u8 com){switch (com){case 0 : com=48;break;case 1 : com=49;break;case 2 : com=50;break;case 3 : com=51;break;case 4 : com=52;break;case 5 : com=53;break;case 6 : com=54;break;case 7 : com=55;break;case 8 : com=56;break;case 9 : com=57;break;default: com=2; break;}return com;}void HCO5_SendData(char* outdata){u8 temp;for(temp=0;outdata[temp]!='\0';temp++){USART_SendData(USART2,outdata[temp]);while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);}}void HC05_StateExpression(char* outdata,u8 com){u8 temp;for(temp=0;outdata[temp]!='\0';temp++){USART_SendData(USART2,outdata[temp]);while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);}com=TransData(com);USART_SendData(USART2,com);while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);USART_SendData(USART2,'\n');while (USART_GetFlagStatus(USART2,USART_FLAG_TC)==0); }void USART2_IRQHandler(){if(USART_GetITStatus(USART2,USART_IT_RXNE)){if(USART_ReceiveData(USART2)=='#')STA=1;else{data[res]=USART_ReceiveData(USART2);res++;}USART_ClearITPendingBit(USART2,USART_IT_RXNE);}}头文件:#ifndef URSS_ZLD#define URSS_ZLD#define DATAMAX 200#define DATA_LENGTH "\nThe length of data is:"#include "sys.h"u8 TransData(u8 com);void urss_init(unsigned int bound);void HCO5_SendData(char* outdata);void HC05_StateExpression(char* outdata,u8 com);#endif其他:文件LED.C:#include "led.h"#include "sys.h"void led_init(){GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_9);LED1=0;}LED.h#ifndef LED_ZLD#define LED_ZLD#define LED PFout(9)#define LED1 PFout(10)void led_init(void);#endif。
蓝牙4.0规范学习总结
蓝牙4.0规范学习总结【篇一:蓝牙底层之baseband层学习总结】蓝牙baseband学习笔记目录:概述物理信道物理连接逻辑传输逻辑连接数据包比特流加工链路控制器音频处理一、概念描述蓝牙时钟:bluetooth clock蓝牙设备地址:bluetooth device addressing这里需要介绍下蓝牙时钟:二、物理信道物理发射功率在2.402ghz到2.480ghz之间,有79个信道。
在连接状态、同步扫描状态和同步队列状态最大调频速率为1600跳/s;在请求和寻呼状态中最大调频速率为3200跳/s。
跳频序列是双方约定的一组伪随机数。
定义的5中信道:basic piconet physical channel 在连接状态默认使用adapted piconet physical channel 修改过的piconet连接使用 page scan physical channelinquiry scan physical channelsynchronization scan physical channel第一二种用于基础和改变后的piconet连接第三种寻呼扫描信道用于扫描连接设备。
第四种请求扫描信道使用native时钟第五种同步扫描信道用于设备接收同步队列包主从设备的定义是在两个建立连接的设备之间有意义。
蓝牙管理中搜索周围设备(device discovery),会进行page scan;page scan其实是不停的进行多次inquiry scan,知道外部某个条件才中断。
page scan中两次inquiry scan间隔一般是30s。
三、物理连接一个物理连接代表设备间的基带连接。
一个物理连接总是和一个确定的物理信道关联。
物理连接用共同的属性:在物理连接上申请逻辑传输。
power controllink supervisionencryptionchannel quality-driven data rate changemulti-slot packet control四、逻辑传输主从设备之间不同的逻辑传输可能被确立,定义了六种逻辑传输synchronous connection-oriented (sco) logical transportextended synchronous connection-oriented (esco) logical transportasynchronous connection-oriented (acl) logical transportactive slave broadcast (asb) logical transportparked slave broadcast (psb) logical transportconnectionless slave broadcast (csb) logical transport.sco:用于有时限的信息例如声音或者一般的同步数据。
HC05学习笔记
HC05学习笔记一、我为什么要学习蓝牙?我们老板又开了一家公司,做蓝牙手环等智能产品,貌似还不错。
市场上的蓝牙产品也越来越多,找个工作,一般都有一条要求,了解2.4G。
再想想HC05也是2.4G,技多不压身,就上吧。
没多想,下单!等待收货!二、突然想放弃1、等待收货中,我突发奇想,想用蓝牙做点东西,后来网上一搜,我已经没有竞争力了,于是放弃了。
2、蓝牙水有点深,HC05又是透传,换句话说,基本学不到东西......三、重拾HC05迫于无奈只能签收,后悔花了冤枉钱,郁闷了几天。
东西买了,总不能一直放着不用吧,钱都花了,为了不辜负我的大洋,还是将就下吧,结果悲剧就发生了......总结了一句话:将就没有好结果;再后来又,总结一个词:一般;最后,总结一句话:柳暗花明又一村。
四、直入正题把资料看了N遍,着重看了试验步骤。
以为没问题了,多简单的模块,无非收发数据,谁不会,谁是菜鸟!想想怎么揉虐吧,我没什么好手段,没什么经验,求大神赐教!资料网上大把,自己搜吧,我买的正点原子的ATK-HC05,资料网上很多,具体接线,随意。
下图一定注意:1、电源不解释,不会接的,说明你不适合,不要勉强;2、注意红色部分,TTL和232的区别,如果你不了解,说明你不适合,不要勉强;3、不会利用电路板本身串口的,说明你不合适,不要勉强。
勉强真的不会有好结果!!!线路接好后,直接上机测试?佛曰:SB上帝说:FOLLOW ME,You can fly with me!1、3都好理解。
2怎么实现,其实2真的很二,前年老二。
我看了N次,实验了很久,一直没对,我开始怀疑是不是官网也卖假货,或者处理货?后来发现,实现2很简单,就是当手机和模块连接好以后,KEY拉高,就进入了。
只是原作者不想告诉你罢了。
另外注意:波特率38400,如果不对,自己切换。
先修改软件去匹配。
AT了解完了,上机?我曰:SB想办法,232转TTL,直连PC,使用原子的串口软件,线测试下你买的模块是不是好的。
蓝牙模块学习笔记(1)
蓝牙模块学习笔记(1)牙搜索,可以搜索到HC-06.点击连接,输入pin密码则可以连接。
连接好后,利用蓝牙串口助手就可以对蓝牙模块通信了,编程也就可以把蓝牙当作普通串口来对待。
注意编写好程序后,向单片机烧录时,必须将TXD、RXD拔出才能烧写!!!问题:串口发送字符串时,最后没有标志可寻。
可以将字符串接收到数组中,发送数据到12864,检测是否到’\0’,如果检测得到,将标识符flag 置为1;串口中断服务程序中,检测到flag为1时,这证明数据显示成功。
此时应当清屏!清屏方法:while(Tem[i]!='\0'){Tem[i]=' ';i++;}/************************************** *********************STC89C52RC与HC-06蓝牙连线:RXD TXDTXD RXD其他连线:P2.0、P2.1、P2.3分别接一个指示灯*************************************** ********************/#include <reg52.h>#include <intrins.h>unsigned char tmp;unsigned int c=0;sbit led1=P1^0; //指示灯0sbit led2=P1^1; //指示灯1sbit led3=P1^2; //指示灯2sbit beep=P3^2; //蜂鸣器void init(); //串口初始化void send(unsigned char a); //单字节发送函数void ctrl(); //接收处理函数void delay(unsigned int x){unsigned int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}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开始工作,产生波特率//发送标志位置TI=0; //接收标志位置0RI=0;//EA=0;ES=1;led1=0;//初始化设置3个指示灯全亮led2=0;led3=0;}void send(unsigned char a) //单字节数据发送{ //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。
BLE蓝牙 4.0 学习笔记
蓝牙4.0 BLE center与peripheral建立连接绑定过程 (2)蓝牙4.0 BLE peripheral 广播设置 (7)蓝牙4.0 BLE 数据传输(一) (11)蓝牙4.0 BLE 数据传输(二) (12)蓝牙4.0 BLE 数据传输(三) (16)蓝牙4.0 BLE 数据传输(四) (19)蓝牙4.0 BLE 数据传输(五) (23)蓝牙4.0 BLE 程序设计相关问题解答(转载) (25)蓝牙4.0 BLE SimpleBLEPeripheral_添加新CHAR值及UUID (33)蓝牙4.0 BLE peripheral 广播设置学习笔记(转载) (45)蓝牙4.0 BLE key处理过程看任务、事件、消息机制 (50)CC254x 内部存储结构FLASH (53)蓝牙4.0 BLE FLASH 操作 (58)蓝牙4.0 BLE center与peripheral建立连接绑定过程蓝牙主机从机建立连接绑定过程center与simplePeripheral建立连接过程center首先进行osal_init_system()初始化各个任务,SimpleBLECentral_Init->osal_set_event( simpleBLETaskId, START_DEVICE_EVT );进入SimpleBLECentral_ProcessEvent()调用VOID GAPCentralRole_StartDevice( (gapCentralRoleCB_t *) &simpleBLERoleCB );//当初始化完成,会发送GAP_DEVICE_INIT_DONE_EVENT由于注册了simpleBLERoleCB函数,因此发送的event由simpleBLERoleCB函数接收static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )此时pEvent->gap.opcode =GAP_DEVICE_INIT_DONE_EVENT,相应信息存储于pEvent中typedef union{gapEventHdr_t gap; //!< GAP_MSG_EVENT and status.gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure.gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure.gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure.gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure.} gapCentralRoleEvent_t;联合体,只有deviceInfo里面的数据是正确的typedef struct{osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and statusuint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENTuint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDRuint16 dataPktLen; //!< HC_LE_Data_Packet_Lengthuint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets} gapDeviceInitDoneEvent_t;能获得如设备地址等信息设备初始化完成通过串口发送'1'触发设备发现进行设备扫描GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered.GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete.当发现一个设备时,触发一个设备info事件同样是在simpleBLECentralEventCB 处理此时pEvent改变为deviceInfo可以获得广告设备的类型,地址。
蓝牙4.0规范学习总结
蓝牙4.0规范学习总结篇一:蓝牙底层之BaseBand层学习总结蓝牙Baseband学习笔记目录:概述物理信道物理连接逻辑传输逻辑连接数据包比特流加工链路控制器音频处理一、概念描述蓝牙时钟:BluetoothClock蓝牙设备地址:BluetoothDeviceAddressing这里需要介绍下蓝牙时钟:二、物理信道物理发射功率在2.402GHz到2.480GHz之间,有79个信道。
在连接状态、同步扫描状态和同步队列状态最大调频速率为1600跳/S;在请求和寻呼状态中最大调频速率为3200跳/S。
跳频序列是双方约定的一组伪随机数。
定义的5中信道:?basicpiconetphysicalchannel在连接状态默认使用?adaptedpiconetphysicalchannel修改过的piconet连接使用 ?pagescanphysicalchannel?inquiryscanphysicalchannel?synchronizationscanphysicalchannel第一二种用于基础和改变后的piconet连接第三种寻呼扫描信道用于扫描连接设备。
第四种请求扫描信道使用Native时钟第五种同步扫描信道用于设备接收同步队列包主从设备的定义是在两个建立连接的设备之间有意义。
蓝牙管理中搜索周围设备3.0都还尚未完全普及,BluetoothSIG。
BluetoothSIG表示,正式推出Bluetooth4.0的用意就是希望能够通过单一的接口,让应用系统自己挑选技术使用,而不是让消费者进行设备互连时,还要手动选择各项设备的连接模式,这一人性化的功能取向显然沿袭了蓝牙关注可用性和实际体验的设计思路,三种应用模式中,因为经典蓝牙和高速蓝牙都只是对旧有蓝牙版本的延续和强化,下面我们将重点阐述将全新的低功耗蓝牙技术。
Bluetooth4.04.0,低耗电模式在应用模式上的改变和提升低功耗蓝牙的前身其实是NOKIA开发的Wibree技术,本是作为一项专为移动设备开发的极低功耗的移动无线通信技术,在被SIG接纳并规范化之后重新命名为BluetoothLowEnergy通过低功率无线电波传输数据,其本质是一种支持设备短距离通信领域,也就是个人起居活动范围的方圆10米之内,却容纳了包括音频、互联网、移动通信、文件传输等在内的非常多样化的应用取向,加上强调自动化和易操作性,因此在这一领域里很快就得到了普及,虽然在蓝牙的发展过程中一度曾偏离了这一主旨,但Bluetooth4.0的出现无疑揭示了Bluetooth对自身核心价值的反思和回归。
HC-08蓝牙模块的基本知识
HC-08蓝⽛模块的基本知识先发点官⽅的⽂件,了解下AT的东西⾃⼰下载去⾥⾯有所有的资料,看不明⽩没关系有这么⼏个引脚RXDTXDGNDVCCKEYSTATE有的单⽚机提供了蓝⽛模块的接⼝,直接安装就可以了没有提供蓝⽛接⼝的话单⽚机的TXD应该连接蓝⽛的RXD,交叉连接。
然后⽐较重要的是看看⼿册的引脚,因为不同的引脚对应不同的通讯功能看看⼿册的引脚,因为不同的引脚对应不同的通讯功能看看⼿册的引脚,因为不同的引脚对应不同的通讯功能然后发⼀下写的程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//--定义使⽤的IO--//sbit LED=P1^3;//--声明全局函数--//void UsartConfiguration();void Delay_1ms(uint i);void Com_Int(void) interrupt 4{uchar i;uchar receive_data;receive_data = SBUF;//接收到的数据RI=0;SBUF=receive_data;while(!TI);TI=0;if(receive_data == '1'){P1=0xfe;}if( receive_data == '2'){P1=0xFD; //其他情况灯灭}if( receive_data == '3'){P1=0xFB; //其他情况灯灭}if( receive_data == '4'){P1=0xF7; //其他情况灯灭}if( receive_data == '5'){P1=0xEF; //其他情况灯灭}if( receive_data == '6'){P1=0xDF; //其他情况灯灭}if( receive_data == '7'){P1=0xBF; //其他情况灯灭}if( receive_data == '8'){P1=0x00; //其他情况灯灭}if( receive_data == '9'){P1=0xff; //其他情况灯灭}}void main(){UsartConfiguration();//初始化串⼝while(1);}void UsartConfiguration(){SCON=0X50; //设置为⼯作⽅式1,8位数据,可变波特率TMOD=0X20; //设置计数器⼯作⽅式2// PCON=0X00; //波特率不加倍TH1=0XFd; //计数器初始值设置,9600@11.0592MHzTL1=0XFd;TR1=1; //打开计数器ES = 1; //开串⼝中断EA = 1; //开总中断REN=1;}void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=110;x++);}receive_data = SBUF;//接收到的数据RI=0;这段代码是接受SBUF=receive_data;while(!TI);TI=0;这段代码是回传(可以没有)就这么多吧然后蓝⽛的GND和单⽚机的GND必须是⼀起的,提供⼀致的电平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
蓝牙模块学习笔记(1)蓝牙模块学习刚拿到蓝牙模块,心中有点小激动啊;民用级:HC-05,HC-06(HC-06-M,HC-06-S)HC-05-D,HC-06-D(是带底板的模块,主要是用户用于测试和评估)本文介绍的为HC-06蓝牙串口模块。
蓝牙串口模块用于把串口转换为蓝牙,这种模块工作的时候分为主机和从机,其中偶数命名的型号出厂时就确定了是从机或者是主机,并无法更改。
奇数命名的型号可以用户自己通过AT指令修改模块为主机或者从机。
主机:HC-06-M , M=master从机:HC-06-S , S = slaver串口模块的使用,是不需要驱动的,只要是串口就可以接入,配对完毕即可通信,模块与模块的通信需要至少 2 个条件:1、必须是主机与从机之间2、必须密码一致(密码:1234)主机:记忆最后一次配对过的从机,并只与该从机配对,直到KEY(26 脚)高电平触发时放弃记忆,26 脚默认应该接低电平。
配对方式:主机自动搜索从设备进行配对。
典型方式:在一定条件下,主从之间自动配对AT 模式:配对前就是AT 模式,配对完毕后透明通信图1 是HC-06 图片及主要引脚现在你手中拿到的HC-06引出了四个引脚,分别为VCC、GND、TXD、RXD。
四个引脚分别对应单片机的电源5V或3.3V;GND接地;TXD、RXD交叉连接(对应单片机的P3^0,P3^1)。
连接好,单片机上电,此时蓝牙模块上led闪烁,表示尚未连接其他蓝牙设备。
此时用手机蓝牙搜索,可以搜索到HC-06.点击连接,输入pin 密码则可以连接。
连接好后,利用蓝牙串口助手就可以对蓝牙模块通信了,编程也就可以把蓝牙当作普通串口来对待。
注意编写好程序后,向单片机烧录时,必须将TXD、RXD拔出才能烧写!!!问题:串口发送字符串时,最后没有标志可寻。
可以将字符串接收到数组中,发送数据到12864,检测是否到’\0’,如果检测得到,将标识符flag 置为1;串口中断服务程序中,检测到flag为1时,这证明数据显示成功。
此时应当清屏!清屏方法:while(Tem[i]!='\0'){Tem[i]=' ';i++;}/************************************** *********************STC89C52RC与HC-06蓝牙连线:RXD TXDTXD RXD其他连线:P2.0、P2.1、P2.3分别接一个指示灯*************************************** ********************/#include <reg52.h>#include <intrins.h>unsigned char tmp;unsigned int c=0;sbit led1=P1^0; //指示灯0sbit led2=P1^1; //指示灯1sbit led3=P1^2; //指示灯2sbit beep=P3^2; //蜂鸣器void init(); //串口初始化void send(unsigned char a); //单字节发送函数void ctrl(); //接收处理函数void delay(unsigned int x){unsigned int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}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开始工作,产生波特率//发送标志位置TI=0; //接收标志位置0RI=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;elseled3=0;c++;}void ctrl() //接收处理函数{switch(tmp){c ase '1':led1=1; //收到字符1,指示灯0灭send(tmp);beep=0;delay(500);break;case '2': //收到字符2,指示灯1灭led2=1;send(tmp);beep=1;delay(500);break;case '3': //收到字符3,指示灯0、1亮led1=0;led2=0;send(tmp);beep=1;delay(500);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);beep=1;delay(500);}}以下是蓝牙接收字符串并向12864显示程序/**************************************** *************************************8*任广俊*日期:12.17*蓝牙接收并显示在12864上,1,2,3控制发光二极管*4,5控制继电器***************************************** *************************************/#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit LCD_EN=P3^4; //液晶使能1使能,0使不能sbit LCD_RS=P3^5; //寄存器选择1数据,0命令sbit LCD_RW=P3^6; //液晶读写控制1读出,0写入sbit LCD_PSB=P3^7; //串行口控制1并行,0串行sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit beep=P3^2; //蜂鸣器sbit jdq=P1^6; //继电器uchar code dis1[]={"I Love MCU !"};uchar code dis2[]={"单片机学习"};uchar Tem[20];uchar dis3[8];unsigned char a=0; //定义临时变量uchar flag,flag2=0;uchar temp,i,c;void delay(uint x){uint m,n;for (m=x;m>0;m--)for(n=110;n>0;n--);}/**************************************** ***************************************** **********************12864液晶显示***************************************** ***************************************** *********************///写指令:RS=L;RW=L;E=高脉冲;D0-D7=指令码void write_cmd(uchar cmd ){LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}//写数据到LCD:RS=H;RW=L;E=高脉冲D0-D7数据void write_dat(uchar dat){LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}//设定显示位置void lcd_pos(uchar x,uchar y){uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write_cmd(pos); //显示地址}void lcd_init() //lcd初始化{LCD_PSB=1; //并口方式write_cmd(0x30); //基本指令喜僮? delay(5);write_cmd(0x0C); //显示开关光标delay(5);write_cmd(0x01); //清除lcd显示内容delay(5);}/********************************************************************************* **********************************/void BT_init() //蓝牙串口初始化{ES=0; //关中串口中断SCON = 0x50; // REN=1允许串口接收状态,串口工作方式1//10位UART(1起始位,8数据位,1停止位?,无奇偶校检TMOD = 0x20; // 定时器1,工作方式2TH1=TL1=0xFD;// 设置波特率9600PCON &= 0x7f; // 波特率不倍增TR1 = 1; //允许串口中断TI=0; //发送标志0RI=0; //接收标志0ES=1;EA= 1; //开总中断led1=0; //初始化为全亮led2=0;led3=0;}void send(unsigned char a) //单字节数据发送{TI=0;SBUF=a;while(TI==0);TI=0;write_dat(a);if(c%2) //发送指示灯{led3=1;delay(500);led3=0;}c++;}}void main(){BT_init(); //Bluetooth 初始化lcd_init(); //液晶显示初始化while(1){/**************************************** ***************************************** **液晶显示区***************************************** ***************************************** *******/// write_cmd(0x01); //清除lcd显示内容lcd_pos(0,0); //向第一行首位置写数据i=0;while(dis1[i]!='\0'){write_dat(dis1[i]);i++;}lcd_pos(1,0); //向第二行首位子写数据i=0;while(dis2[i]!='\0')write_dat(dis2[i]);i++;}delay(10);lcd_pos(2,0); //向第二行首位子写数据i=0;while(Tem[i]!='\0'){write_dat(Tem[i]);i++;}flag=1;}}void UART_SER (void) interrupt 4 //串口中断服务程序{while(RI) //接收到数据{if(flag==1) //字符串发送完毕{flag=0;a=0;//数据标志清零i=0; //数据清零while(Tem[i]!='\0') //向lcd写空格{Tem[i]=' ';i++;}}RI=0; //清除标志位Tem[a++]=SBUF; //读取缓冲区的值}}AT 指令集进入AT 指令的方法:给模块上电,不配对的情况下,就是AT 模式了。