找回密码
 注册
关于网站域名变更的通知
查看: 655|回复: 3
打印 上一主题 下一主题

ADXL345测倾斜角(程序)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-9 07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ADXL345测倾斜角(程序)
( X$ E) s, M" B- l1 N

3 b, E+ g+ f- ?; q单片机源程序如下:

" m2 I; N' x0 t  [' o; ?* |/ i
  r8 k! R" N# J#include  <REG51.H>        * B4 d- F' J- R  _- V5 @
#include  <math.h>    //Keil library  
( I5 I$ c5 E- Q4 e, P#include  <stdio.h>   //Keil library        # H& G+ w/ x" S7 u& O( [9 N! c' Y  J
#include  <INTRINS.H># n1 I/ ~; i, `4 Y

: }  s: ?( U; o1 o& Y' w#define   uchar unsigned char' s6 ~, ~0 h" F1 N- U* s/ V' j' ]
#define   uint unsigned int        
& L2 `; h. l( `2 A! s4 E#define   DataPort P0    //LCD1602数据端口+ u1 w, x6 v& g! {" O4 I5 ^
' u  L! u' g# A, O5 \$ g! i
sfr TUXR=0x8E;5 ~6 b( I* }+ _0 |$ I3 t
sfr CMOD=0xD9;
# a$ m9 Z) M3 m; k& f' Xsfr CCON=0xD8;# @6 ^$ H! Z' o, t8 ]
sfr CL=0xE9;
; w  ]% ~7 Y5 osfr CH=0xF9;& C  J9 D. D- A7 v# [
sfr CCAPM0=0xDA;. n6 |$ u; ~/ C5 x* K# w' R
sfr CCAPM1=0xDB;
4 U* [# Q2 w4 s- W# O/ d/ z& ysfr CCAP0L=0xEA;
2 N" n. X2 |$ {) [sfr CCAP0H=0xFA;
# f# o7 ?9 {, G$ a( r, qsfr CCAP1L=0xEB;2 M, r" h0 y; }+ c
sfr CCAP1H=0xFB;
& H& H& h( F! j( `; xsbit CR=CCON^6;
% L2 |( z+ M( m5 K! g, c6 `; q5 v4 g4 P* M
0 u. W4 _' O, p; B
sbit          SCL=P2^0;      //IIC时钟引脚定义0 {2 v; f  p; d) D9 @9 c
sbit           SDA=P2^1;      //IIC数据引脚定义
9 m. O/ N2 O5 @sbit  p22=P2^2;' h! \! H! k; s/ w+ j
sbit  p31=P3^1;
" n& t9 M3 q# C' x2 Dsbit  p33=P3^3;
  q9 }2 x: x$ p8 q# W8 ]$ k0 tsbit      LCM_RS=P2^6;   //LCD1602命令端口                  c: W. y9 |" \
sbit      LCM_RW=P2^5;   //LCD1602命令端口               
; @2 y5 u- u. d3 e7 `, psbit      LCM_EN=P2^7;   //LCD1602命令端口
* L$ B6 ]$ q" i/ H, N" N
( P" c" `0 _' O#define        SlaveAddress   0xA6        //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
* b5 d6 h8 l) J' r                            //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
, p  _& m- X5 s5 k5 qtypedef unsigned char  BYTE;2 R" ]& h! }+ R. |& V
typedef unsigned short WORD;
6 G0 f% y  s( ?8 _& C/ x
' e% \8 j: X! l; @BYTE BUF[8];                         //接收数据缓存区              ! O7 ?4 |. T* f9 q# J
uchar ge,shi,bai,qian,wan;           //显示变量  个十百千万
! T# p4 `+ M3 ~2 K, n" Dint  dis_data;                       //变量9 e5 S" D' y6 j$ m: c; d9 [$ s
float jd;/ G; ?% }% J7 w2 ^' e# N
uint PWMH;+ m  @/ u5 @$ [+ v- C
void InitLcd();                      //初始化lcd1602
- [+ E0 ?* W( ?7 [. gvoid Init_ADXL345(void);             //初始化ADXL345( x' r8 u$ v2 P3 M

- H4 v4 x7 p& m8 T% m+ _void WriteDataLCM(uchar dataW);                // LCD1602相关函数
, v! X2 x& Q) x! F) }void WriteCommandLCM(uchar CMD,uchar Attribc); //
+ T. @5 |5 @" J( F" v) evoid DisplayOneChar(uchar X,uchar Y,uchar DData); //
" z2 d! G$ _- H( p( F+ R; ]void conversion(uint temp_data);        //数据处理
  L' F8 `! V% J; H, \% _
9 [# X) {# G/ |' [+ }void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据6 L% y% k! g0 |' F+ p. c
uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
+ }" S' E' Y+ ]void  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据
! a1 h3 e: V3 `. O# q6 x9 k//------------------------------------1 k! A: ^# ~, X; l2 ]
void Delay5us();
: f( {7 f1 f! \5 s# P, u6 A* }void Delay5ms();
8 x2 B& V+ g/ p. l# [; d: {3 [& Pvoid ADXL345_Start();       //与iic有关函数
1 T5 b( c7 J$ v# h% y0 Lvoid ADXL345_Stop();
* H/ k8 r* g" z8 ]9 h& [void ADXL345_SendACK(bit ack); //传送应答
) |4 k- J& W, r% ]% _! Qbit  ADXL345_RecvACK();                   //接收应答* D  g& r3 h( h$ c) |/ z
void ADXL345_SendByte(BYTE dat);
5 d* `" \8 c) w3 Z3 Q( [6 UBYTE ADXL345_RecvByte();! ^, m$ d$ u( t. H9 C
void ADXL345_ReadPage();: |5 ^" V* E* A  r" T3 o, S
void ADXL345_WritePage();
# G+ F7 e/ X, j4 ?$ t( V  {. H: T& `. J$ E1 ~8 V
/*******************************/
# S  U2 F' p) \+ B6 d2 Mvoid WaitForEnable(void)         
* C5 e0 @3 q# t0 z+ B5 l; N' w- Z) o{                                        / E6 F! z, b- T3 q" E1 D+ p
        DataPort=0xff;                : T. p7 R, [" C6 ]/ g. r
        LCM_RS=0;
% x, X: H2 p# z- K        LCM_RW=1;
; x& d; ?( {8 D( J" l# A- j! b        _nop_(); _nop_();
9 ~2 P9 G% w& m8 p% }- L9 A7 |        LCM_EN=1;! h+ j+ o/ _9 ]
        _nop_();_nop_(); _nop_();_nop_();
* u( Q. U- c  N: a$ S2 N        while(DataPort&0x80);        , {2 _1 d0 }! x* q: E3 I
        LCM_EN=0;                                
& c' I- b9 x- C2 [}                                       
7 e; C* S1 _8 u; v/ W  |) j/*******************************/
3 J7 Y- O' _* E( g1 {4 [8 zvoid WriteCommandLCM(uchar CMD,uchar Attribc)
5 E9 r  Q% s. b{                                        % c( H7 d: c) p- b+ _8 V
        if(Attribc)7 R2 j! v3 g& N3 v7 S/ J
        WaitForEnable();        
# q  e7 W3 d2 x/ j        LCM_RS=0;: G% ?, ^5 r0 O. C2 j
        LCM_RW=0;' ]: w% e+ A6 w  s# U
        _nop_();_nop_();1 J7 o8 X+ k' F- k, @4 ^# E
        DataPort=CMD;
4 H. m( W8 M3 p0 N% L/ P7 q        _nop_();_nop_();        
2 v1 y. @! `4 R- F% y: e        LCM_EN=1;
- E% S3 g$ i- I' H6 g/ b5 p        nop_();_nop_();nop_();_nop_();
" @" }% T1 v5 j) J0 {" ]. t6 ]  \        LCM_EN=0;4 Z3 n$ n; E# E  p: S% C
}                                       
. E& g# B1 H1 T1 g' Y+ ~/*******************************/% Q% b# s. B3 p/ h; s7 M
void WriteDataLCM(uchar dataW)1 B0 P; w) [9 H$ z4 F8 g' D
{                                       
& d1 Q$ Z) b. o0 c# {2 k# a        WaitForEnable();                ( C" k) f5 `( n# ^  [$ n: q( E1 V
        LCM_RS=1;LCM_RW=0;0 z  [3 O  I$ t! e/ C( [
        _nop_();_nop_();" S9 M$ i5 e/ r) b; p# D
        DataPort=dataW;_nop_();        
6 \  }; F6 t' B        LCM_EN=1;
6 g5 g' F; D! l) Y! T        _nop_();_nop_();_nop_();_nop_();  g& L/ [, j5 h/ n- [8 {& @
         LCM_EN=0;
- Z% x% K) _, G. W' _}               
/ ]7 S* j& f7 _; w( P/***********************************/  A+ F" E, ^1 [
void InitLcd()                                
4 U: i6 R  e; b{                        + \7 D; b2 X- m9 E* X, t- e' ~
        WriteCommandLCM(0x38,1);        ) V; U* r8 G+ g  d* J" y% M
        WriteCommandLCM(0x08,1);        
( W1 z8 ~2 |% u6 r        WriteCommandLCM(0x01,1);        
; M' h9 D1 R( S9 ^$ P; j3 B        WriteCommandLCM(0x06,1);
# u2 [1 T: _( ?; i( W' x+ J+ J        WriteCommandLCM(0x0c,1);  ]( V& s! R  U/ I2 Y/ o/ B/ K
}                        ( B2 R. X' Z7 {5 Y
/***********************************/# V: p: l" [6 A, W
void DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
& z0 d3 Z+ c2 V3 d{                                                , T/ Y% ^  N) }3 M  |  O
        Y&=0x01;                                                ) m$ g0 Z' v) J
        X&=0x0f;                                                
; _- h9 D! ~, }9 _        if(Y), A" |/ u% q7 Z& {8 u% [( k
        X|=0x40;   //8+4=c
0 \5 {1 V) ]9 w3 P& V
* p) k" a, d  A7 ?# f  a        X|=0x80;                        ; K( ?- w! h% p9 c, l  q
        WriteCommandLCM(X,1);                ! `2 p* r# k: f, x$ b7 J: `
        WriteDataLCM(DData);               
" S0 O* v% x6 d7 ?* I}                                                
/ O9 D- {( K2 z: G6 o9 k
; J1 J' m( N2 x& j" I/ H* X8 ?) F+ A' w2 p
void Delay5us()                //@12.000MHz/ i3 M# s! u3 e5 z! m* O- c
{) C' F7 N/ b! B3 w5 I
        unsigned char i;. a8 V) M5 [, [/ S; Y

: z! _" t, q. D4 U; |! p4 C/ K        i = 12;( H0 j& I9 H2 M! U5 n
        while (--i);8 T% C3 ]7 {) m! V, N* E/ j! W4 a
}
5 T5 g- M- C# h/ {7 ^' I3 \/ c( C
0 D+ N! _; |1 }' e0 G' \5 W
void Delay5ms()                //@12.000MHz  G9 v; v: a5 G: z  V  v( H" F
{1 q6 c& l% X* o1 Y7 o, I
        unsigned char i, j;3 V" N# M( |, [8 r1 T) R
  `/ R0 ]7 B+ @! f3 Z/ F
        _nop_();
6 O8 W. m) n# ?( P, c        _nop_();! D! t6 p7 Y6 T/ v" @' c8 m4 O( b
        i = 59;2 w1 w' X' ]% ?% c6 t
        j = 89;
: I1 |. v+ e2 ~; e) R& f        do( y4 O$ `0 W" z7 B8 Q* ?. A' |4 z
        {
2 @: C" a  X# y( L3 C5 G                while (--j);
" O) F3 b2 ?& {3 o' m( {        } while (--i);& r8 K' Z. k/ \1 |) x/ C
}
9 X3 s9 J. \/ n/ P2 z1 E( `
( e- _5 F8 g9 i3 e4 D. E4 J& F, r7 c! |8 P' [) \( |
/**************************************
3 Y3 n3 B3 ~/ i& I- R; n起始信号7 ^! c9 v5 v8 ]. k
**************************************/$ ]5 `. S9 ]$ I8 j- s- c! \
void ADXL345_Start()% n  J' c7 `( o" N9 ~# }
{1 x& i7 D, s8 I  m
    SDA = 1;                    //拉高数据线
9 V" f8 t* S0 X" R0 L' U/ Q5 p/ f# F    SCL = 1;                    //拉高时钟线
2 {# D& Q4 O0 I9 P, G5 q    Delay5us();                 //延时
0 K: k; K+ A+ ]    SDA = 0;                    //产生下降沿. f+ Z8 v1 A& A. |' i% n
    Delay5us();                 //延时
* l/ j' _4 K) [% q    SCL = 0;                    //拉低时钟线
6 O: T+ @9 p7 u}3 ~0 e; K0 t% `5 @  D* F+ x

) U' `& i4 P# E$ k, \5 o3 L) E8 t. L/**************************************5 B9 e. b3 k: E# J5 K8 {; _
停止信号
. H- B& q; b& O7 z**************************************/( f, w* ~4 x) O) v' Z+ O; w1 h+ d* W
void ADXL345_Stop()
2 c4 d3 {. \& r# z{
/ c# x( a1 d) m4 \9 W, w+ ?" ^    SDA = 0;                    //拉低数据线
- O1 B, [8 v. r3 T3 v% Z    SCL = 1;                    //拉高时钟线
2 m) K6 P, Z, J& u1 K  `" R' L    Delay5us();                 //延时4 _9 Y  g: m+ a3 I, x
    SDA = 1;                    //产生上升沿
) B8 ?$ ]4 z# z* y/ t    Delay5us();                 //延时0 I% \, P7 o- P/ D* A
}
9 q1 X8 @+ l) J" G7 g( y; I; Z" A- p) z, @7 I2 I! O0 o/ \' |) C
/**************************************
# _' ?) o, j9 L; L发送应答信号, ?# z& a" @9 Q5 G6 t6 D
入口参数:ack (0:ACK 1:NAK)- W) Q3 V1 |: V, V2 ]1 i7 _. u+ I
**************************************/" k7 {$ ]. k4 o/ X' `. [/ M  K
void ADXL345_SendACK(bit ack)& n0 n: z4 j( ]' @( n1 g1 j% `
{
" B& g& X3 b9 [  K- w' H    SDA = ack;                  //写应答信号+ k8 I5 a  _) r. f
    SCL = 1;                    //拉高时钟线9 o/ @" ~# i6 S" F1 N
    Delay5us();                 //延时
* s0 B& J0 E4 o9 _2 @* o9 B/ X    SCL = 0;                    //拉低时钟线9 r! l) ?, v& E2 u
    Delay5us();                 //延时
& q9 |; p7 F$ i}
) n9 f- A1 y; [9 c' u. ?* ]8 Z  I0 Z) C5 ]0 I
/**************************************& ]5 z9 u8 f! t* [$ K4 j( Z, m
接收应答信号& ^# N" k2 Q3 {4 P- U
**************************************/
# i) c# m4 y2 h. u: j, d+ _bit ADXL345_RecvACK()
# V( Z/ P8 m; l$ A, n9 g{( z0 ^  _9 R/ q$ R1 Z1 Z
    SCL = 1;                    //拉高时钟线1 S- `$ q* `5 l$ n' ]+ ^4 q, O2 i
    Delay5us();                 //延时4 c3 a) V+ T$ a$ ~: f/ y
    CY = SDA;                   //读应答信号
* W  i7 a1 I8 A    SCL = 0;                    //拉低时钟线8 u+ y/ z7 G# O# p7 z
    Delay5us();                 //延时5 S. a! s3 m, o% ~4 l# `* w. q$ f

  V; n1 K- N  A/ _; m    return CY;
1 |/ \  ]  w. d}
7 z2 o/ m% l5 Q
: D5 |. A* g) A0 J* u1 g& {% v9 z/**************************************
( z" {% G6 |* S5 q+ T7 X向IIC总线发送一个字节数据) H5 V& C' T! X7 a
**************************************/
& W6 T3 R# `6 N* s6 i; l+ gvoid ADXL345_SendByte(BYTE dat)' V  v. Q2 R6 J
{* Q  L" ~4 H' f, ?" I- [# [
    BYTE i;' v3 X' w% j$ I, M- y$ v) `& R
$ K/ N, V3 i$ h1 B& [3 q
    for (i=0; i<8; i++)         //8位计数器
1 y, k) t. p* X" T8 ^) i    {6 m5 }$ F; r( D, R; X8 K
        dat <<= 1;              //移出数据的最高位
3 ~: L2 ?# W: ?( I4 Z2 {' Q        SDA = CY;               //送数据口
4 R- W& N8 w! n( g        SCL = 1;                //拉高时钟线! O! _: A* V8 [0 _1 e) M# B
        Delay5us();             //延时, q; f( [1 w0 V0 y8 t
        SCL = 0;                //拉低时钟线
: L% C% L5 o: a$ G' N        Delay5us();             //延时" t  }# s% D# \2 V' }5 A3 g% e
    }& U  s2 p& w5 C* L
    ADXL345_RecvACK();. ?8 p7 J5 j! @
}
9 x& ~  M& b/ e) X
# O' A$ ?' _) v' k* I4 s; s/**************************************
" A$ N; _( b# j  r+ J从IIC总线接收一个字节数据
6 v8 U0 Y  `& X5 @5 {+ W1 p**************************************/9 ]- O' g5 u( J0 Z! u. J' K( q
BYTE ADXL345_RecvByte()
6 D$ l; J4 i2 ~. h4 Q& F{5 G6 s8 h" r3 @' B3 I9 b9 [
    BYTE i;
6 P" U, B+ e5 E& V+ p    BYTE dat = 0;) n% N  Y# ~7 c
    SDA = 1;                    //使能内部上拉,准备读取数据,
7 B) h' o$ A- T. Z; Q    for (i=0; i<8; i++)         //8位计数器
7 Y) }" J9 d9 P3 i' M0 u    {2 n# v" a# G- O; d& I9 o# Y" M1 i
        dat <<= 1;
' w' G. ?- J. a) [4 h        SCL = 1;                //拉高时钟线
# s* c( b: N$ O3 Q& H8 y        Delay5us();             //延时
4 [) F1 R% L' G. P% D9 U        dat |= SDA;             //读数据               
8 P1 a3 H% S: L6 F0 i        SCL = 0;                //拉低时钟线# f3 z& A) C  }! V. ?
        Delay5us();             //延时9 V" E% [8 m% o0 x
    }
$ l# _' |' f- V/ s. {; u    return dat;
6 K' l+ k5 P9 j+ l/ u}
$ s6 R1 B3 c0 A4 Q1 I2 h# C- _) u( q* _5 ~- g; @
//******单字节写入*******************************************9 S" r$ I* W' X" ~/ K
//用于ADXL345初始化. M9 E( e3 t; ^! j. e
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
* g! ~$ D5 X% k% R" O, s6 |{
+ W9 O! a8 y( B    ADXL345_Start();                  //起始信号
* r4 \  d$ j: m, W3 ~% Y) C/ i    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号
7 U% X% _7 }1 w) p    ADXL345_SendByte(REG_Address);  //内部寄存器地址,请参考中文pdf22页
+ }, x& n# U3 R; Q    ADXL345_SendByte(REG_data);    //内部寄存器数据,请参考中文pdf22页
1 |9 S% N6 e  B( @3 d# ^                                       //相当于 向相应的地址写入命令字
# k7 L& V2 X7 }# p    ADXL345_Stop();                 //发送停止信号
3 F% I/ ~+ h+ C, w3 B6 ~}
$ B" ]0 @$ B  l8 \7 [9 V; V1 h" ^/ f" r. Y
//********单字节读取*****************************************
$ Y8 z% n- \0 ?uchar Single_Read_ADXL345(uchar REG_Address), H4 ^" }  {! c9 ^5 ?% O
{   
* H  N! I/ `1 Y* r2 \    uchar REG_data;
. j% H& ]" a5 J+ B$ Q/ a    ADXL345_Start();                          //起始信号
$ L: s6 {3 i  B3 C6 ^( }- v    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号,//0xA6写入
) U4 d2 u% F: O3 d; W6 j9 S    ADXL345_SendByte(REG_Address);            //发送存储单元地址,从0开始        
) K! h0 i. Q; K( S    ADXL345_Start();                          //起始信号8 G4 k6 w. v) ?/ |
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号,//0xA7读取
# x* L$ p  |" G7 D0 O    REG_data=ADXL345_RecvByte();              //读出寄存器数据9 ^9 H$ Z4 q0 Q- n4 q4 n
        ADXL345_SendACK(1);   1 ~9 `9 ?' ^% I: _
        ADXL345_Stop();                           //停止信号
5 a: H0 Y1 p0 `1 X% e& d2 z    return REG_data; + _7 H" ^5 E; i8 G) W
}6 I- a5 B# M( X1 ]; W
//*********************************************************
) ~, H4 X  S: c# ~# W& E//
0 D/ u- D/ ^6 X# u, u2 u//连续读出ADXL345内部加速度数据,地址范围0x32~0x37: d6 g8 ^' D7 h. j
//
% O9 t; h7 m2 ~- @; k2 U% `! a//*********************************************************1 ?5 L! g5 g% K' b( }- b
void Multiple_read_ADXL345(void), d% V- D, B1 z. u. A) _
{   3 V& F9 f2 P$ j" e! n  C- z8 |
    uchar i;1 M, N0 P" o# C
    ADXL345_Start();                          //起始信号- V2 j& M- k. F7 s6 E, W) C
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号  |5 E3 b" E/ E! i. N
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始          b1 L- A: J! T- u+ S
    ADXL345_Start();                          //起始信号& k1 x* X1 u2 y  {% P! I
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号! U% y( T  O+ ?$ b/ X
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF8 U( C* l; C6 T, K7 K
    {; l' Y/ C) T" }" l1 M2 I
        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
6 v  Q- Q3 U+ d- @9 n: g$ A' ^: Z" e        if (i == 5)1 @. L+ M& q- q+ ]: f6 }
        {% W9 `; `( n) C2 V- H1 g
           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
7 Z& ]# d- ]8 ]  q/ s# y2 R        }
0 C: S- G& _) s        else/ P8 C- U7 z) i& Y. c. @
        {
+ x. X1 j8 i( K; v+ ^8 T          ADXL345_SendACK(0);                //回应ACK5 O% j; `9 _! H8 b: z; c" y# J
       }
/ R; x7 _& U3 }+ k: e  B   }
4 {& y2 Y/ Q1 b  t/ G  @    ADXL345_Stop();                          //停止信号
+ ^4 @; q- A! c3 u    Delay5ms();* b7 q2 }' W% W1 F: P8 q3 t7 a
}
, _' y0 `6 v, X) l! ]; t
8 y1 y* U! w/ w/ f8 H' Q//*****************************************************************: ?/ T1 H: Z) r6 @8 u- T( L

