前言% x+ E W1 r# U) O0 U9 s6 s
这次主要以STM32f103zet6小系统板来操作,依旧使用库函数入手,寄存器版本可能要到后续再做更新,今天我们主要是来讲一下蓝牙通信!3 X" R0 _+ G1 x
: P ^! m Q& g4 I 一、蓝牙模块简介7 V0 \6 P0 A( R5 G3 d+ S5 z
关于蓝牙模块的使用相信大家在浏览众多博文中已经心中有数,关于它的指令使用部分,我们有时间再详细介绍介绍,另外在博客上也有许多文章介绍,大家可以学习学习,我也只是个小小搬运工,再把自己的理解写成一篇文章,希望能对大家有所帮助。4 \, [! F0 p6 `2 w1 U! p, C
! G% y4 y: t% ^( k* X: q
先看看它的模样吧4 d: r5 U. @. T3 S
0 _9 {. m* u# F- N8 B& c
; S K/ }8 R, q# ]; E8 e
) s8 D- T" h0 w- w6 ]其中我们可以看到用到了四个接口,即RXD、TXD、VCC、GND
# H( Z) F+ c+ r5 B o e
: J7 |2 f- g2 T在这里RXD接单片机上串口的TXD,TXD接单片机上串口的RXD,VCC和GND就不用多说了吧哈哈
4 Q6 B5 k; g2 j9 O# c5 l& {* F# r/ ~% r9 b
下面代码里面我接的是串口2,即PA2(TXD)和PA3(RXD)
5 l' X. T4 J5 h( f2 b; }$ C- T( L
然后介绍一下我们要使用到的工具:* P% e. N* _2 m2 C; B. L% k
3 P7 s1 ]9 I, \+ I$ A
1、单片机STM32f1系列板子,会控制LED灯(啰里啰嗦的我哈哈)
% r$ \/ L" c& b3 U- o) ^
4 ?% _+ a3 w3 o$ @% W* `! Q# S: W2、手机蓝牙软件(到应用市场搜索蓝牙串口即SPP)
) ~; a& `6 q X' D6 y
! t* R" c; T) A8 o+ l3、蓝牙模块HC-055 L& S# t* w: F( G
9 s# x0 y8 U6 {' P接下来就直接上代码解释了 _3 j# t7 B3 l* C* T" [
% X- f* w' W$ \. {7 A$ ~/ J' m( L! c
二、代码部分详解/ K) c+ @2 b, m! i3 A. Q' B# C
蓝牙代码部分:* l2 v |2 @& m: }0 S
/ B6 y' i( f+ {$ C4 L- #include "lanya.h"+ h& g+ N+ S& y+ |1 A4 i5 M1 }
- " I6 }5 D6 n3 Z/ P* `
- u8 res;
4 n3 h9 |& N/ ~5 l5 f9 i& F/ G" ? - void lanya_Init(void)! c z+ D8 r5 `- x! T# @
- {
+ ]* E6 l7 A1 d; d, I" a: o - * Q7 {# T& T8 t9 A' w8 D$ {
- GPIO_InitTypeDef GPIO_InitStrue;
) |3 \& _6 |% o - USART_InitTypeDef USART_InitStrue;
2 h l2 N6 v0 r% z) a# C - NVIC_InitTypeDef NVIC_InitStrue; ( P9 K' J {2 z4 q. J9 l
7 t( \6 [/ u( j+ o- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//
/ S2 \6 R1 f; S* }% v2 s - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//
3 ]. U! y9 j! H- h1 x3 v2 Z
' U" M. Y7 P1 |4 p4 K# \- GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
# T+ ?, t: e; P3 | c, O' c - GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;
8 v3 g& g; B' a! V - GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; * K# {! h' {* \0 e" g
- GPIO_Init(GPIOA,&GPIO_InitStrue); : Z+ m( K4 T, F; B6 v" n) R
-
- K7 b+ _$ X( ]+ c( D. S - GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
8 O3 E" h! S3 L r* v5 g - GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3; 2 }: M; r7 R! j
- GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
2 j- T+ Q5 ?* J) R/ ^# Z: p# k) }9 A- F - GPIO_Init(GPIOA,&GPIO_InitStrue);3 x+ e0 s2 G' s z' b$ ^3 a6 o% l
-
% D& e( A1 V& {% Q' f! D - USART_InitStrue.USART_BaudRate=9600; //波特率设置9600,串口设置
( e' W8 `1 w }1 Q - USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; ! S) q) N) ~" s3 F( N) K5 @
- USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
1 U( e0 N( N$ r& ]" ]* l1 G - USART_InitStrue.USART_Parity=USART_Parity_No; 6 T3 S. Q( P- V, c1 z9 x- ~. y
- USART_InitStrue.USART_StopBits=USART_StopBits_1; - ]" x. v% F6 S9 ^2 K$ S
- USART_InitStrue.USART_WordLength=USART_WordLength_8b;
7 y9 v- q( `& s2 S
6 g8 c# A6 [, {" q7 p- USART_Init(USART2,&USART_InitStrue);( T5 a' s' n! E/ \
Z, W/ C7 f5 v! m- USART_Cmd(USART2,ENABLE); //
& T+ C2 n2 L5 q- l4 b7 X8 F6 X, `) \
: h7 A$ J5 \7 m- USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//# L3 r; R1 F* _; J* N
- 2 F: j9 Z1 s" C) C9 }7 T
- NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn; ! J% ~! C7 j* @" X& ^1 e
- NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; 7 v! N T2 E2 `7 ?% ` F
- NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;
. {$ v4 @5 n% s) l' Y - NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
+ v- L( g$ V: t& P - NVIC_Init(&NVIC_InitStrue);
6 d& H6 j% F- R. H - ( G4 r9 C( c% H2 B, h
- } e8 `7 m3 g! b6 q
+ s; o) D* h c& Z6 A( U" A- void USART2_IRQHandler(void) 4 ~, i- x+ x! |7 t1 a; B
- { $ j! G- N" C! W& g/ S2 R
- * ^) `: A, J- g6 m# |% I
- if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
9 h6 q& f4 c+ I* @ - {
% Y5 Q' H& X, \: M6 c# w y - res= USART_ReceiveData(USART2); //接收数据给res: T: {7 p* Q6 h \
- // USART_SendData(USART2,res); 5 ]4 ]. Z- h6 S
- }
2 b' L8 Y4 C3 m+ l - }
( f) b9 s( E1 P
复制代码
( A- v* D, P q7 q- |/ x这里主要还是初始化串口,即蓝牙初始化,后面又开启串口2中断接受数据吗,这里因为我采用了串口2,所以并没有开启发送到电脑的串口助手上,我们仅通过与手机软件的互联,这也是我们通过手机端来控制LED的亮灭,进而实现其他高阶操作。
1 o' D) A5 @# t i: v* F1 V. J# x, C- Y# o: ]1 r& B
头文件就单纯声明了初始化函数
! j! O1 n% ]9 e; R. i1 |
w3 P: x+ b3 w- J/ U接下来就是主函数了
( a3 k; {: S* C5 K8 }( x$ U1 m
0 a% B$ ~5 R; X/ v- #include "led.h"
' u& F' ~' K9 ^+ t* f - #include "delay.h"8 E' k0 P- E, C) i" I( `' s
- #include "key.h"/ l: W9 Q, q F1 O/ C8 M1 |; X6 q
- #include "sys.h"
0 s1 O$ g4 x% V- D6 E8 _ - #include "usart.h"8 u: g/ x$ R/ k) e8 k0 I) ^
- #include "lanya.h"" l6 a/ l: f9 v5 \& C
5 H' K' I8 w/ k$ _* g& \" u- }3 k' c- extern u8 res; 8 Y) `, S+ t$ U* ]$ R) Q
- int main(void)
6 I3 t# C- j& X# Z' E - { ( t$ \* J/ `7 i7 ?& P
- int i;
8 x9 P1 [: q- {% m( g& H) o - char a[]="abcdefg";8 \& E2 k* O( k
6 H$ {$ }, O0 V0 E; R- delay_init();
9 A7 L" F, D8 K5 o$ _1 j" r( J - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
& l. S' n S0 h - uart_init(115200); * F7 B: d0 f6 P4 _ A6 }8 h. O: |8 i
- LED_Init(); / F/ c0 C' G8 b6 n
- lanya_Init();& ^. O; D7 P9 T4 E
- while(1)3 B7 Y- Q4 b( ?5 L8 o& K
- {8 I/ ^7 m0 d3 P5 U0 ]
- if(res=='0')
1 l6 R$ d6 e! }% N+ C/ X6 t3 }9 _ - {3 N: j# c }7 o3 J$ }
- LED0=0;; `- o# s" a5 H# E
- delay_ms(500);
( P) ] ]+ _; _9 n6 i* J2 | - for(i=0;i<7;i++)
. H- K* Z* R% ^; a, b6 E - {0 j. i& s3 [* q
- USART_SendData(USART2, a<i>); , q6 _0 P5 g% g2 z" B' U! L2 J: d
- while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
: C. t) X( N- B3 v3 D" D* O - q# X" [9 Z0 I
- }
+ v6 j* h3 `. L$ r; b% c6 d( w v - res=0;% J, c3 n h6 {- |! M* D' s
- }. A. O2 J# p( @9 N S
- if(res=='1')
% `# F" ]! p# A9 I' Q. Y; V6 t - {' T' X# m8 H% v' s( J
- LED1=0;
8 Q/ D' V8 }# t3 H8 O# W$ Q/ I7 s - delay_ms(50);
# i0 O0 @0 D) V0 r1 n - res=0;) m2 Y q. f1 r' B% a( \
- }
9 C. o6 ]. R% d! N4 n - if(res=='2')
3 j' A" l3 f& S( Y3 U4 z; q0 E# } - {6 _( m$ `$ V& N9 c8 x3 ^
- LED0=1;
8 o% {/ t; ?1 c4 k - delay_ms(50);$ _. L1 Z2 @- |/ V
- res=0;
`2 h8 Q# G/ F" m! q& f - }
: ^2 [; L$ A. q+ W8 f; T - if(res=='3')
5 |& P% F# D5 m; ?) h - {
: S0 M6 Y% i( y1 J- s- S - LED1=1;
8 }6 m/ o& b* E& w7 }' Z& B$ ^0 u - delay_ms(50);
. ^5 d0 u; x H+ ^5 p4 Y - res=0;7 i' c; ?) n0 m4 d3 @( ~
- }
% S$ w+ x* q7 u% w7 A4 u5 L8 } - 0 @+ }: p- f' s3 N
- }
' S9 U1 {5 h& w! d - }</i>
复制代码 # w7 _/ L8 F9 J/ J- N9 _8 e) A
写的有点乱,见谅见谅哈哈,修改乱了懒得改,这里就是在手机蓝牙串口上输入数字0、1、2、3来控制LED的亮灭,具体见下图:
6 d' w. c: R9 [$ X! G* ~1 m5 S1 p; O# [! s d/ ?
输入‘0’:$ [2 ]9 Q- ^/ v7 W3 w
% ]6 G0 {0 g9 P R0 E
9 B1 N' p# i4 c( B
' `3 W* U& x; \1 a$ ?输入‘1’ 7 ?) [2 Z3 ]! Z
6 I' d) q) [( [; S6 D: \
/ J% @3 M) j0 H6 |' X
% W" C1 I J6 u' @' M* @
那么学习到这你就会对蓝牙模块有了很简单的理解,就可以操作蓝牙来实现操作其他东西
, Y: s. A9 e0 W! a4 |! a7 V3 A/ K& s! C% U9 F- ?4 M# M$ D/ E: p
三、总结4 o1 Y; V( h, K/ J( B! A& e) j
这一讲其实我也没有讲的特别详细,主要理解还不太深刻哈哈,但是尽量的去把自己的东西写出来来,希望对大家有所帮助。5 ^2 f$ H7 t/ f0 I& `
6 K l' T4 ]& ?* u. Q, K
1 n) Y" b/ E7 Z; h9 b, z8 ?3 @ |