前言* \9 J3 Z! p( M- {
这次主要以STM32f103zet6小系统板来操作,依旧使用库函数入手,寄存器版本可能要到后续再做更新,今天我们主要是来讲一下蓝牙通信!
* n, o6 S* K r1 ^0 H5 a7 A$ ?2 Y* t# |; q5 ~! s! y
一、蓝牙模块简介; e: D2 E% [2 X4 u% q
关于蓝牙模块的使用相信大家在浏览众多博文中已经心中有数,关于它的指令使用部分,我们有时间再详细介绍介绍,另外在博客上也有许多文章介绍,大家可以学习学习,我也只是个小小搬运工,再把自己的理解写成一篇文章,希望能对大家有所帮助。: Y/ y4 }1 m% f1 Q- o% S
8 u% v9 v6 u9 s6 H( x9 R1 t先看看它的模样吧' o2 ^ H9 b; E% q8 o& ?& o' I
2 e4 t }$ N- o! V& l5 i5 Q0 @
, j+ p( w3 l8 j' o7 e
/ f/ X5 I8 O) \) J
其中我们可以看到用到了四个接口,即RXD、TXD、VCC、GND' `1 g- }4 A7 z$ ^3 i
- {& s# ]0 X6 e: N/ k: x; f
在这里RXD接单片机上串口的TXD,TXD接单片机上串口的RXD,VCC和GND就不用多说了吧哈哈
4 E: Q% b3 ?$ h( a
# q0 h* K* n `3 Y下面代码里面我接的是串口2,即PA2(TXD)和PA3(RXD); g: N* |7 r9 V4 J
8 X/ v. Q4 t* b1 X
然后介绍一下我们要使用到的工具:% h1 t" S! G0 n; {
) ^, ^. P* W. `6 b/ Q+ j( }8 @5 ^
1、单片机STM32f1系列板子,会控制LED灯(啰里啰嗦的我哈哈)1 \ F1 V( U9 E8 `. v# F
- H* r9 O5 B2 y: _2 {
2、手机蓝牙软件(到应用市场搜索蓝牙串口即SPP)
W" |* ?$ Q2 \
4 _# j' t7 C) J3、蓝牙模块HC-05" U/ W: V( S# e7 U5 n$ x
J$ [- g' X3 ]! ~* b) E接下来就直接上代码解释了. z/ _2 f0 m+ T1 B1 r1 j
/ A. { `: U6 d
t3 D- ]) ?9 W9 y6 k9 C. b 二、代码部分详解
# Q- R+ h! s+ A) C蓝牙代码部分:
# s. Y6 ~1 `5 e& Y5 Y9 G% w) M( ?0 u/ n9 U' u) k. B
- #include "lanya.h"
/ W2 d5 n! [0 @, c" T; U - : r& I# t; @& z
- u8 res;, ~) A- a. c! B0 M N1 B, Y
- void lanya_Init(void)* `. l- k' e$ H2 h/ i4 z
- {
+ n. D! @# a: P R* b$ h - , @; B ^; ]' R! t! K1 _; u7 |% j1 t
- GPIO_InitTypeDef GPIO_InitStrue;
9 T- f1 O9 W4 ]/ z! V, @/ J - USART_InitTypeDef USART_InitStrue;
4 K& ^7 Z* f6 G8 ` - NVIC_InitTypeDef NVIC_InitStrue; # d5 r% ?$ u" W3 e! V
% I j+ ? R' z- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);// # B. C# ]7 e6 x9 ]- ^
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// ! R& x1 K9 A7 `$ @9 v' Y
3 u. g$ e% e$ q- GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
1 U+ J7 l. B' {& I' E - GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2; ; G* e. |0 j! O
- GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
C* }8 G8 c' r5 L y - GPIO_Init(GPIOA,&GPIO_InitStrue);
9 j& I' T5 G0 r! w6 f -
1 E8 A/ T, @. s4 s; `5 B" Y7 F+ ^ - GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
9 F0 E. t6 j1 r7 k {7 `, N8 d - GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;
: ~( G, ]' E" b( _7 T - GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; ) `' S ]' J- N5 [3 w" g' ?9 l
- GPIO_Init(GPIOA,&GPIO_InitStrue);3 i" A' U) i6 j' d3 y" ~7 |% S
-
! Z8 P8 J4 @, g* M( I% }. ^ - USART_InitStrue.USART_BaudRate=9600; //波特率设置9600,串口设置( Y1 k2 W/ d) ?# R) L
- USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; - K/ O" p6 c( j6 s# W8 M
- USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; / o& L' K6 M; i: \1 R5 I2 ?" a- C
- USART_InitStrue.USART_Parity=USART_Parity_No;
+ P& V6 v& p" c4 d2 ^7 R - USART_InitStrue.USART_StopBits=USART_StopBits_1; Z' O( \/ @; L9 b1 J
- USART_InitStrue.USART_WordLength=USART_WordLength_8b; . K U+ x, \3 K* Y3 T3 O
" ^, A) z' ^! @6 r A6 x7 b- USART_Init(USART2,&USART_InitStrue);5 j' ~ h$ ^0 |! ]6 ?. K1 P$ p
( Q% v: P N: m: ^" |- USART_Cmd(USART2,ENABLE); //
* ]1 n0 o0 s6 H, k/ w& s* l - . A2 ^+ Z$ d0 g* }' ]! Z
- USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//
& R( X, _3 K: ?0 T- M - . Q( ^/ X. B1 t! P% a! ^; R
- NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn; 5 F# J9 g9 o5 O1 {9 Z( E
- NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; * h$ m5 X n7 ]. s/ k {
- NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0; - A1 C* }! Z3 C
- NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
3 S, m0 `$ m" r7 H! T - NVIC_Init(&NVIC_InitStrue);
+ M& w7 U7 K, _/ e6 J. r7 Y* b/ ]
$ J2 d1 A3 `1 t. F6 R$ O2 I- }
L: ?3 |8 j# |: {. ?
( X$ k1 |1 j c, y I9 D- void USART2_IRQHandler(void) + \: `7 {" L7 Q6 a- S* G
- {
% ?' U2 X8 G! ?! Y I! Y
4 t6 m8 |+ f; {1 M- if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) . J7 o7 `) s) i. _. o
- { - Y3 E, w, z. {6 S& _. ]" Q
- res= USART_ReceiveData(USART2); //接收数据给res' S, p6 b; ?/ o5 B6 Y) ]/ ]" O- m3 u, Q
- // USART_SendData(USART2,res);
- w6 t; e* ~& I0 Q3 c - }
% I/ J3 j7 k* K0 D- Y9 e5 V9 L! r - }
0 @$ ~- J% B! d* f" B, J
复制代码
/ a5 f: w, n+ j+ j$ h( r* y这里主要还是初始化串口,即蓝牙初始化,后面又开启串口2中断接受数据吗,这里因为我采用了串口2,所以并没有开启发送到电脑的串口助手上,我们仅通过与手机软件的互联,这也是我们通过手机端来控制LED的亮灭,进而实现其他高阶操作。
! Q& x( w0 \! V6 k; V* k
) O* i) z! q! Z* |8 _+ P9 L头文件就单纯声明了初始化函数
7 a$ r1 z# o0 H9 R, O
$ z. i3 C: E5 G+ u接下来就是主函数了8 \* C! f( N* A9 D/ r7 w t
$ ^+ D9 ]. l' b* n, i+ L
- #include "led.h"
/ S+ R1 @; S& Y: U( M - #include "delay.h"9 X5 _0 v, S3 Y; R8 M. }" S! p$ N' M
- #include "key.h"
4 `1 q5 r) g/ V/ A7 x. s5 \ - #include "sys.h") V3 T6 n! J. c& Z3 B- Q% f% O
- #include "usart.h"
$ m8 n* u" p& b" z# s6 _+ u - #include "lanya.h"! J; J6 B3 f+ y9 v$ E
- 2 U$ t" ~: [0 n9 e0 J
- extern u8 res;
# K9 ?7 C8 y9 W# v9 ^. U' J - int main(void)3 w" x0 J1 {8 X2 y' C" \2 _
- { 3 F3 }( b2 S: {, N6 p% d
- int i;
3 d* T# l- Q4 s; z$ i! i8 t - char a[]="abcdefg";! ?. P4 L' [% r4 ~6 U/ I/ T
' z3 D% Y# F* W1 F% @- delay_init();
) x. e! Q* \* O# [ - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); ) U' d+ |& c- w, }
- uart_init(115200);
8 E4 ? u0 m' ]6 c, r+ b2 M5 ] - LED_Init(); & _7 B. W+ k' w+ K# O% C2 p
- lanya_Init();
4 }1 D7 a" }2 f. ~ - while(1)
; [- l0 t9 q% O: T4 f0 _' p - {
3 l% I5 c# X# V$ P - if(res=='0')" X& Q* \3 ?4 e' i( G {5 S, V
- {
, J s% C- \- O5 m! q - LED0=0;9 y! ^6 b& b$ x0 N* \7 C
- delay_ms(500);
7 |# Y' M. m! h c [ - for(i=0;i<7;i++)
) \. v4 _' [' f5 Z& D2 X/ e. | - {
0 K d& X3 @% E5 I - USART_SendData(USART2, a<i>);
8 O0 a# |) ?/ d6 |: D - while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
; I" {8 @% y% [+ U2 z -
8 P7 {7 }" k. d, y - }
" v, q- J7 a1 A; T2 ` A. @ - res=0;9 C- _8 b9 O* L
- }
8 q9 E4 ]0 ^4 L! D3 K& l' D1 E - if(res=='1')
2 }! M# P7 ^3 h: v - {
1 z4 P' u% ^/ M! u - LED1=0;
# M% @6 E6 Z# w1 [' I+ t$ l% f; _ - delay_ms(50);# f8 C: i! Z& `5 m% {. f
- res=0;
5 a7 l4 v# C9 ]2 X8 z4 S# v) b - }/ [* ^4 h" A( Z& ^, [ H
- if(res=='2')
6 V6 v: u( |* r! I - {
; [) h" k) Y6 J7 s( i7 T - LED0=1;6 o6 E1 G# [6 r' M+ ^9 s: U
- delay_ms(50);# _- Q; |9 Q8 T# ?1 X
- res=0;
0 L! a/ L, x. Z - }$ K4 f3 n& q* Q9 d G n
- if(res=='3'), c; _5 @. m. X5 P2 y' R
- {+ i, V# Z) D5 {0 [0 O; z
- LED1=1;8 d3 @7 @9 H. ~' g5 i$ v0 ~$ m
- delay_ms(50);
- ^6 p/ H; B- l' p" X: {; I - res=0;& s( X) O* L9 S0 C
- }
[3 ^ F, w, e* q
* E- H2 w& ?+ F$ u9 a* s, Z- } " j$ w5 m% m S7 o
- }</i>
复制代码
9 R/ { |7 N! d- J) J+ ^5 q写的有点乱,见谅见谅哈哈,修改乱了懒得改,这里就是在手机蓝牙串口上输入数字0、1、2、3来控制LED的亮灭,具体见下图: / H" L$ t0 v a: _. C! f [
8 T' y; r( ^! \, ?/ a; t$ j4 i7 ^输入‘0’:- D C9 u6 ~8 x& n6 H8 k
T' ~. e3 ?: e
8 H8 E( ^4 A+ s# |* _" W
7 o) Z, m e" h# G. E: R输入‘1’
& D& P- [; _5 [6 p6 C0 t
' j( H3 A% T4 f$ ?0 g* N! H: c d M& D V
$ q$ r7 ~' D* O9 J* F( w( k" Z
: j# _: F+ {! G 那么学习到这你就会对蓝牙模块有了很简单的理解,就可以操作蓝牙来实现操作其他东西( K* |4 c, C1 r$ {! _
9 k" F3 P- _# L1 E6 N% }2 v
三、总结1 e' O1 l5 e% K4 B: g5 N+ ?
这一讲其实我也没有讲的特别详细,主要理解还不太深刻哈哈,但是尽量的去把自己的东西写出来来,希望对大家有所帮助。
- l) |" G, h6 s/ G5 T* g4 p) i( [6 }! X
8 o$ _# V, x, J |