8 P' E9 R0 e- X; o2 P4 v//初始化ADXL345,根据需要请参考pdf进行修改************************0 b$ T; ?* M( r( h! u) T# T
void Init_ADXL345()
# J' n# f6 X3 s& n: T{; v! p% C: B' ]: Y
   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式, }# ]3 z; D4 u% x0 P3 {! y% h1 Z# v
   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页9 M. K1 F+ Q6 F# x" a  @5 O' d
   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
0 W' j) F- y8 p! F% m6 m   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
' m, ]5 l4 E( ~5 k! ]   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量+ T5 m- x4 A1 J; \/ a
   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入,pdf29页) A/ W, _+ T% s* K( M
   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入,pdf29页
* _1 z* K5 A: W! C$ r}
8 F1 Z% r% P: t, Z
4 z' M4 L- c6 S! g1 ~7 _# d //*********************************************************
$ E1 E5 K! j, G& B0 [0 p8 h% Nvoid conversion(uint temp_data)  
% k) S) T+ z; T' M1 {3 c{  
1 L) F, z6 V' k' k- M    wan=temp_data/10000+0x30 ;              //0x30='0'
0 k' [: B  C2 v  R+ ~    temp_data=temp_data%10000;   //取余运算3 |8 A* ]3 I# K5 ?+ p1 U) h. R
        qian=temp_data/1000+0x30 ;1 O% K" [1 n2 T, ]4 V
    temp_data=temp_data%1000;    //取余运算
) F% \2 T) S/ {+ E0 q    bai=temp_data/100+0x30   ;. J4 c. S) f3 X9 g. X
    temp_data=temp_data%100;     //取余运算8 j3 g4 R4 s; }9 G3 ^: @
    shi=temp_data/10+0x30    ;
