你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32驱动GY85-IMU模块

[复制链接]
攻城狮Melo 发布时间:2023-3-17 21:32
GY85是一个惯性测量模块,内部集成了三轴加速度计、三轴陀螺仪、电子罗盘、气压传感器等芯片,用于测量和报告设备速度、方向、重力,模块可以将加速度计、陀螺仪、电子罗盘等传感器的数据进行综合,在上位机可以结合各种数据进行惯导算法融合。
+ F+ A6 Y% {" t) a4 A  o# _5 I这里介绍一下STM32驱动GY85的代码,模块与STM32的通信接口是IIC协议,我们采用软件IO口模拟IIC时序进行通信,读取到各个芯片的数据存放在全局变量,关于GY85的介绍以及一些基础知识可以参考这篇博客:点击跳转
  X; Y! h& @' P1 Z/ l- p: }: H0 W: R3 ^) w1 j6 ~
. Y7 N( k6 q- H+ Y; f
芯片说明:& Z2 ^) J$ o2 p
( ~  X) C( k& F( [; e7 w

5 \; d0 X' ]* lADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)2 W) I' b0 N+ |# d  S: @7 r
L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)4 y  Y2 j" |% L5 E/ t
HMC5883L:电子罗盘,测量与地磁北极的偏转角度- x2 u# L/ R" }4 ?' ~2 w  D
BMP085:气压传感器,测量大气压、温度
% h) N8 w1 L9 ?( W6 i! v# [' C下面就是全部的驱动代码了:) A" S, }$ I! r1 Y' a5 M2 a

+ d7 D8 _( H& R" o  q
. y/ r3 W7 _1 J! y' z- N
, `+ ~7 u$ T; S8 n0 e+ V

7 a2 K! x' H5 o/*******************************************************************************, I/ p4 {1 a' X0 j& x
*  函数功能:串口2发送数据  HMC5883L        + ADXL345 + BMP085+L3G4200D(串口2在mian初始化完成); j- L" x0 i* _  }; ]
*  波特率:115200
' V' O: I6 D3 j1 A8 X- X" n*  时间:2020.7.120 P- y. M3 |/ m+ V
*  修改注释:全
% C0 h$ l  P' c*******************************************************************************/* N/ }, j* W# Z" n0 x
/ O" H% [! H, w

1 q8 t" l9 ^5 w/ P9 x/*芯片说明
% E( |7 ]/ B% t! e: y *ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)0 b* |$ L$ }/ [& D( H$ z9 w4 e! _0 l' A6 w
*L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)
* J4 ]* f# A" `4 s7 j( P. r4 V *HMC5883L:电子罗盘,测量与地磁北极的偏转角度3 _6 o/ m. |/ U& R
*BMP085:气压传感器,测量大气压、温度
0 R$ r9 B' V3 i, d+ M*/
- L3 _5 q% R) y3 h- D4 y' ~
) h& R' i/ _7 |* K, e& i- ~
$ l* I! Q7 o* z& G8 R: Y- ^  Q
#include "IMU.h"- D8 K( O+ q& ^

0 T7 F; q/ ~0 z! C# s
; |5 b  P9 f3 H' _6 \, v2 S' U
GPIO_InitTypeDef GPIO_InitStructure;
" W8 C2 F  b. \' [3 C! _6 N! c2 dErrorStatus HSEStartUpStatus;3 g8 ^1 @2 k( J; F- f% E
/ z; z7 t/ N( p

. H1 t( ^* p% |- s4 Q$ M, m0 A& u8 x$ E) Z' A  ^
+ E7 b) D" p0 @7 W! V& a" q& w
#define   FALSE 0
& \/ n* E+ l$ B; q* N7 K#define   TRUE  1
' c3 `4 [  I  c- ~$ e5 x2 d: W* D, |5 |, a6 z$ g. Q, N
7 r- p/ V" y3 Z& i2 \: O! E" H; e
#define   u8 unsigned char
. M" a$ e5 p9 M6 n#define   u32 unsigned int
& F: F: V; W/ a3 p1 k! p- E#define   uchar unsigned char5 r# q5 U. c/ ^8 x% X+ l
#define   uint unsigned int       
, H! N8 Y2 `( q5 q' O4 e/ x+ n#define   OSS 0         //        BMP085使用
$ b' X- A* I5 }! |9 B- d, o9 `
/ m" U: I- Q9 o. ?" T% ^) s* z

3 F2 x$ q" P# X* G! x//L3G4200D内部寄存器$ s; W8 A  k5 K
#define CTRL_REG1 0x207 |, L. h8 F6 i+ b$ k# a
#define CTRL_REG2 0x21' N1 Z8 \8 W- A; Z$ V( J
#define CTRL_REG3 0x22
& H3 i( [* {4 [9 R1 _7 P" v#define CTRL_REG4 0x23& ?4 r, O. M# q, G9 m9 J1 _7 O
#define CTRL_REG5 0x24
3 A2 w0 ~6 B! \- N& y#define OUT_X_L 0x28% M0 a# c5 N* z; @/ x" K2 m$ [  S
#define OUT_X_H 0x29& t4 {. z. R& }9 E- T% o- \. Q
#define OUT_Y_L 0x2A# N9 k; x- o9 D* A# g% C
#define OUT_Y_H 0x2B
& P6 k, q! f' v' J- h#define OUT_Z_L 0x2C+ L+ Z1 }5 v/ E
#define OUT_Z_H 0x2D! e' z( h6 ]0 o6 u5 ?3 K! _- |' N
% M8 p% |% Q* F$ b
  a5 B2 D/ n* M
//定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
5 {. |7 K* G% P' U. H9 O3 R#define        HMC5883L_Addr   0x3C        //磁场传感器器件地址
7 u' }' [: U0 z, a# T( U#define        ADXL345_Addr    0xA6        //加速度传感器器件地址5 Q9 x' I" Z# j5 \
#define        BMP085_Addr     0xee        //气压传感器器件地址
$ U) M. o- Q2 ]. f# L#define        L3G4200_Addr    0xD2        //陀螺仪传感器器件地址
2 t$ [" S) m/ T: m8 C3 m! L9 q$ Y0 g' X" @0 H2 N

$ S  T/ Q8 n2 q$ J1 runsigned char BUF[8];                   //接收数据缓存区,作用是暂时缓存寄存器的值,之后做算法分析+ U- Q2 W/ L9 U/ r+ d) T3 [/ h: z
char  test=0;
' C$ j0 b9 C) |, G* w6 @# W& x% Xint   x,y;- j( D3 W5 }+ N3 w; P" H; w0 O
uchar ge,shi,bai,qian,wan,shiwan;           //uart,显示变量
% u. H; n) p: ?* g
0 {2 w0 p. _5 y4 l8 A/ A
" w$ D4 ?2 K/ T6 Y

+ v8 _2 O1 a0 q8 a0 N* e% A  G

" J8 N  u# n7 c  `. \1 z  Dshort T_X,T_Y,T_Z;                     //陀螺仪输出数据
- r1 x6 B  h3 w2 X" h% P6 C2 sfloat angle;                           //电子罗盘输出角度,与地磁北极的偏转角度2 C7 G( R; T2 {

0 _* H# S7 Q0 Y5 T) i2 Z0 j) h

. o( L1 e' G6 _+ k/* 加速度计ADXL345 数据 */
$ w# W' y2 K2 `* b8 ]5 X( L& Yint A_X,A_Y,A_Z;                       //加速度计读取的寄存器数据" Q- j; |- F9 [9 s$ F% ~- R
short data_xyz[3];                     //加速度计合成数据
  F( z8 e# t# Q' S* H1 qfloat Q,T,K;                           //加速度计x、y、z原始数据
7 S7 _+ {$ z  Z3 P( [float Roll,Pitch;                      //Roll,Pitch角度# a% H' ^) I7 M, F2 g
3 C5 _) `" g: [# H" @

  U5 c2 O8 M% Q9 o: y  z' c  W$ B2 c' `3 S  ]7 B6 \

  I) N- c) M4 T) M: Q; ]) F! g2 Q/* BMP085使用的变量 */: O) t* ^. a% O0 z3 `, s/ o
short ac1;
$ F4 c9 |4 s' k  z/ Vshort ac2;
5 G+ z) R9 H# Y; Z& ushort ac3; + r5 T; B+ I8 b0 G  y( ?- n! [' q
unsigned short ac4;
: _  t9 }- x! \# B& f: U% Hunsigned short ac5;
! _  H! `/ V# h# Punsigned short ac6;4 w1 {) k7 ?* [4 K
short b1;
: S7 m' v. S, s) nshort b2;
! p0 @. h% @  ~4 x$ i' }3 ~" `short mb;: u9 ^' T& a& W% c0 \
short mc;+ o% ~1 r; A( r; o( m- i: ~
short md;! h# f0 `( b  l

5 c0 W8 n0 R1 i; ^. v4 ?
8 c/ G1 C0 z0 _1 ]) b
long  temperature;   //温度2 P, f' Z" y. T% P2 e! ?
long  pressure;      //气压( V% L$ I* ?0 ]& d+ c# f

0 t' k2 ^( d0 L

7 Q6 X6 X6 L* y1 E# l0 l3 p
. O% P/ m, m9 {& E; }/ g  G

6 I& U) `4 b* s5 D$ B //************************************++++++++++++++++++++++++++++++++
) \8 U1 {7 P7 D3 T1 Q/*模拟IIC端口输出输入定义
' y( f+ t" }; r4 e8 e3 I *SDAB9
$ b6 y0 P" W9 E' T+ }: x" z1 \/ L *SCLB8
: b. P/ ?- \" d*/
5 Y1 O. j' L% y#define SCL_H         GPIOB->BSRR = GPIO_Pin_8
6 Q# ~4 k) M8 `9 p, O#define SCL_L         GPIOB->BRR  = GPIO_Pin_8+ K0 P, |/ a! W, I# e* C. Y: a
   3 u0 k7 C8 K4 L# J
#define SDA_H         GPIOB->BSRR = GPIO_Pin_9
. J& A7 ^0 Z. P, i#define SDA_L         GPIOB->BRR  = GPIO_Pin_9
+ R1 S! _  \4 U3 v( K" E$ f, H: n  C- o

5 L& {9 s3 r+ R1 |+ e- i/ t#define SCL_read      GPIOB->IDR  & GPIO_Pin_8
6 E7 J6 J: S/ \#define SDA_read      GPIOB->IDR  & GPIO_Pin_9
; U, d/ f! k' |( D' w2 |; `7 u7 y1 B' h) l3 v

7 A0 ^. F2 Q# p( j
# q, u4 `* R: g( w4 r% [% D
  `; J1 }6 U* d

. J; F" Y( N5 W/ ~
# X6 K! h) U* C3 |! w2 G; `( M
/* 转换数据 */3 H7 y: B2 p9 R+ S: h
void conversion(long temp_data)  " c" ?# J& V' l/ A; @9 N2 W- q2 E
{     3 J1 X) f1 F* T0 a0 v6 _; z
    shiwan=temp_data/100000+0x30 ;& w$ y8 Y5 L5 K% D9 w" T7 \
    temp_data=temp_data%100000;   //取余运算 2 i2 w# w' I( |! @1 M; m  q
    wan=temp_data/10000+0x30 ;
. Z" t) ^" v' c% G. S% ?0 x' M    temp_data=temp_data%10000;   //取余运算+ O9 {2 F  ~/ g& |5 O# ^6 r
        qian=temp_data/1000+0x30 ;
1 R& R% n: i. t    temp_data=temp_data%1000;    //取余运算4 F' o' L1 Q0 [  d; j0 \! w
    bai=temp_data/100+0x30   ;; B; I* G) r  P
    temp_data=temp_data%100;     //取余运算4 g: B9 Y: o% N& }9 H
    shi=temp_data/10+0x30    ;5 d+ b! p9 g3 b8 B/ u
    temp_data=temp_data%10;      //取余运算  E6 m1 l8 ~! b1 T7 H* U
    ge=temp_data+0x30;         * y9 l0 q( U" V! L! C2 x
}# O! v( O$ f' o  o# v' v  }6 h7 D+ {
/*******************************************************************************4 k- u/ D9 a: Q3 x2 }- J/ X# Z" u" D+ k
* Function Name  : I2C_GPIO_Config2 v, U$ x. T( |5 Q5 x8 G2 f: c
* Description    : Configration Simulation IIC GPIO) @& T) O* h7 k. {# B  _# H
* Input          : None
& a7 S0 C7 @9 b: |0 d* Output         : None
! c& F5 d1 O1 w9 V* Return         : None
3 m2 Q! p3 A& E****************************************************************************** */
3 ^5 S& `) R& qvoid I2C_GPIO_Config(void)8 M6 t. _2 \. r; d' A6 F5 [
{* Z, G$ ?& c2 J6 J! @, Z" m# y: u
  GPIO_InitTypeDef  GPIO_InitStructure;
2 R* p, |: X8 b8 Y0 E
0 V2 F  y, }6 a. N# d  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_9;8 B- k. e0 T) v8 ^' \
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
: h/ F& {% j; ~" V  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  0 D- g) F( H) y* Y' Q$ ~' v+ o, M: H
  GPIO_Init(GPIOB, &GPIO_InitStructure);
1 F# q7 g" [) Y. e. {7 C; P3 A( I* F) \
9 U- \5 d; Z' B9 v, I+ m
}
3 V4 D+ Z( ?( W7 |9 j- k: ?
- q6 R9 l$ A7 |, D4 ?( _3 }6 n, Z
( W. K6 d! w  e0 |+ W/ I
/*******************************************************************************/ I' K! T* ]7 b4 Y  @
* Function Name  : I2C_delay5 F  O, T5 I2 e
* Description    : Simulation IIC Timing series delay
- r0 [! S  \6 q& T# z3 w* Input          : None
! d3 }4 ~0 Y" o+ F* Output         : None( O+ v# J4 _2 L% B9 ]/ Z) K
* Return         : None
1 i/ o/ }, d4 _6 c' T****************************************************************************** */
8 p, o" ^5 u- E1 C  I7 \' U1 l0 bvoid I2C_delay(void)
; [) m2 R3 ^8 @1 v7 |' q# t{
3 c, u4 f* t: Q! `4 v& C                $ G) ?5 g2 [5 C+ u# o# c
   u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入3 V( q4 `4 c) s2 j3 U
   while(i) * }; n, r# @' U$ o, `
   {
' r, |5 V/ f+ |3 T9 ]) M+ W/ Q* f     i--;
, l/ V0 C, M$ C   }  
& S- \& t. s' X0 l" W6 u' t}
+ X0 m* D. }3 L" b  X! ?# `/ O# S6 M, _- V
, R5 T- B; I7 T: N- q/ V
void delay5ms(void)
+ T) u/ w" v' o% {5 s, }3 o{3 A  w+ a) c7 }6 C) ^
               
' k/ [' n+ [" u$ W   int i=5000;  0 y' ~+ n( ]* E% ^8 p: g
   while(i) ( y7 G8 S& m0 O2 s! D6 _5 @
   { % k* j$ A% P0 z: ]7 c" |; B. D
     i--;
4 n' b3 e0 a2 F1 A, |9 E4 P& J   }  
* T2 @& s* {4 i, ^. x# Y! D}
0 F5 Y3 M5 T+ x2 N2 V% A/*******************************************************************************
3 X! b! l8 y4 m' d, O* Function Name  : I2C_Start' l' d% j; P  {, e/ f6 d1 ?
* Description    : Master Start Simulation IIC Communication
1 P& i  C9 ^+ `* Input          : None& p; G! u+ `) i$ b- s  t
* Output         : None( D( f2 {) b" B( V
* Return         : Wheather         Start
  u( |5 ?" |/ W: k****************************************************************************** */
: l& x( g: o4 m4 |; a' N, Uuint8_t I2C_Start(void)7 J7 [" N5 l3 D1 N: I* F6 o# E
{
  ~" ^% C0 a9 u  u: G; b        SDA_H;$ h8 o6 I: z, t  W  r: ]
        SCL_H;# G' H9 P* p2 I3 ?: I
        I2C_delay();2 M/ u. R4 V) Z1 H& e6 ~
        if(!SDA_read)return FALSE;        //SDA线为低电平则总线忙,退出
# ?, L6 D0 r$ O" [        SDA_L;
, U( y6 K- ]- n1 h1 W! e* C        I2C_delay();
+ r! _2 X7 h! S+ B2 G  ~9 C/ t        if(SDA_read) return FALSE;        //SDA线为高电平则总线出错,退出
, F. p/ `8 L% e" P+ u; J        SDA_L;
0 U+ ~6 d" _$ c0 T" z7 j! g        I2C_delay();( |( V7 r% @# S
        return TRUE;
# A4 S, W& V, \$ f& r/ e}
7 s& G2 }, f2 |( x% @! a/*******************************************************************************" z* \- h" B8 ^5 Q& u' B
* Function Name  : I2C_Stop
9 E) S5 z/ O/ q7 E* Description    : Master Stop Simulation IIC Communication
  W4 l" T' E' v/ u5 t' O, x( e* Input          : None9 s( h5 F; T0 d9 h$ u9 j
* Output         : None
% Y3 ~% n  p7 u: C& k0 B7 t" l; Y* Return         : None
# C0 }4 g' _5 `! y4 \****************************************************************************** */# I+ J! q8 q+ B& S4 s
void I2C_Stop(void): a: v& J- R8 _" d9 Q- |
{
$ @( U+ q' K  B) m  _! ~' l        SCL_L;; G& y* o* I# s2 U
        I2C_delay();
' a9 _" R) @/ f6 \  B        SDA_L;
2 a9 R+ u8 e" P' P8 ]3 `1 T        I2C_delay();
7 J8 K, _" T' p5 y3 c        SCL_H;/ e! D, G' B( O! s/ R' K" ^% Q
        I2C_delay();
4 W# Z3 C4 n  I- B6 w        SDA_H;7 |# H0 ]* x7 W" V+ p2 [& _9 o% t' W
        I2C_delay();
  u( k5 ~: F8 g8 y$ S} 2 B- [9 [# [+ H0 {' Y: u2 D
/*******************************************************************************8 \) x+ g" y$ C
* Function Name  : I2C_Ack8 `/ e- b/ }4 o* N: g) k9 ], f
* Description    : Master Send Acknowledge Single
/ q, {5 t" b. w6 o* Input          : None( t7 X& S' [3 s; P. L
* Output         : None( l) N( r  F. p" w
* Return         : None
- s7 G. T9 o$ y$ `7 N****************************************************************************** */
6 k1 X: N6 d+ s1 V2 v$ R6 [void I2C_Ack(void)! ?# G6 n* E  H- L* r9 N
{       
& L" z( B  F1 T        SCL_L;
5 y$ o) M; O* [- J1 [! ~        I2C_delay();& \8 q9 `" k9 P- ?. o
        SDA_L;
! I+ Z9 L9 f! L6 r0 d4 N+ R        I2C_delay();% [5 Y. L9 G/ x% n& m. E
        SCL_H;3 A7 c8 ~2 m3 c" E; \; J
        I2C_delay();2 Y: x: b# o/ ?  x5 m
        SCL_L;
4 {6 F1 I+ h  o        I2C_delay();
- R7 C* q7 [) b# O5 Y1 P}   9 \' [) C/ O  S8 K- `6 ?5 Z
/*******************************************************************************  D) E9 P+ g8 u' C1 F
* Function Name  : I2C_NoAck
/ f9 k) v' k5 `* I( w+ ~+ f; E1 b* Description    : Master Send No Acknowledge Single( H  N3 T* J* [( d- t
* Input          : None: v3 W$ E; t) q' _# f* w
* Output         : None9 h( a9 ]: ^4 d" n5 A8 `5 T
* Return         : None& s. s) {6 S: q9 c% F
****************************************************************************** */, n" m8 b8 J- [  b! d
void I2C_NoAck(void)
% P- @% D# ^( h! q- h8 g. R8 w{        7 K; Q6 p$ X9 L, F8 U4 [
        SCL_L;5 z* X- P2 `- k( q, p! n6 w9 J  H+ _
        I2C_delay();9 k7 h& g* [: K/ b( `
        SDA_H;4 c" R* t2 o% l8 K
        I2C_delay();
. [7 A" o+ c2 h' t4 c        SCL_H;% W4 x% \# p0 |! X# I! U% r, D
        I2C_delay();
) a, O0 Y) s( [; @! ~& q! P* @        SCL_L;* |4 L* [; [6 O. a8 m  m* y
        I2C_delay();  m' N/ {( e- X' k3 P# Q. g. E. f- F
} . m+ T* s2 d1 Q0 ?8 _! w" r
/*******************************************************************************; j1 S9 t2 K5 @' r
* Function Name  : I2C_WaitAck
0 K" t: H) M  d7 {. g% Q* Description    : Master Reserive Slave Acknowledge Single
0 ~# y) [) O! m& x' r* Input          : None1 E0 x& e0 Y) N: A
* Output         : None  C1 C1 v6 X' W4 U3 U7 e1 l
* Return         : Wheather         Reserive Slave Acknowledge Single5 w9 }8 O+ n4 d, ]/ t* G
****************************************************************************** */
! b4 \/ Y1 g7 Q$ w$ s: ^uint8_t I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK
& I" J+ ]9 \3 k" G; v% K3 h% n! p{9 i; F) p/ \2 c; x
        SCL_L;4 j: T9 J6 e. j% b
        I2C_delay();
9 `# `! N' j0 [        SDA_H;                       
2 g2 i$ N3 I9 j5 ?        I2C_delay();
8 C4 |& {4 S$ P" q. \        SCL_H;
5 F' w& Y% L. y% X! {# w        I2C_delay();8 g" y" F  c9 ~  G
        if(SDA_read)) A0 `. s) G* l  r" a7 ?( R  V$ x* N
        {' A* F! q: @( Z- N& c
      SCL_L;
5 ^- T; T" a0 D          I2C_delay();; W) I& C; j: k) @3 n& p' F2 R# b3 g
      return FALSE;
$ s6 J0 G7 _7 g  w  X2 V; e        }
( u# K7 A4 _' w# h: T; _" r9 L, l4 f9 N        SCL_L;
1 E* b) [3 `- S* \0 P  ]        I2C_delay();0 ^( ~8 o; K$ ~+ h. w: i9 G* x
        return TRUE;4 d* @( \: W) H( r6 s' d% M
}: ^, _6 v$ ~+ W4 ?$ v4 q
/*******************************************************************************
2 D$ o9 k1 I- S$ A# |$ x6 O* Function Name  : I2C_SendByte% K- s1 e' t# T
* Description    : Master Send a Byte to Slave  o: c4 v1 X; _7 l6 t* L) O. m
* Input          : Will Send Date
# D; l, s! j- m1 e" N! M* Output         : None
; c, _/ I6 u) r" ^* Return         : None9 ^! y/ y* Z; l+ Q. }) A. L' C
****************************************************************************** */
* D) z. E9 g# Y$ `! o! Nvoid I2C_SendByte(u8 SendByte) //数据从高位到低位//" p' o% r* ^+ E) k' ^
{
/ }  }" }, K- A& `( T1 _0 V# b    u8 i=8;
/ U  r2 z2 N; V( n    while(i--)
) v5 _8 B3 x* ~: [* O" s- L9 b    {8 D; X- z; p$ L7 h# {& I7 `
        SCL_L;
( B- X9 C6 \) g) U        I2C_delay();
! b/ N! r5 `) ]: Y! U; o      if(SendByte&0x80)
1 k' t0 x" g! F$ C/ j3 `; R2 H        SDA_H;  
9 ~# S& m/ o7 c      else 8 _  U: F) _& c1 C5 C1 k4 b
        SDA_L;   
1 V* ^) V: O" u) j- p9 E4 z        SendByte<<=1;! \' F9 W( U( C
        I2C_delay();
/ D( i5 u/ `7 v  x( U. @8 I
( s$ [4 R& d) Y) l& A& u

* q$ b9 l/ V& U& J% E; L" S                SCL_H;) @$ f- e9 @+ T6 x" u# i
        I2C_delay();" k$ @/ T, V' t% N
    }
! ]! J" k* }- c( ]4 r" n* Z    SCL_L;0 V6 d# f& x& ^: U& w) P# m: w0 K- Q
}  ( ~8 T3 P! X, d/ B8 _, h- ]* |1 N7 ^  C# _
/*******************************************************************************
( B6 ]0 l2 z$ @) _& F* Function Name  : I2C_RadeByte
: |% q+ H: D+ Q7 S% a* Description    : Master Reserive a Byte From Slave0 N+ e/ y$ ?( |  Z6 T
* Input          : None. C6 C" ^" s- ^1 f
* Output         : None
9 \9 q; F# N3 {8 p* Return         : Date From Slave
( L2 h% Q0 i3 k6 M% Q; }% A" p# i****************************************************************************** */
8 w% j" o1 Q+ Z8 ]; dunsigned char I2C_RadeByte(void)  //数据从高位到低位//
& X" k" Q3 G: D% x/ b) `9 j{
3 m: N6 ?8 e7 T    u8 i=8;; l: j7 }% x2 ~8 v8 j
    u8 ReceiveByte=0;
+ O; ~* Q) E5 A' v, Y8 e5 [( t0 p5 _
9 P0 z, {6 f4 W% d9 T
    SDA_H;                                " [7 f: Q7 F- k
    while(i--)
$ e' [2 ~  X% q  r' K- F" S. j    {% X9 M7 w8 h. b  Z$ W0 X
      ReceiveByte<<=1;      % {* @- @+ |  N
      SCL_L;
9 S1 }  b5 w" f2 l      I2C_delay();
% A3 ~; ^8 |# F' h- }          SCL_H;9 M9 ]! f; o* D6 i
      I2C_delay();       
5 M$ K" b. o: `8 q% ?, `9 e      if(SDA_read)
* l3 U7 i* D' k. f" b0 }6 [      {
" A# E7 r- a+ C& j. L        ReceiveByte|=0x01;
2 e  m& ~! G# t      }
, v- U2 j( W% }  P6 G    }
+ T' y7 \0 X8 X+ U. k    SCL_L;
: W  B/ Q: i! }: A) i( ?    return ReceiveByte;
5 N2 z9 z0 [) g7 |7 B} 2 |- p$ j$ C7 A( i
//ZRX         
: E: `# [- f/ V$ n+ Q//单字节写入*******************************************
1 }- J5 u* d: j7 g5 k
* U$ B- d! ~" g6 L/ Y- B
9 B5 g2 u$ Z! K3 l: X
uint8_t Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
4 `' B) |) O$ Y' Q( j% q" R{
3 G0 M$ O/ v- O: C5 \' A7 D: H% H; F9 f! I          if(!I2C_Start())return FALSE;
, R! h9 c6 p  a' `1 U+ B    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
% q! `2 Q& X+ p( S+ b    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}( x8 {* Z& G/ X
    I2C_SendByte(REG_Address );   //设置低起始地址      
# N. F# y+ Y' c5 s" D* y    I2C_WaitAck();        . |1 V. y2 [0 u8 h- K
    I2C_SendByte(REG_data);7 ^' l$ O9 F' i: _
    I2C_WaitAck();   
/ ?$ E$ F& c" {* n. d    I2C_Stop();
+ V  `7 a# T7 {! D4 u0 t& }/ r    delay5ms();
/ m. o3 w6 ]# s3 X+ v+ k+ C    return TRUE;
4 Y# }* R/ L2 A$ Z}
# x( B) I9 ~9 E8 s: }) U- M- f# S8 x( a0 [7 \  i

, Q" d; j. ?- D; a, E& t//单字节读取*****************************************
0 F- P) S: C, O6 ?- Xunsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
! C8 ?0 K3 ]& g{   unsigned char REG_data;            
0 H) K/ T3 I1 o% B# i        if(!I2C_Start())return FALSE;8 H. {0 S1 l( I. j0 t7 @
    I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址 & }* D, \. H) Q7 y& e5 r" {
    if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}. _% i& P) H. _3 q1 X8 }
    I2C_SendByte((u8) REG_Address);   //设置低起始地址      
) D- {8 B4 S2 L/ t4 [    I2C_WaitAck();/ Y: d! ]' \" F$ n' K
    I2C_Start();, W) |" K# O. H/ l  u
    I2C_SendByte(SlaveAddress+1);% A- c2 f9 ~* Y+ M  d
    I2C_WaitAck();- p2 d' u: {! ~
' M- V9 C+ B, u0 w" p  k3 t8 ^

5 B/ q- n! [- J! t, ]" u) o        REG_data= I2C_RadeByte();
4 x/ m# G- N' C    I2C_NoAck();
2 r) M# _3 Z5 M$ o! X% c    I2C_Stop();
" O' E, r' V8 g2 T# z$ S" p    //return TRUE;% N( K+ b/ h; ^2 O+ Y/ e
        return REG_data;
8 e  {% |* Q2 e; K/ n6 I4 k! z& r, Y. U* J9 I8 Y" ~; b* i

" }% J. f4 K' _; p( {}                                                     
2 g. G3 w  @. X* s& r6 W, f/ b$ j
- p/ T3 h' \) z9 \4 I2 ~+ B

" N. z& \* \# Z5 Z7 G# P/*
$ D& s' I1 I8 c: i% ?9 a********************************************************************************
/ K# c8 N$ y2 f" r** 函数名称 : Delay(vu32 nCount)0 {/ N2 H' H! x4 U+ M3 W9 O7 m
** 函数功能 : 延时函数+ y# n7 |% B9 j4 B( S8 E. V0 H
** 输    入        : 无, ^6 E0 L7 R! e9 G' A. @+ h! V+ ]
** 输    出        : 无
  {* Z5 [- i, ?8 |: s; n* v7 m$ v** 返    回        : 无  c  n2 Q; s1 c5 b
********************************************************************************, e# [' Q, `  F. t8 p
*/
" C* T& }1 u3 G void Delay(u32 nCount)
0 G: J3 s: I& h{
" m# O7 V! ~- G, t  for(; nCount != 0; nCount--);+ Q( D, u7 S/ g8 |! D/ [# z( D
}+ U& a6 d# [7 r

! S" n" m* u! a$ k, N; `( B

! {& I/ u  M* g3 O/ T# d$ x9 N/*) r: w/ a9 _* j9 i. }) p* b
********************************************************************************, p3 h5 M7 A1 A* V4 x  G- t8 _
** 函数名称 : void Delayms(vu32 m)
8 e  x& I; X2 `4 F  l2 m** 函数功能 : 长延时函数         m=1,延时1ms+ o; q# d  ~5 Y3 N: r
** 输    入        : 无, I; x1 s4 s% r7 t
** 输    出        : 无
" X, P9 K3 ?3 Y; f** 返    回        : 无9 \1 y" Q1 m7 Z5 N
********************************************************************************( @( [0 |5 V) S6 B4 K$ g
*/
. O7 q  W. h+ {3 {* e/ [. t void Delayms(u32 m)
. A; G- b" p, ~, l' ~{3 z8 D& p' O( o1 J8 z7 U0 y- B* t5 y
  u32 i;6 {6 M1 L0 ^. b5 Z1 j
  $ h5 q* I3 Z( s( E
  for(; m != 0; m--)       
% Z  B  R  T6 E8 E1 h! s) K4 |       for (i=0; i<50000; i++);8 _' Q" c& j, l
}
4 z) [. a9 n% i; G: _! C. e5 w, I/ E( e1 d
) A+ M: \" Y" D4 R, S7 a) b

) e0 ^1 e3 x, v1 X

- B9 K0 a$ `  e( p( U
7 i: P+ P! R4 v& x, s* A2 Y4 Z/ B- B  _

' Y/ d( _7 e, t4 x4 f2 ~. F4 o/ B- {  H- e+ {+ S

3 K8 f6 _1 q: Y! e4 N/ e+ G4 v9 K; @ //************************************************
7 ?, D: O3 o# x" kvoid  USART2_SendData(unsigned char SendData)/ a/ ^/ X. x2 Q: \8 q: _# x9 K- d
{
: e! b! ]+ u' X' J! HUSART_SendData(USART2, SendData);
  Z5 I+ G- U  N7 [: d9 O# T, M7 ]% pDelayms(1);
; u6 ]. e; S1 H}
' R. Z# O! F! ~        & ?/ c$ T& l% i
. J8 _2 Z- C+ Z  S9 c6 Z
5 w% f! n4 Z1 h. z# D8 Y
//********************************************************************+ Q, n* Y% Q0 G" Q7 |9 n
long bmp085ReadTemp(void)  [& @1 i. P& _# J" b3 a! R
{   short  temp_ut;
( b; w3 C: P& \$ a5 R: V2 {        Single_Write(BMP085_Addr,0xF4,0x2E);" Q9 d$ {! B) p: S, }( s6 a
        Delayms(5);        // max time is 4.5ms
& m( S+ k2 ?: p        temp_ut = Single_Read(BMP085_Addr,0xF6);- x7 _/ F9 E0 y) H. }: j, t1 r
        temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);               
2 E: G7 |" [. R$ j7 V        return (long) temp_ut ;
! q) w4 [# v* q+ y# P}( V; a+ R% @& C" T$ Q. {3 s
//*************************************************************, t. _8 G( C3 W- Y2 ]9 A
8 f8 n: @% z' M2 ~
/ c( S1 T! }& b! a9 d
long bmp085ReadPressure(void)
. P- s2 @8 p1 h' z' a# b; N{
& r0 g, H1 k, ^0 l" }! T) Z        long pressure = 0;7 C% N0 e+ f3 D2 R2 C  C1 |, Z
        Single_Write(BMP085_Addr,0xF4,0x34);/ I( L6 y6 p& F6 T' F
        Delayms(5);        // max time is 4.5ms
. e# [8 ^4 }% \( M. R; k        pressure = Single_Read(BMP085_Addr,0xF6);! e4 Y$ u' {' f5 A4 X
        pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);                - E: j# Y: S9 D4 r/ l
        pressure &= 0x0000FFFF;       
" O: v5 J* A' `5 {4 t8 \2 q        return pressure;       
7 l: k# R2 i; L' @; q}+ w4 o& |6 A& V' q3 h

) K. D; {1 J, q
* W0 l, W5 h& b9 U
//******************
/ T& ?6 Y1 M# T! w2 D4 j8 Cvoid Send_ADXL345_data(int dis_data)
# m5 L7 Z; q9 h* [  {
: {1 k8 t4 @5 l6 p1 v    float temp ;+ M* A1 k# x$ a4 Y6 f  W- ^6 O# M
        if(dis_data>0x7fff)dis_data-=0xffff;0 b4 z" @3 f6 m9 x
        if(dis_data<0){
) F0 W$ F5 f  S0 Q' `               dis_data=-dis_data;
2 Y/ E7 v. T; }' `             USART_SendData(USART1,'-');8 J6 K$ x. u4 T0 _
                 Delayms(2);2 x) S- a: R- r! a; n+ [
        }
, V' N# l  A4 t! n! b* q# h. Z        else
3 [0 Z- l7 Y( `* v( O; g0 G          { / Y  R* C. `( q; Q9 k
           USART_SendData(USART1,'+');
6 f  i' s! ]$ p* q* E+ K           Delayms(2);4 g, Z2 d+ u  f, d$ f# o5 U
           }
0 j" d: |+ q$ ?. C        temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页( O5 ^- @9 k2 N1 f
        conversion(temp);          //转换出显示需要的数据         * a) |4 b* H4 Y0 p* f$ R! p, p% d7 a
            USART2_SendData(qian);
6 m" ~* A3 E3 _+ C                USART2_SendData('.');, X& b  R. O6 e( u2 v
            USART2_SendData(bai);
2 t( L3 L( \! l  w; B            USART2_SendData(shi); 8 v- r- s5 L4 n2 x
            USART2_SendData(ge);
9 B' }- c' i: a" C: B: p                USART2_SendData('g'); ) ~  ?9 j% B- B& T; ]  t+ R0 y" x- n
}
0 D. n0 j7 _/ H; N% |//***************************************
- r  }# Z$ H$ a2 g2 Q //******************6 v& l  G" L: V) F( F" e9 ~
void Send_L3G420D_data(short dis_data)0 S, K: t. _: s" K7 G
  { float temp ;
* }, }9 ?6 X0 x! o2 C; N0 _: `# V         if(dis_data<0){9 P8 Z2 u: Q( p: A9 c6 c
               dis_data=-dis_data;
- d; }; P4 i3 z* T; O! k$ e1 Q3 e             USART_SendData(USART1,'-');
+ @: ?8 o: j- S2 ?  x                 Delayms(2);
$ ]* B+ \; Z) J, u, X# K        }! K- T) s$ N- j+ Z% `
        else
" b$ B" h( ?1 U8 d" n+ |          {
: l8 L1 j9 C3 T9 A+ P0 P           USART_SendData(USART1,'+');
2 w7 |: i- }7 p1 y+ H1 B) y- G           Delayms(2);0 k8 J8 q3 A/ Z- g6 m; g
           }
8 F0 g' ?9 m. ^& V( B, B        temp=(float)dis_data*0.07;  //计算数据和显示,查考ADXL345快速入门第4页
8 j$ A: v3 N" F3 j/ k( E1 x+ J        conversion(temp);           //转换出显示需要的数据         6 G( H& w. m; L$ D1 `3 z/ T6 J
            USART2_SendData(bai); - A$ N" {+ @7 J
            USART2_SendData(shi);
) I# ]! @8 [' p9 F5 W' Q# d% f            USART2_SendData(ge);
# B$ Z+ w/ X( M9 q" ?( A
1 }/ _9 V1 E' r5 O: ~% e1 ^}
! w* P$ C. G# k0 m6 T0 B//***************************************; `4 H+ s1 F2 L7 `2 Y

8 `0 m9 T: V# l' ^! ?
4 m* ^, d2 \. V) E8 a! I/ z+ R
$ e/ b& W+ {# W, n$ \. i  h

" V( O( p( y* Q4 @( M7 C& K8 Y: @void Send_HMC5883L(void)
8 i( Q! s9 w1 k! V1 O; v, m0 ^{
7 I$ ]- |* I( V0 w3 mUSART2_SendData('H');+ u  a) Q8 n' C* q! R; K
USART2_SendData('M');
' ?2 y& _; p7 sUSART2_SendData('C');
+ G7 `  X' s3 ^% @6 v5 v3 LUSART2_SendData('5');- Z1 s) T' x% c5 N4 _: q
USART2_SendData('8');
' @2 w6 c' Z9 C: X. G& BUSART2_SendData('8');
9 D/ ^) _* F: V/ p- @4 G( aUSART2_SendData('3');
- O# }" ?9 R# o+ y) {. M( UUSART2_SendData('L');- G5 j; k" Z4 w/ @
USART2_SendData(':');* b' }8 G& a& M" l/ W
conversion(angle);# v1 r9 Z" I& Y/ k( T
USART2_SendData(bai);
8 J$ O/ `, @% l4 Z) _. BUSART2_SendData(shi);
3 c: A. A/ }9 V+ }+ X9 V. xUSART2_SendData(ge); : |' o- F2 H' t. I
USART2_SendData('`');  % y' C3 h, N. e+ s6 G! ?
USART2_SendData(0x0d);& P2 w+ Y$ D7 S/ ~2 s
USART2_SendData(0x0a);
: W5 @% ~0 e, ^' O1 n}
/ v& _; \: T3 _+ w2 z2 f) f//*************************************************" E9 w4 D1 s/ j0 v' n" K; O9 T
void  Send_BMP085(void)
: ?, q9 O& }) U3 V% g3 ]{0 t$ Y$ {, @8 a) a3 K: j
USART2_SendData('B');
! B% Y: U$ ]% c. a/ G, U1 y, B, HUSART2_SendData('M');$ _+ l% f& y6 `3 @! I
USART2_SendData('P');& y; ^7 j. x% |/ b
USART2_SendData('0');  p5 W+ {3 L9 D& V
USART2_SendData('8');
5 _$ m( x5 P( TUSART2_SendData('5');
. z, R9 U3 l2 r1 Z! `5 OUSART2_SendData(':');* i0 f7 \$ @/ I2 P; g  I& y

( X; s3 A, b: ?& N9 j& f

! N# C( c$ H0 S5 c8 P# LUSART2_SendData('t');! {% x9 u$ B5 m" {/ H/ g: v5 P
USART2_SendData('=');
) d  P" i( [# ~. O$ L3 F$ w9 Yconversion(temperature);% ~% S. Y5 a2 ~- A3 R( k
USART2_SendData(bai); , J' V- P: s) {
USART2_SendData(shi); 7 u2 N, I; V6 m8 j2 h
USART2_SendData('.');( b' n) ?8 @8 y! E
USART2_SendData(ge);  `6 e6 G3 c5 K8 p% r. i
USART2_SendData('`');
1 R& q& f# E. SUSART2_SendData('C');
' a  `8 T2 v. z7 L+ Y5 ^. _$ Y; n: E
5 [0 A/ D9 [+ ~" X0 O9 f  ~5 ]
; R0 N1 e8 N8 p4 R! {- q
USART2_SendData(' ');" I6 _: e8 W0 [$ C" ^& E
USART2_SendData('p');
* O0 y7 [, K) M# n( K( e/ Y! T0 V3 HUSART2_SendData('=');; n0 ]/ a3 P2 ?- C' {9 L" [
conversion(pressure);
8 `; z+ e" r! [/ G8 W0 F; a0 h1 b2 Y/ T# E. j- h$ g7 w
: ^: a% I2 ?$ t8 i* S3 W
USART2_SendData(shiwan);
+ K2 G( F  s0 bUSART2_SendData(wan);4 M* s- U: c8 j1 ?+ C
USART2_SendData(qian);* K$ \( J& y7 U' U! i  E
USART2_SendData('.');
: P, m4 {) x; L( @7 l: RUSART2_SendData(bai);
% |! d3 C' J; PUSART2_SendData(shi); ) I& ^8 [* `+ J! E* j2 c. f
USART2_SendData(ge); 9 b3 D+ ~" l% s$ e. O% f( r* l
USART2_SendData('K'); ; Y0 H; a' {: d- q( E' d- A7 b4 \5 w
USART2_SendData('p'); * e$ H  J( X0 L! S: h3 q
USART2_SendData('a');                                  % I7 C8 c7 v: [# j% }. y
USART2_SendData(0x0d);! T4 a) |# K& [) v% K* a
USART2_SendData(0x0a);
- S8 C1 c6 x) K( V, f! n$ h, ^9 ^- V4 T2 E6 G# x! _- y
, U# T& _/ ?. c2 f" f4 i
}
7 y2 K1 R. x8 A/ O% \//*****************************************************4 H  w( e+ ~3 T* n% o% e! H0 {

2 y  a; O1 o7 ?& x& `# b% a

. e7 d" M' C- I, f+ v% ]void  Send_ADXL345(void)
6 I* Q7 \- `; |{
9 r5 L, L$ Y) f2 U0 E% t7 BUSART2_SendData('A');& `, n1 i: ~# \& j: h
USART2_SendData('D');
! `' D' @( N0 L0 hUSART2_SendData('X');
0 s2 A( ]7 u: p2 v6 o% YUSART2_SendData('L');
. d5 Y; q0 |4 Z6 ^; h! FUSART2_SendData('3');1 J, t! e1 _6 H: G0 W
USART2_SendData('4');  y: m/ D( d& u% x1 P- V5 d7 c7 e
USART2_SendData('5');
% B1 f8 B( C  P0 V- M# z5 ZUSART2_SendData(':');6 g. i, z! |/ D' S& x; d: m  j
           USART2_SendData('X');
7 t9 L  l' r) z! F  Q           USART2_SendData('=');0 |3 z% Y2 K# q* m5 ]! ~: D* e
           Send_ADXL345_data(A_X);
7 X* y' K  r2 W& c# w+ h2 x% Q9 n7 @$ Z, v" `+ j0 _7 X

6 I* }: k1 g1 J; W2 b9 I( n           USART2_SendData('Y');
9 F  k5 n8 E5 u) ^: ?, o3 j. ]           USART2_SendData('=');' y8 n1 M2 X. M% ?! R# _
           Send_ADXL345_data(A_Y);9 P* n9 h% }4 r- D( V

# g' ?" c8 Q' y" s! t) P5 n

+ O& z- h8 `6 D           USART2_SendData('Z');
$ j, M2 m/ K3 p           USART2_SendData('=');- u  b7 _; _2 F& }# y1 _
           Send_ADXL345_data(A_Z);; r0 D9 D/ V2 X3 {' \% K2 C" K

$ G& v1 x9 S* t+ ?) W8 K: A

* j; Z% C9 f8 H9 W! V. V           adxl345_angle();0 S. v5 }  u5 r/ z5 o# g5 S; i9 l
. P& c  s0 G/ d" X9 W
7 J7 r! V$ B3 i- H5 z6 F

  b7 f/ B7 g9 ^2 x% V& c
: I' M) I$ C2 S$ C# \/ E; ^3 O  p" v
USART2_SendData(0x0d);: F' E' ]0 q/ @, Q
USART2_SendData(0x0a);
6 u9 ?# m  B% H  z}  A+ ^+ w% o& x# O7 L- n
//*****************************************************- Z" K& I6 v, ?6 B7 a
void Send_L3G4200D(void)
4 x! R% V$ t% S! p! b5 o {
! D; E. L' c+ n: e           USART2_SendData('L');
8 d# t* W) N' e  B* W9 `        USART2_SendData('3');7 N. c- ?/ C3 u. o$ y  H
        USART2_SendData('G');2 K. m* D3 g# m. h; D" J
        USART2_SendData('4');* |4 f! {2 V! u) e+ a$ q
        USART2_SendData('2');
" V' X# w3 W$ L        USART2_SendData('0');
" I' q  o& w' x! `" D; b        USART2_SendData('0');  Q  C! U$ z" U2 C& A  J0 D
        USART2_SendData('D');2 p) r1 X! @8 l- F* p
        USART2_SendData(':');
6 b  d  z- y0 V' N- \
" p: u$ o, Y7 y% y# _5 Q3 z

2 N/ G% }3 E* n* X) o4 ?7 r           USART2_SendData('X');2 H6 n6 R$ A2 d5 p
           USART2_SendData('=');6 Q3 B% W3 `; k7 Y* E2 a
           Send_L3G420D_data(T_X);
5 u3 c, T( m; d# @
( {& Q5 |: r: C  d+ G

) S9 J5 t( I$ m1 O9 T3 O# m           USART2_SendData('Y');+ H8 o4 i9 x! o$ c2 v# E
           USART2_SendData('=');% E0 l- |+ w* C6 s( h
           Send_L3G420D_data(T_Y);
3 t) a1 K! h. ?- F* [. ~" R8 I( x. `+ t* n3 S1 t6 B5 c( G3 {! Q
$ K0 P  d. p) i
           USART2_SendData('Z');4 a- f% v+ ?$ ?
           USART2_SendData('=');
" T( ?' s+ M% C7 p% k9 ]           Send_L3G420D_data(T_Z);
) B* W8 O. T2 p5 u2 B. r  L0 ~9 j, L0 o+ M9 t/ b
* v% N/ D6 r9 @* t) D' U
          USART2_SendData(0x0d);
" |! q: I2 Y" x. U; u9 D     USART2_SendData(0x0a);
; d9 |/ k) }  k& Z3 h$ M$ u$ Y: T& j }( k# o8 `3 t' ?' E. A5 N. X) w
//******************************************************
$ U5 G7 p, |# ^( W0 e& Q9 tvoid read_HMC5883L(void)
# s: x0 R9 @& Y+ `4 B0 G, T{, x* F2 i2 S* {, I# I
       Single_Write(HMC5883L_Addr,0x00,0x14);   //! |6 Q9 `9 P1 Y6 p/ r# W4 |; B  S# J/ o
       Single_Write(HMC5883L_Addr,0x02,0x00);   //6 _# ^6 ]5 U) Z: ^8 W5 @
             Delayms(10);
0 E- m# n8 R. [0 E2 T$ i1 g8 l$ K! g6 u' P" N

5 `3 u8 F% x% H  B+ C6 V       BUF[1]=Single_Read(HMC5883L_Addr,0x03);//OUT_X_L_A
) W6 E0 m- B; o4 f* Z+ x       BUF[2]=Single_Read(HMC5883L_Addr,0x04);//OUT_X_H_A1 `1 k% j1 ~4 S; ~. R) ^
8 }6 ?: @! D- G

/ U6 P$ M; e5 {+ _' ?9 ~           BUF[3]=Single_Read(HMC5883L_Addr,0x07);//OUT_Y_L_A
2 _; D# ?. D4 S8 u       BUF[4]=Single_Read(HMC5883L_Addr,0x08);//OUT_Y_H_A
) ~* s! L7 O5 A0 j
9 N; Z- P( m3 l9 \
6 o% g9 a2 u' _. F+ j6 q' ~) q
       x=(BUF[1] << 8) | BUF[2]; //Combine MSB and LSB of X Data output register
& ?7 z. E) ^$ a7 [7 ]       y=(BUF[3] << 8) | BUF[4]; //Combine MSB and LSB of Z Data output register
/ z) ]' f! F8 O' v/ R# @2 h5 k, {2 [5 a; Y% ~$ T
* t0 H/ N5 x( B5 }- ?$ Y$ D
       if(x>0x7fff)x-=0xffff;          + |4 [7 R2 Y- v- H! M2 B5 f% l
       if(y>0x7fff)y-=0xffff;            U$ E+ B- p3 S
       angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees" p/ z9 n' J3 I2 O7 _
}
, E. ]2 |" [( D8 V; T$ B//****************************************% m+ e: v  ]" N3 m6 R! S# E$ o  Q
void read_ADXL345(void)6 A$ w+ C) @( \! l: V
{
( r2 m# P7 A: O5 T       BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A" R+ H9 ^2 _) }$ s9 [
       BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A
7 q( X2 h+ M5 W* t, }1 o( [0 y' x- T" }( n1 l
$ I4 m( y7 E/ f
           BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A* J& P# ?' ]' I
       BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A
+ P. l+ X2 G5 D) x
  s% J. @9 M3 ?; }8 _
2 T# ^8 N+ P$ t. u; N
           BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A" h2 i2 Y5 B" w+ S9 N  q/ O4 Y' C& i- F
       BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A
% H) Q3 }1 y) U# L/ U& H' I4 l) t) }1 k

, U% t! O- ~0 K           A_X=(BUF[1]<<8)+BUF[0];  //合成数据  
/ o' Y- c# m* ]3 [2 p' k           A_Y=(BUF[3]<<8)+BUF[2];  //合成数据
* \+ C4 L5 ?$ z, O: I1 z3 m           A_Z=(BUF[5]<<8)+BUF[4];  //合成数据
- `& D$ `- o  a- E4 |: e2 u}! v6 R1 b$ g' X4 j( X9 [
//*****************************************
" Q" a" }/ M* {  H' D- lvoid read_BMP085(void)
+ Q7 Z% _: T( S. \{; d! w5 q/ f: J/ b- U3 S

$ Y: {6 ?" l2 L6 J

  n6 Y: I7 J) ?8 W7 e           long ut;$ w. t% r" [1 A% F! n3 ^
        long up;
. |4 t/ b9 k5 n( X$ G$ Q        long x1, x2, b5, b6, x3, b3, p;
# O1 L5 {% C# ^4 a1 |        unsigned long b4, b7;
7 m9 s, e1 G3 r/ T! L9 N
) k' g* d5 J6 Z: R5 y9 m
; G7 _; c( `- Y* w) j4 W* t. n
        ut = bmp085ReadTemp();           // 读取温度
5 c6 J/ \; ~7 C6 S//        ut = bmp085ReadTemp();           // 读取温度
# j+ A2 z4 I  M/ v# r        up = bmp085ReadPressure();  // 读取压强* b+ i. l7 }. w
//        up = bmp085ReadPressure();  // 读取压强
* d" ^9 m- u6 ^; e2 D# M        x1 = ((long)ut - ac6) * ac5 >> 15;
! N% T3 P1 C9 K4 @( I# |& C' F        x2 = ((long) mc << 11) / (x1 + md);; V' H# J: ]' E) W* Y7 z7 L2 V
        b5 = x1 + x2;
! e( J8 G  w& p" E, Y        temperature = (b5 + 8) >> 4;# V. R6 W/ ~7 j9 E, e  R; @9 p
        # L2 f# T8 `1 n* J8 g. a5 X1 A* Y
         //****************$ D" g6 j* W% W  j# f
: P5 ^! e9 j( d( m. m) p

" e3 J! _+ r5 m9 _' ]( j        b6 = b5 - 4000;& @% @! J. \  d. c' f3 w# @  d2 [
        x1 = (b2 * (b6 * b6 >> 12)) >> 11;
: [4 K8 p6 K4 \7 m        x2 = ac2 * b6 >> 11;
1 r, j* D7 a9 H        x3 = x1 + x2;
; q. m& w1 c" i' [. y        b3 = (((long)ac1 * 4 + x3) + 2)/4;
1 w+ ^, J+ r, }0 i2 H& P, V/ ?  U        x1 = ac3 * b6 >> 13;6 P9 ~, P* V# \2 f, f- f
        x2 = (b1 * (b6 * b6 >> 12)) >> 16;
4 R2 \: q; `7 n& g  q        x3 = ((x1 + x2) + 2) >> 2;6 {0 Y6 u1 a8 X% L# N1 F& }& H
        b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  V4 Q4 N. ?/ X& M' I0 q        b7 = ((unsigned long) up - b3) * (50000 >> OSS);$ \: |/ J$ Q1 B+ @  x7 n
        if( b7 < 0x80000000)
# i4 K% `2 J$ l             p = (b7 * 2) / b4 ;
4 [4 ^+ P8 m* C: O, B8 |           else  
1 g( i" @# [; P, R                    p = (b7 / b4) * 2;
0 I' V7 W- O! [  C        x1 = (p >> 8) * (p >> 8);/ Z9 g1 E; o) s) G/ ^7 O
        x1 = (x1 * 3038) >> 16;' q; ?  `8 D) }/ m
        x2 = (-7357 * p) >> 16;! O: ~* y2 _# b! T$ d6 q# o
         pressure = p + ((x1 + x2 + 3791) >> 4);2 p3 C1 q( _8 U0 H0 c
}
  L6 d- q# W" T9 ^//***************************6 y  Q5 Y$ V, D; A3 d# ^0 c
void  Init_ADXL345(void)
, z# U, {8 J# ~/ a+ y1 A4 p4 y  `{& s, X- [3 `1 b" ~
   Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式. K9 a( C% P8 f1 o  B) n' _: u
  // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
% Y* G1 C/ m2 h% Z) ]   Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页
' C# V/ b- z4 O, \, R   Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
3 m4 i( {9 {% q+ T( u' d  // Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页  ^) k; D$ E/ a/ ~  O" Z6 q
  // Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页( w5 n# I) Z. }6 L  E2 R
  // Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页5 ?/ C  ?6 L4 \5 `- x; \) x
}3 j# N) P6 w1 _6 H% u
//****************************
0 e8 x4 b+ k' ]- e void  Init_BMP085(void)
$ P* @. R3 E- J4 {# T& R2 t/ j" @{
+ h7 ~, r2 f# K" j' ~4 L: x        ac1 = Single_Read(BMP085_Addr,0xAA);" ~# }' O) P. m# @  N4 j
        ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);
5 X) m( i% E6 I- E% L8 X
3 ~1 a( _, \, {3 v, I& ^
; t- n) H* N4 c3 D, L0 ^
    ac2 = Single_Read(BMP085_Addr,0xAC);4 w4 b/ L0 z9 a( L0 _+ C
        ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);1 P2 I& P3 }! R/ N- C

3 R% C9 a$ g% H( i6 p# |2 Q
0 ]! {; M- w7 [& h
        ac3 = Single_Read(BMP085_Addr,0xAE);* x- N, w' b# f- {/ O% F
        ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);4 e7 Y8 h2 z8 @. F& i
0 m* P$ l( d% \( t. O( O

5 j0 h: [4 k; M8 n( S7 {% h$ z        ac4 = Single_Read(BMP085_Addr,0xB0);4 ?- t2 _5 l, B, M, U
        ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);
6 ~1 b' F2 P; Q+ j/ c  T+ m7 P# u& D' F% q7 E1 i- Z3 l& R

5 T% @6 v5 ]5 R# O! S        ac5 = Single_Read(BMP085_Addr,0xB2);* ~1 P" t' m( V/ g: s2 p
        ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);
* f& \1 t7 s$ {" j5 Z  K6 T: n$ x9 t2 e' g* a
6 T7 _$ W; o2 V; {
        ac6 = Single_Read(BMP085_Addr,0xB4);: ^9 Z( d$ I/ |( x7 Q
        ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);4 x, U# `1 S- C! N) Z  H5 ?" y

' y8 n1 t$ M+ y6 Y5 E. b" M

8 G# A8 g5 [! R9 o$ b# F% ~6 @        b1 = Single_Read(BMP085_Addr,0xB6);
/ J0 k/ t, i% A        b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);
3 F6 t7 M. D) j8 b5 W# E$ T* i4 p6 }; U. i4 S' W9 B
9 l/ u4 B0 H, r, g  C" S- P. Y) x
        b2 = Single_Read(BMP085_Addr,0xB8);
" U5 e* w* b% s) N, @        b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);" O/ h. g' u" D* R( H& V

4 v& [6 |# {4 h$ R" s7 G- v! l

& B3 v1 q, ?8 ]! O% d# G" V        mb = Single_Read(BMP085_Addr,0xBA);
8 C3 ]5 q5 ]6 g+ z        mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);+ G, @6 u( b1 u; r/ q  A
/ w( N. Y' S1 v4 W- G1 Q/ T4 ?  u

9 n& x6 l4 \4 s& ]! Y- i        mc = Single_Read(BMP085_Addr,0xBC);2 N# F6 e8 \5 c3 i( r# Q" a- K" ?* g4 v
        mc = (mc<<8)| Single_Read(BMP085_Addr,0xBD);
  W- T/ f- W6 i1 o8 F) [
; h( U4 p. h7 g* K3 p

- u/ r. V* E  ?1 G        md = Single_Read(BMP085_Addr,0xBE);
3 b1 l; \( r1 a# M' s6 t5 H6 b        md = (md<<8)| Single_Read(BMP085_Addr,0xBF);3 B6 e* [7 F0 }) F3 y# v

5 C. o8 z! z! @4 R  t
2 i2 x0 `2 [# p5 N3 e, T2 [
}
" y( a7 ]" D4 w$ L. [//****************************
4 J  k" x2 G: w$ Q, P void  Init_HMC5883L(void)! ^5 w$ e( S" G3 h6 |
{
0 J5 z- h9 b. V3 A' r) d; k% ?" Z   Single_Write(HMC5883L_Addr,0x00,0x14);   //
' K7 V3 L& W. r   Single_Write(HMC5883L_Addr,0x02,0x00);   //
2 t3 P: Q* x& i6 D. r$ d}+ F; e/ K8 M. c" o
//*****************************************, _; k( o7 |$ B+ N. u7 }
4 ]; m: T/ X0 d$ m/ W  o8 t

+ o/ I8 Q3 I' F- ?  Q //************初始化L3G4200D*********************************4 {6 b5 a' Z) i& ]
void Init_L3G4200D(void)
  Y5 i/ E* u3 P5 ?8 L  K% l& ?$ Q{
: a% P5 C3 D% o& f$ D0 r        Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);
: Z0 E& R1 Y5 N3 r6 ~        Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);5 C% G  k( c& O
        Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);/ N" `- \) Q; ?4 k5 l6 r! a; [$ t
        Single_Write(L3G4200_Addr,CTRL_REG4, 0x30);        //+-2000dps& ?% V/ x, ]3 B2 @
        Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);
: v! u/ J: m3 i  I* m4 e}        : d. z# v0 p+ T, L7 M+ H+ f$ j% t
//******读取L3G4200D数据****************************************5 {# X* [* g1 X: v! a* t( I: y/ o
void read_L3G4200D(void)
# ^& q0 @0 h1 p( Q; @{4 B- J. l  o% n/ Z' w
   BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);5 _- S' [, ^( m0 i
   BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);$ C) u  {, T, [- A" G- V
   T_X=        (BUF[1]<<8)|BUF[0];* k" W* ^( C, ^- v2 G
2 B% _$ a& o2 ?- I3 m

$ V4 D% F; Z7 K" V

$ {# Y4 U1 t% |
/ Z, ^7 B/ I! V9 ?6 \5 T
$ d, g3 I8 W5 x7 h; T& |/ Q
   BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);  d5 G; R7 L5 ~( u) d$ |, W
   BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
$ D, i1 ]8 m8 F6 J+ ^   T_Y=        (BUF[3]<<8)|BUF[2];
! e: [, |4 y* `* H  
0 P) O7 w& M! X0 {/ T& r( k* `1 d2 a5 h6 y7 F7 g9 _- I
' z- I9 ~/ c& r  i
   BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
0 U1 G0 ~- c! L   BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);0 q: ?8 c/ H0 N; J4 D+ n5 Q
   T_Z=        (BUF[5]<<8)|BUF[4];4 h' ]4 ]1 X4 Y2 |; H
0 k6 d! z4 s7 k6 O+ |& s( u: l
$ c0 a  [4 W1 u4 M* R
}
% i6 [, M4 x6 P! q6 H( e) l
1 J2 u+ E- s% {5 \+ j2 u( }
+ N3 ~( ^1 X. _8 {7 _3 S
//******************ADXL345计算倾斜角度************5 ~  U, G3 k7 }: v( Y
void adxl345_angle(void)( B/ y) Z! T% @
{
& u0 M6 w, Y$ l+ |
1 V5 j6 Y4 d- |8 V) j

+ T6 W- c' q3 T$ ]( a- C* Odata_xyz[0]=A_X;  //合成数据   
6 D, F0 n) o& v  a$ P" u) {7 r# pdata_xyz[1]=A_Y;  //合成数据   * U. p7 _  h6 I5 D
data_xyz[2]=A_Z;  //合成数据   
3 g7 |7 A8 r) \! z& o6 g. F+ _- J
' H) [* s- U5 |- F8 g) W) d# Z+ S
& x5 S8 B+ o+ g* H) r6 b' f
//分别是加速度X,Y,Z的原始数据,10位的2 h: k/ z5 n/ M# [# B7 C
Q=(float)data_xyz[0]*3.9;
) `0 ?  {* J* h+ D  pT=(float)data_xyz[1]*3.9;
4 z( T- J3 F' \9 t+ ^/ |% sK=(float)data_xyz[2]*3.9;3 O8 w, M! a, j5 H  u: ]" Y
Q=-Q;
2 i- i; r- X8 N2 t$ M+ R0 a9 {) r; F8 `0 U: i; |" G
* R: K% J, T# e: w" J  c6 \6 e9 I
  Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);    //X轴角度值
! [8 N* u. ]) _7 Y( }( _# k  }  Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);  //Y轴角度值
: _; z9 ?6 ?7 F5 S, ~- _( f  //conversion(Pitch);                                                                   //需要显示时候请更换
% G& z7 T$ r( Y- y/ I7 f  conversion(Roll);
: O, w' [/ |; W& q4 C/ a        USART2_SendData(' '); ' p2 W4 g/ ~5 l5 ~0 h/ q; T- o
                USART2_SendData(' '); % o3 C; V3 {2 ]+ ~! g
              USART2_SendData(bai);
0 I* U1 Z1 S# }# L8 ~            USART2_SendData(shi); 7 J2 G) \: P* ]
            USART2_SendData(ge);7 T; B+ h( G- n4 ]( l
}
6 A% v* Q" Q: s0 f# Z( f8 ?) M) H- s1 B( l1 H+ p3 r
2 g) z* ?  t' y! ~9 `4 c
int main(void)
+ s% k# q8 {' c{
+ [/ R3 k, Y( B5 {+ s. h% l        DEBUG_USART_Config();5 i$ W1 l) C+ Z( e
        Init_HMC5883L();
0 i. D' B( j2 N' j  Init_ADXL345();
# O! g% p6 k& f9 @: M  Init_BMP085();
- T. B$ z6 j% j4 f" L  Init_L3G4200D();
5 g4 ^9 s6 }% _% }       
' I2 \& a0 `! ^! q( z' n        while(1)
& B# f2 U7 x- |& @' H. g        {) i8 S- S' z& d2 H" z
                read_HMC5883L();& P& @7 f% W$ g0 o1 ~( W
       Send_HMC5883L();
) x* {  _3 o; h                read_ADXL345();
) M) q# J* Z1 h, F- P* t9 z           Send_ADXL345();  _/ ~& G  q7 W9 _9 M" s
                read_L3G4200D();
# k0 f' @$ G; G! O            Send_L3G4200D();
) {4 F' F2 u% w* q% ~                read_BMP085();                   4 \; }; L% k0 N- \* Y8 e
           Send_BMP085();
0 @9 g4 D! m" A! b                Delayms(20);
0 y' D2 x9 |7 f1 u3 P, q6 Y; ~. @5 a        }
+ Z" p: z- V, W( i" w! Y0 t}) v- b: c- j- d1 d
///*************结束***************/9 ]4 X# U$ ^6 S7 @0 f
* S8 B* M& C$ o- H3 A9 w4 S

1 q/ m, p; ~2 o7 P% k+ W4 U6 X
" V! C' C: k( r6 ?5 k( |
" h8 `: b2 b; n2 ?  g1 s& w
————————————————. ]# z. A0 z7 K
版权声明:Aspirant-GQ4 M2 K$ h5 _0 `% p5 G& c
如有侵权请联系删除6 u, J6 Q7 O7 P

. @" c% U) U) w" I, x* L7 M! A: K& B2 Z' X3 M  H  D- K
赞 收藏 评论0 发布时间:2023-3-17 21:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版