8 _: c- j$ |& H' I* Z# o    temp_data=temp_data%10;      //取余运算
% Z* ~( l: @1 ]# x, Y' g    ge=temp_data+0x30;        ( g. t  r/ p6 l: f8 o, x6 I
}# R9 G* {* j3 H# [: D9 Q3 S3 ]# O* n

2 N1 v! `4 q) F //显示x轴倾斜角,即x轴与垂线所成角度8 S' D5 U) S6 G& {, @
void display_jd_x(): y/ Y: J- D4 A) _) A5 D0 B/ y4 z
{   
+ Z1 |7 Y# q" b" z" G/ c. W    bit bj=0;//标记. W5 h% p" n$ H' D; j
    int  dis_data_x,dis_data_z;  //x,y轴加速度的原始数据,用补码形式表示) P/ R* g9 t. T
    float mg_x,mg_z;           //角度,加速度/ P6 i9 Z4 S4 z& a; B
    dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据   
  S# A, `7 ^9 g5 C        dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据  L4 z) U6 K3 d' k& g+ i, u& Y

: f- ?0 k0 {( l8 _  `: a        if((dis_data_x<=0)&&(dis_data_z>0))          //第二象限/ Y$ W9 W6 ~& M% P3 B
        {- O" r: l  E# R5 ^. }7 r0 ]; G
            dis_data_x=-dis_data_x;
: o3 s! s! G/ }9 {2 q1 V                DisplayOneChar(8,0,' ');9 o: j0 S6 h) F; l5 B" D- v0 b
        bj=1;
5 O9 _' I; v" k2 Q- y) i        }4 w' o/ _. |. u% V/ F1 P
        else if((dis_data_z<0)&&(dis_data_x>=0))         //第四象限
" A4 m, ]3 C' c$ u$ R        {
$ _3 b8 d0 j- a            dis_data_z=-dis_data_z;2 J! U) h& ^/ ]; \7 j
        DisplayOneChar(8,0,'-');  //显示正负符号位
( I9 m  A8 }3 s; F" }4 ]2 B        }
) ]8 u* d9 d$ j0 O6 V1 y        else if((dis_data_z<=0)&&(dis_data_x<0))           //第三象限  ^0 f# s& Y& W7 s8 f" l( q! [
        {  G5 d( D2 |( N6 f. m$ \
            bj=1;9 l$ u0 z) |* i+ o3 D
            dis_data_z=-dis_data_z;$ c7 e7 Z  ~! _3 c0 h' x1 P* {3 n
                dis_data_x=-dis_data_x;# Q/ W) R6 W. _, G4 i& ^4 a
        DisplayOneChar(8,0,'-');  //显示正负符号位- N$ g5 X$ p* a5 R5 g: p
        }
! f2 y# P6 J8 q' f' g8 m/ N: Y7 g* W5 W. c        else if((dis_data_z>=0)&&(dis_data_x>0))$ _* G1 {. A8 `/ Y" c  K# u, L
         DisplayOneChar(8,0,' ');                //第一象限
( O7 i  ^0 g- D5 `. T; J1 N- W; f0 f
! E1 d9 ^  G  O, B! X! ]2 {    mg_x=(float)dis_data_x*3.9;  //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
4 H6 l  ~3 M' g% W/ ^        mg_z=(float)dis_data_z*3.9;         //强制类型转换,dis_data_z的类型和值不会发生改变
$ w- t5 d3 y. Q) R6 H' F2 |) V. N9 e4 T/ b+ }! c
        jd=atan2(mg_z,mg_x)*(180/3.14159);% M5 n  R% h# ~& {
        if(bj==1)jd=180-jd;        $ c( A% ^0 Q' l' u/ t# I' S& h
          //jd=jd*10;  消除小数点,便于转换数据和显示
; D4 P7 Q+ w/ k8 h    conversion(jd*10);      //转换出显示需要的数据                                        // & L# E, y/ o! J" C
        DisplayOneChar(6,0,'X');
. `6 H$ L, s( ]. ]6 q        DisplayOneChar(7,0,':');   
$ v& \* q# Z6 b# i& T        DisplayOneChar(9,0,qian);, d& R* M% A0 B& n/ i
    DisplayOneChar(10,0,bai);         
2 a; P9 F- n& b! d! {- ]    DisplayOneChar(11,0,shi);
2 W4 }4 `4 |0 a1 }8 ~% O. ^/ ]    DisplayOneChar(12,0,'.');& v$ ^7 o2 E: g# N
        DisplayOneChar(13,0,ge);
9 ?! z; M1 ]3 A6 W        DisplayOneChar(14,0,0xdf);            //显示 °
. C0 F2 t8 V1 B4 c. g        DisplayOneChar(15,0,' ');: B- d) n. A. j1 s5 G# V) O9 H4 p
}
8 n! e& j+ g- j7 a( R  M9 b, z, [. J% e+ C, D, G, t
void PCAinit()        //PCA模块初始化, p9 i! D1 S. u( p' k
{8 `$ Z" `) K  K, X
     CCON=0;7 a, G5 R, M# T! a
         CL=0;1 ^& b4 C8 H. b. t
         CH=0;
2 F& ~( ?+ o3 |$ [5 N- P         CMOD=0x00;        //sysclk/12
6 U9 q, T' n: _) ^         CCAPM0=0x42;//8位PWM,无中断/ R6 d$ {& Y* Y* u. y% a
         CR=1;
; ~5 R; L( J7 _$ S         CCAP0H=CCAP0L=256-240;
9 N7 Q7 f! o$ f& m2 p}
, i4 A- ^3 \, m2 c) L4 Rvoid init_t0()         //定时器0初始化0 S- @9 b+ L0 m
{7 C1 T5 f1 M% t" m
    TUXR&=0x7f;         //12T
! l+ Z- E- E9 F' ^* `5 b2 ~        TMOD=0x01;
/ `9 t$ k' q) G( _9 f3 k5 Q: q        TH0=(65536-50000)/256;
0 O! v' ?9 Q/ h1 P: L; {" {  Z: J        TL0=(65536-50000)%256;
2 t) v6 k# a) s$ Z        TR0=1;0 a5 `0 ^: H) N* V( W; ?% o
        EA=1;
' J) ?" d$ X, T        ET0=1;
1 O* m; l, J; v  r}
7 @- g& _9 V8 ?1 j
' m  S5 S. B0 w4 b//*********************************************************
* p3 l$ v* b: [6 \7 i7 b* Y//******主程序********
  c1 f" I% v6 f7 O//*********************************************************
: c9 L' n6 |* P; x$ e; dvoid main()
; J8 j3 u' q; W, C& ^0 u  r{         
, X3 s. _  {! b: p! a  D3 b        char H;        
6 ]# M/ O8 m0 |* d2 g- s- o% I5 ]        InitLcd();               //液晶初始化ADXL345+ K+ [" `# H9 y) q3 w
        Delay5ms();
+ j- l: q9 ^  L1 r; l; q5 ?        Init_ADXL345();                 //初始化ADXL345
  H% T; z8 b) k        PCAinit();
: s% U& s0 S& o        init_t0();
. t: W4 L3 y. j! W        H=CCAP0H;
% v0 d/ x" }. x( C2 B; d8 \' H" a7 \* ~. E& S6 X9 G5 D
        while(1)" W+ w: e& H. x( A9 g
        {                                                                         / ], j4 I( O, s
                if(p33==0)
( a6 |  z* c7 X! J                {         6 y0 ~1 R5 f4 V
                     Delay5ms();
+ O6 D( s! `9 o5 J: R& f                     if(p33==0)( s' M2 D) Y( q
                     {, e  k7 [" W5 @! t" o) H# |8 B  m
                          H=H+5;
7 t6 n3 T8 P; e, Y' s: L2 k: t                              if(H>255)H=255;
8 l6 ?; [( F% G# i: e" A# Q  [                              CCAP0H=H;
- t' t' c& x& \                              CCAP0L=H;* x3 x2 Q9 x( t3 {: ]9 L& x" l
                              while(p33==0);& \8 H8 @8 z3 P5 F  f0 @
                      }! ]+ y/ \6 t. Y( q
            }. x2 n4 T2 ?8 R( p( c; z; B
                if(p31==0)' a+ s/ e: ]5 q  @$ t, w
                {           X  V* G7 S: Y! Q! r
                     Delay5ms();4 Y9 ^2 U/ G& |6 s& j3 l
                     if(p31==0)& I0 S* S6 o. P! H8 o
                         {9 q4 ~! v! p1 M7 A
                            H=H-5;
8 Z4 n& ~  h5 q1 X. K* L) u                                if(H<0)H=0;3 J  H& s- X: U6 V; H
……………………! ^1 X, F5 A( M, _( l
3 c+ B# ?3 j3 G; n! C
…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………
$ i' g2 z1 E- ~2 V* V
: v4 V9 l+ m8 g5 z/ c0 Z- i
游客,如果您要查看本帖隐藏内容请回复

) ?6 ~0 o! I7 K# s+ i
! ~9 b$ g# d, m. ?/ Z; J# H1 M( `& A# P

该用户从未签到

4#
发表于 2021-7-8 10:45 | 只看该作者
正在學習運作 ADXL345, 感謝你提供的程序.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-14 05:46 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表