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

ADXL345测倾斜角(程序)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ADXL345测倾斜角(程序)
6 W! l$ L. O( I5 H2 Y
# w4 A( J4 |/ u  S. p0 [
单片机源程序如下:

7 P) ~: m+ C8 ?1 X, M: A8 k
6 j, B; @! F2 V7 B  W) r#include  <REG51.H>        : Y; \3 Q' i# G% z7 x
#include  <math.h>    //Keil library  
0 \# v0 I4 P% O2 K1 U$ O#include  <stdio.h>   //Keil library        ' L/ p& s0 B/ N+ C! V: U/ H
#include  <INTRINS.H>* K( b6 l. v# ^- q
) y4 k* x& A3 [' s6 P! j! ~# g
#define   uchar unsigned char4 r7 W$ `; A: t' d
#define   uint unsigned int        
+ C: [$ L# A* Z" n* ?6 w; u9 N#define   DataPort P0    //LCD1602数据端口
5 h2 r" }7 P; |) F7 b1 v0 N& L# i  d" e. l
sfr TUXR=0x8E;  P4 w- g0 \) _% g
sfr CMOD=0xD9;' x! x+ o1 Q' _2 P' _, J
sfr CCON=0xD8;8 ?! f4 [6 C# J6 O, X8 D
sfr CL=0xE9;% z8 E: E7 ~6 A
sfr CH=0xF9;
& E7 @( D" h7 rsfr CCAPM0=0xDA;9 ~6 d- b" [- f/ G7 t
sfr CCAPM1=0xDB;$ V* M1 ~8 I6 N$ M7 f2 f. F: j
sfr CCAP0L=0xEA;9 k/ l* g5 N( I# L/ ^
sfr CCAP0H=0xFA;
' u/ \  G/ }- l& Tsfr CCAP1L=0xEB;
9 r" r+ ^7 o. W# f+ {sfr CCAP1H=0xFB;
+ k* Q  e( n3 jsbit CR=CCON^6;
' e/ S' i# X/ `
, k* J* H$ r) F, x% t- m1 P0 b+ ]! o
sbit          SCL=P2^0;      //IIC时钟引脚定义5 n- }5 H9 N$ |8 u" n1 v/ m+ V
sbit           SDA=P2^1;      //IIC数据引脚定义8 \6 T4 {/ J% u5 S
sbit  p22=P2^2;& J6 E3 t- m5 U: D9 e
sbit  p31=P3^1;
# n. D; ?$ v  F8 _+ K2 r4 b/ r0 _sbit  p33=P3^3;
4 }' w% E& _6 {5 A; X* Qsbit      LCM_RS=P2^6;   //LCD1602命令端口               
/ S% H6 {) _: H7 ]- z. tsbit      LCM_RW=P2^5;   //LCD1602命令端口                " y& q- B+ K* c
sbit      LCM_EN=P2^7;   //LCD1602命令端口$ |  n  f% B+ x' I# h1 o/ U
2 e) @" S. t( \/ h2 W* S
#define        SlaveAddress   0xA6        //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改; L0 Z) B0 |5 ^& x' s* c) R
                            //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
# A8 c( W  N& G* P* C: M! Q7 Atypedef unsigned char  BYTE;
+ @% Q+ ]( P0 }* _typedef unsigned short WORD;
: i! N3 f8 z! A* z6 m
5 m2 P5 r6 G3 F' pBYTE BUF[8];                         //接收数据缓存区              
5 Z4 w# K1 T" ruchar ge,shi,bai,qian,wan;           //显示变量  个十百千万: N/ K" R% Q( S
int  dis_data;                       //变量7 P) i9 C' z9 z; u* D
float jd;; U, z/ P* n# ?( ?, `$ N
uint PWMH;
7 W+ I" h0 m3 w0 c7 `' E! d$ Ivoid InitLcd();                      //初始化lcd1602. }' I# e+ J( S& Z) U% G
void Init_ADXL345(void);             //初始化ADXL345
9 f# Z9 i/ J! h7 }# s. g+ |- I+ e3 O
/ _2 C% ^) M" {! p! s/ ]( Q5 Q1 vvoid WriteDataLCM(uchar dataW);                // LCD1602相关函数
. |8 L+ u6 n3 R7 T6 Fvoid WriteCommandLCM(uchar CMD,uchar Attribc); //8 h$ M3 j/ @  c) H) [- e* I# ~
void DisplayOneChar(uchar X,uchar Y,uchar DData); //
9 Q/ L( Q- y- I! R, H7 i+ \2 n% c7 hvoid conversion(uint temp_data);        //数据处理
, H* _. I! w5 |( G# ^- h' d
* Y9 G5 R! P% `3 N5 E4 Dvoid  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
$ r* Q# E0 r) Juchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
' M9 s1 M% q  }, q. ]1 D8 l5 zvoid  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据3 N* L" T1 F5 U
//------------------------------------+ |: b+ o* p# i
void Delay5us();
3 F8 _) ~, D, M, q7 K9 E/ }void Delay5ms();9 ?1 @. c2 s1 H& }$ U) p
void ADXL345_Start();       //与iic有关函数
/ `) @. C( U$ D6 a* e9 I6 {void ADXL345_Stop();7 V/ W' J3 U% w# L
void ADXL345_SendACK(bit ack); //传送应答; K5 H8 s9 g: {
bit  ADXL345_RecvACK();                   //接收应答: C8 B  o8 J) j' n8 F& ~
void ADXL345_SendByte(BYTE dat);! g" u6 s5 _0 d( a
BYTE ADXL345_RecvByte();9 x/ f8 S$ ^9 n3 R2 ]1 i
void ADXL345_ReadPage();& c# L" s# f+ X
void ADXL345_WritePage();
3 ?$ c" u) ~- G4 C
0 N# b. [0 i" N- j! y/*******************************/
  D+ W) D; `6 y6 h3 I& ~; ?void WaitForEnable(void)          & s6 k1 z1 L% [$ a: D( w
{                                       
8 e. d1 k. L0 k+ |* a* d. e        DataPort=0xff;                3 o/ A# v1 G3 J% P( M6 L
        LCM_RS=0;8 n/ F1 k' M8 F  Z; q* s
        LCM_RW=1;8 c& d9 Q: o9 q4 d
        _nop_(); _nop_();
/ P0 {/ o! z- j8 p# ?        LCM_EN=1;  ]& J/ S- B8 D8 o6 D$ {  `% M
        _nop_();_nop_(); _nop_();_nop_();
. F, b* D0 J# v! U9 [        while(DataPort&0x80);        2 y% t, v0 `; k' E( b  ]( T3 ^
        LCM_EN=0;                                ) \4 o& S. H' w8 [
}                                       
) \) ^; W, t5 D2 X/*******************************/
* @7 E0 r( r) X/ K: Uvoid WriteCommandLCM(uchar CMD,uchar Attribc), k- x% E1 R& ?1 E* c: e
{                                        / V6 b2 o7 m1 c) [2 X' z
        if(Attribc)3 t5 e$ c! d5 z! {# `" m. \
        WaitForEnable();        
: T7 c2 X; D+ [, ?7 H! q        LCM_RS=0;$ I' b/ g' i) [/ z" e) T
        LCM_RW=0;. X0 h5 X9 K8 m: a5 l
        _nop_();_nop_();
! ^6 E& t9 G! ]+ l) Q0 j) }  ^        DataPort=CMD;1 k, X+ O" u" s' q/ A" i
        _nop_();_nop_();        
) d6 d" O& E  E* w) L; `        LCM_EN=1;
  v; G* W4 h2 {# S( Y! d" P        nop_();_nop_();nop_();_nop_();, t2 y: y/ ~7 e$ B  E7 `% d5 c
        LCM_EN=0;! a# ^1 G: ~- e% N. \
}                                        % A1 P$ U5 C: ^1 w3 l1 D. ^
/*******************************/
# V* u; \' D( L1 p3 qvoid WriteDataLCM(uchar dataW)3 s! w! S! z& _4 H+ N  J
{                                       
( e, |2 v5 W; g- Q        WaitForEnable();                5 S; w. ]- S$ n, H9 O1 _, c+ F
        LCM_RS=1;LCM_RW=0;
7 e' a1 A! D' K* ]& A7 P' S        _nop_();_nop_();
6 ]! O- C: f8 o" B) Q% S        DataPort=dataW;_nop_();        
7 ^( n  X' p3 w; r- A1 B" Y! n        LCM_EN=1;
3 p# R: E6 V$ n        _nop_();_nop_();_nop_();_nop_();: i0 y. i: J/ H# V4 e$ m+ P
         LCM_EN=0;$ D* z) D1 Z$ u' U( G
}                $ T$ f9 f$ V8 K+ D% W, a5 @9 t
/***********************************/8 l" X2 V( X+ ]! A! M# A
void InitLcd()                                
" }7 q, C0 b9 Q, {; g& F' G5 `0 y8 p* Z{                        7 m# }* ]2 Q" Q/ v- E) p- l* b
        WriteCommandLCM(0x38,1);        
7 S( q! T/ s, o; S' a' O        WriteCommandLCM(0x08,1);        . b: a2 A+ i: `
        WriteCommandLCM(0x01,1);        5 ^* g" H* z5 z. U3 j" f9 n+ U
        WriteCommandLCM(0x06,1);
# _; A* j  a( P        WriteCommandLCM(0x0c,1);* }$ H" C) q: j4 ?, p2 ?; X0 x
}                        
, {( X* H+ l& R) L+ f0 ^5 r/***********************************/
- P- N$ V; q6 p4 m* P- ^0 w$ ^$ lvoid DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标% T: S, b+ I( t
{                                                , y- v. m6 g- m& W9 G
        Y&=0x01;                                                
3 Z* ]: X- C1 w2 s8 E# k( C$ L9 w0 H        X&=0x0f;                                                
* F0 p" o0 `1 Y. `( T        if(Y)
, N. i- T' n  S3 C        X|=0x40;   //8+4=c- V2 n& q# R" d

2 p' L1 c8 ?0 k5 _        X|=0x80;                        + X* P1 m5 `  l+ h: i
        WriteCommandLCM(X,1);               
- F9 U/ f2 e5 B        WriteDataLCM(DData);                + N5 h* ?2 |8 @; s9 k8 p) i* @7 `/ l
}                                                4 m- u+ x% V- A7 y! x3 r3 [

" G: S0 _; g8 ?" A5 k# i/ ]
4 g2 d# M5 ?+ M( Evoid Delay5us()                //@12.000MHz1 N' [8 E1 O+ b1 t
{
! g9 z1 p/ T* K1 P& Y8 Z& u% E        unsigned char i;
# K. z$ U0 w0 L2 ?, a
1 ?5 Z* t2 J; a' j+ L# T        i = 12;
8 k6 F( b/ k, t# A        while (--i);6 B" r( o4 q3 |. J. |' _/ W
}
, [/ S) b# A* G5 K2 B7 I
( c. F+ c+ Q. c" K
3 p5 W0 D3 x3 E/ L& F3 Cvoid Delay5ms()                //@12.000MHz6 p  \+ p8 V# c" }
{# u. l% n9 P# X' S4 r! `- F
        unsigned char i, j;& E, Y/ i. f# x6 B. G' J. \% B9 k

% S6 t; L3 k. A- f# C& N        _nop_();
0 R" m$ W) O# J" A& C        _nop_();
( m8 a* P' K: o' [; k  {        i = 59;
  [" h2 }2 x! h# o        j = 89;
+ I  R. H0 I& H! s. o( F        do6 L& z+ ^0 ~/ b9 _9 D  X
        {
8 r% [8 U0 e4 E7 p, h- w! h. C4 t                while (--j);
$ ?; w! G6 U% v( {        } while (--i);
9 n, H/ B2 `* w1 v/ I0 H- w}' g! A6 @1 e6 Q5 F* E9 \

6 n: ]( @9 i- Z6 a9 ^3 [
* U8 v; R, d1 T7 a4 ^/**************************************
1 A5 \- l  d; z  U起始信号
" {3 }# d+ o6 s, N; c0 r/ V**************************************/
5 A6 O9 H. K! dvoid ADXL345_Start()
0 Z; E! T; S9 t! y7 ]6 M, W{% [1 }( d) a9 B% Y* t- h  s
    SDA = 1;                    //拉高数据线
* ~3 z) N" N4 m& m2 _5 ?) D$ d9 f    SCL = 1;                    //拉高时钟线7 m0 M+ F+ g3 ~; [, S6 c4 z
    Delay5us();                 //延时: n4 N/ r/ a( P: m. I0 c: f
    SDA = 0;                    //产生下降沿! C6 N- H, F# u* U
    Delay5us();                 //延时
+ w0 g4 r" f$ |  ], G5 G$ c8 e- l    SCL = 0;                    //拉低时钟线! f, Z$ l* Y! e- F
}
$ b2 f5 V% J. n9 g  p; D+ e( T$ [, T
/**************************************' L4 o+ b; Q0 Q+ l7 d) u& T
停止信号
+ m3 N9 W. F4 w" Y**************************************/3 w* N, g0 w% d' t1 r
void ADXL345_Stop()) Y5 C$ }0 r* L( l' A# O& X( |
{2 ^% v& k  U5 h1 q# V
    SDA = 0;                    //拉低数据线
* Y) I" j, N" G: k    SCL = 1;                    //拉高时钟线% F. i1 x, s- c. o: E; X% Q
    Delay5us();                 //延时
9 p. n: ]; q" m. |, y    SDA = 1;                    //产生上升沿
6 ?  z5 d% _. b: s    Delay5us();                 //延时5 [' b) Q1 W  Q
}
7 D; |  Y  l  p" ^4 x4 x
  M" M* K7 ~3 [+ I1 I6 f9 \' c/**************************************; Q* V! q% t( ?- T8 G. {2 |  R% k
发送应答信号
. e: a0 R% _; j! L& N  l入口参数:ack (0:ACK 1:NAK)  `& u0 }% S! z$ h3 o& o9 n
**************************************/
; U1 |5 L# t8 F7 u# n) Svoid ADXL345_SendACK(bit ack)+ o/ ?% G+ G5 F" t! d
{( e! ~: i: |; @9 d% Y9 O2 V
    SDA = ack;                  //写应答信号. ]! m5 E$ |& R8 x+ `$ [& f8 e
    SCL = 1;                    //拉高时钟线& q4 ]6 I8 {; `# J* G: }
    Delay5us();                 //延时+ U, N+ X% H4 V
    SCL = 0;                    //拉低时钟线6 r8 E3 M1 [0 ~7 A6 [
    Delay5us();                 //延时
& ?" n! ]# C5 x1 |1 @8 K/ I4 p' i}
' \* i8 F7 J8 ~5 S; I' I4 G  W* f- o. L/ l9 O
/**************************************
: P1 L4 ], O2 }- a; O+ Z接收应答信号
( l; O6 c6 L$ e2 v**************************************/$ i1 A9 i+ b9 t  g# q
bit ADXL345_RecvACK()
( {4 K; k2 A1 C) k3 S! o5 y{- H1 B" r6 T2 i# [# P
    SCL = 1;                    //拉高时钟线
2 b, j% ^6 p& n4 d$ k, j    Delay5us();                 //延时( j" U" Q' q, P1 ?7 f
    CY = SDA;                   //读应答信号
! t, `& }6 F, {8 ^3 I; f6 f8 h    SCL = 0;                    //拉低时钟线  @5 N/ C) Z; z1 \& r+ N7 U; V  d8 i
    Delay5us();                 //延时
! R* D" C1 m3 v" Z
2 Y& |9 Q& C! e+ P    return CY;
! P2 R6 W4 I6 {}
/ t' ]1 v8 ]- ~$ [8 Q
3 r9 G$ c# \, C  ]; i+ I/*************************************** K, G$ B8 m6 F
向IIC总线发送一个字节数据
# _8 Q+ a/ R) q5 U0 ^**************************************/( a  @- o% W& G, U' |1 L2 }
void ADXL345_SendByte(BYTE dat)
5 h7 e& \3 y5 ?' j{, ^3 ?2 i  N0 v6 `5 R% ~# H# z5 B
    BYTE i;
8 W0 Y: e3 Q$ p7 t+ f
2 p8 t5 H! E5 w- q; V) I    for (i=0; i<8; i++)         //8位计数器, p: P& n: P: b' A! ]4 n& I
    {4 Y! K; w; C4 _) S1 F/ d8 c
        dat <<= 1;              //移出数据的最高位
  b- k+ Q8 [3 i        SDA = CY;               //送数据口4 B8 N, l5 e! k# v
        SCL = 1;                //拉高时钟线
: @5 R, W% E, Y& A! I        Delay5us();             //延时& u7 _* J& O8 C0 t8 T; Q" p! ]0 c+ @
        SCL = 0;                //拉低时钟线
0 E# C( \1 Z4 I: s- x8 \- r& r        Delay5us();             //延时, ]6 l9 ^) k( N- i
    }
, @- |& B! `4 ~    ADXL345_RecvACK();* N/ S: m5 o6 Q/ Y4 m
}
' y2 |; S2 e, y( k; s5 D
  b- F* B: H8 {+ u$ z% [/**************************************
; H  k8 D) |3 s- ~: z+ r从IIC总线接收一个字节数据! x" ?% g4 F0 P8 H( f
**************************************/- `2 N$ `6 }9 o; _$ C- S
BYTE ADXL345_RecvByte()
* \/ Q" m7 B# y0 A" |{
8 |  Z/ Y! k2 w    BYTE i;6 {% s  _( `2 J$ [+ c: n
    BYTE dat = 0;
3 Z# P) c: e( k8 t) V- b) I; z    SDA = 1;                    //使能内部上拉,准备读取数据,! q9 \# ~3 d  f& t7 ^" J* p6 @7 K
    for (i=0; i<8; i++)         //8位计数器) `* w; |5 G% d6 R* V9 b' X
    {: Z7 f4 S& |  @" @" p
        dat <<= 1;
( }- r: r+ Y, e: s* |1 d% c' f! A. Q        SCL = 1;                //拉高时钟线" U; v$ r6 _9 n$ [0 d+ ?
        Delay5us();             //延时+ a$ v8 H5 o4 N' ^+ t
        dat |= SDA;             //读数据               0 ]4 H* q2 h! A
        SCL = 0;                //拉低时钟线
$ @! |6 w9 c4 b/ P        Delay5us();             //延时
. @% ]  ]9 v( \" W3 C$ K2 h    }8 A* s' y. b# _
    return dat;- o3 Z- i! o2 ^7 Z# _% B$ r
}* I* V0 R5 q# C) A2 r

5 i/ ^2 N/ h* N$ o: }7 s//******单字节写入*******************************************
$ \2 U6 ?: A0 q9 \1 n& h //用于ADXL345初始化
/ A1 {" N- J( a: Rvoid Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
# D; w5 w# H" k( y7 |4 r. ~0 o- \! ?{- m4 Q& a( D( \
    ADXL345_Start();                  //起始信号+ r/ G6 C/ h) l8 V7 K
    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号8 D6 g/ y/ V$ _: K5 K) l
    ADXL345_SendByte(REG_Address);  //内部寄存器地址,请参考中文pdf22页 8 ?; P, X! J6 o1 Y. u% I  X! X
    ADXL345_SendByte(REG_data);    //内部寄存器数据,请参考中文pdf22页
/ m$ \8 j+ J: L/ z  t$ V                                       //相当于 向相应的地址写入命令字
0 q2 Z% E- _. k    ADXL345_Stop();                 //发送停止信号+ K+ }$ v! w/ f( I3 a8 Z+ u0 l
}
; a0 k7 Q- c6 ?1 u7 U- z
( |/ ^. V' f6 W3 |- ]//********单字节读取*****************************************
7 T/ P5 Y! ^$ ]8 ]2 Y' @' Huchar Single_Read_ADXL345(uchar REG_Address)) z4 J+ [. B9 r! D+ a
{   ' J' `% o! B, e# F
    uchar REG_data;8 D/ R8 G" s1 t1 j, `' Z
    ADXL345_Start();                          //起始信号0 Y) Z( l- q1 U
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号,//0xA6写入6 j6 ^" H9 H+ |9 T: T! R3 q
    ADXL345_SendByte(REG_Address);            //发送存储单元地址,从0开始        
7 n7 ?/ ], \% L& l% L6 z( l    ADXL345_Start();                          //起始信号1 _5 d# m0 w) Z, B" X9 ^
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号,//0xA7读取9 Z4 |) n9 X. {) J/ k3 ?( d4 W4 t0 v
    REG_data=ADXL345_RecvByte();              //读出寄存器数据/ t" X( Q& k& I4 R& ?' ~
        ADXL345_SendACK(1);   + t+ m( k# T% ]/ k. k& o" ^% Y, S3 G
        ADXL345_Stop();                           //停止信号3 u. i4 m# `6 ?& g% x' O3 ]6 ?
    return REG_data;
/ }* p- O# K0 [1 v+ B}) q! o( b! Z+ N
//*********************************************************
9 S) U) V) }9 f8 b//! w7 N! f# e  t6 `- M4 [7 ^
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37( O& ?' r$ w& g$ w( [5 m
//- |' K, I% i5 A. m, M
//*********************************************************- l' t, m4 D1 \$ K5 q/ H8 \. Q7 T
void Multiple_read_ADXL345(void)% `8 R: `, s# {# t8 R
{   
3 k0 I, J0 I8 M( @+ H) u! q    uchar i;. O3 O9 A  Z7 L( T/ K  g
    ADXL345_Start();                          //起始信号
- a4 ~* V8 G2 t" y* |0 p; s    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号( @: o6 K% m4 e2 t3 g: N4 P7 V
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始        
; q& k  p6 o6 i9 F. y7 A    ADXL345_Start();                          //起始信号) u- {% G% r& g+ T" b( R3 q
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  Q: Q, d$ s. P& D4 H         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
+ E! V( M" i/ q  _% A  u7 Q    {
4 y% I- @1 E# ?0 W2 A4 i8 e        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据) p  c# i, m" Z2 F$ j8 \3 f# E
        if (i == 5)
; m0 A) }+ {3 t% K        {
3 H! D# e, D( Z5 l7 B           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
/ }/ o5 v) p6 u3 p        }
0 S& B0 X6 @, ?% I% E/ V5 \8 \        else/ p2 ?, W) U1 _. r7 U
        {
' |" M5 S( Y2 z: e# f$ O6 U! y- M) q          ADXL345_SendACK(0);                //回应ACK
3 H3 \8 {% v7 t5 n8 D, u" h       }
+ d- _0 \1 W" x6 c4 I, w( S   }
1 ]: C( i. W2 Q( @9 o2 \8 I- W! d    ADXL345_Stop();                          //停止信号
$ ?+ s6 b; S2 M$ t    Delay5ms();6 _  w- |5 m5 t5 [' m
}/ J& L' h# r; e. n/ n2 F

0 E( R3 a( \4 U- W4 d) V7 J//*****************************************************************
9 K: {: U' O& q3 n( R/ I) {/ g: ^
, i! ?. L3 x: y7 _//初始化ADXL345,根据需要请参考pdf进行修改************************$ c& p6 t5 c# k/ L1 A9 D9 Y  Y
void Init_ADXL345()
$ ^8 @2 T3 a  C) ]  \, O  t  F{! I5 G+ M$ T  Z4 B1 t
   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式
/ w3 R8 g, x2 w' D- J8 q- I   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页
( C* ~3 M' A( s" |: _- F   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
+ |6 W' B: h4 T3 J8 c* F! w4 {* z   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
$ q9 W! F$ }7 q/ ]8 h' P   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量
% ^* P- |" [5 _' u) d$ @   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入,pdf29页
+ p* ^4 {$ f( i# J+ k& Z, e   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入,pdf29页5 o* W4 J5 X! h& P6 v! D' g
}0 z. [- y. b+ b$ ~" {
* d* c2 ^1 N& H, p2 Z4 v4 S
//*********************************************************
% F* ~+ V; I; J! O- W# Z* Rvoid conversion(uint temp_data)  
( ^) _6 X+ s3 v$ l  }7 q) i{  ( D1 _1 ~! i4 D5 e' }& g
    wan=temp_data/10000+0x30 ;              //0x30='0'
% l2 R1 E4 U; D4 y    temp_data=temp_data%10000;   //取余运算; V2 A* Y  z3 g" J4 r) ?0 ~
        qian=temp_data/1000+0x30 ;
2 J: A* R- o2 v, Q& w& ^    temp_data=temp_data%1000;    //取余运算
/ L# z  l$ }( X9 w( [    bai=temp_data/100+0x30   ;* d0 c( ?. r9 Y/ @
    temp_data=temp_data%100;     //取余运算% C* E# ~, g- N2 y3 `) q7 `
    shi=temp_data/10+0x30    ;+ L3 \8 J' s2 F# `& s8 [% e
    temp_data=temp_data%10;      //取余运算
$ Z7 B! w6 U- N# _    ge=temp_data+0x30;        
, u: g  ~7 R/ h: u" |  Z! u7 Q}
6 k( V: Y* ]; @1 R9 L, s9 v: {! `2 E+ k- S/ F+ T" U
//显示x轴倾斜角,即x轴与垂线所成角度
6 _7 ^' q$ p8 Mvoid display_jd_x()( ~  L8 ]1 A: `  L& T
{   
7 R( z' J. H* |, s8 }0 H8 ]/ {    bit bj=0;//标记$ g: o/ I' T9 M* Y
    int  dis_data_x,dis_data_z;  //x,y轴加速度的原始数据,用补码形式表示% G7 _0 I& y$ ?. {7 x
    float mg_x,mg_z;           //角度,加速度
8 H$ c" O! ~" a& v% r+ \/ [8 J    dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据   1 E: C0 Y5 X- i" G
        dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据. L( Y- P& h, _: j
  x/ F' h+ o% v$ _  [# A
        if((dis_data_x<=0)&&(dis_data_z>0))          //第二象限
3 r, `- x- l. }- }! s1 {        {
# a. M& o4 p: f5 F0 f            dis_data_x=-dis_data_x;
1 e* @2 s, V* L( Z7 B3 d                DisplayOneChar(8,0,' ');4 J, y; {- j! t7 X+ U
        bj=1;) r; {$ F; A- j$ X0 O8 Y
        }  p. U4 O7 H0 e: K6 e# i9 {- ]* N, q
        else if((dis_data_z<0)&&(dis_data_x>=0))         //第四象限
$ H$ V" q- {. l2 S0 [( e3 \        {; ~. M0 C$ k  ^& f. K
            dis_data_z=-dis_data_z;# k% D8 H: ]3 t! e8 q
        DisplayOneChar(8,0,'-');  //显示正负符号位* }: e3 w4 W+ _' Q6 V: J0 V4 z! E
        }( `, d( @& V8 |' _: `/ X
        else if((dis_data_z<=0)&&(dis_data_x<0))           //第三象限
1 U8 b& _) Q$ S3 b! v1 f9 p        {
5 I, Z; q" M: w/ d8 y8 X( o            bj=1;/ a; t8 `% W! @/ v8 A+ W
            dis_data_z=-dis_data_z;
* E) E9 b: T  h% F2 K- X                dis_data_x=-dis_data_x;3 k% b6 \  U$ ^: b* t. W
        DisplayOneChar(8,0,'-');  //显示正负符号位
2 S: m  o1 f. f* L4 ^        }
, }0 G3 N7 U3 d( {- w1 I        else if((dis_data_z>=0)&&(dis_data_x>0))
; n8 Q% D& |& \: c+ @: R) [         DisplayOneChar(8,0,' ');                //第一象限1 |: G+ P$ _% V' H

6 {& `5 i' K( ?9 J* R6 W1 Y0 ?    mg_x=(float)dis_data_x*3.9;  //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
0 x: \3 O$ n- i$ S' ]& U& I; ]        mg_z=(float)dis_data_z*3.9;         //强制类型转换,dis_data_z的类型和值不会发生改变8 a& X5 u( p5 |& J2 w$ s
$ l* U) K- N/ z2 u' E
        jd=atan2(mg_z,mg_x)*(180/3.14159);- n. l: P& b9 [' G; v
        if(bj==1)jd=180-jd;        
! J/ Y4 T2 m* u2 ?          //jd=jd*10;  消除小数点,便于转换数据和显示
  C/ e& P; y6 P8 Q" v* e  k/ z    conversion(jd*10);      //转换出显示需要的数据                                        //
. g, T. z  n9 N1 r. h        DisplayOneChar(6,0,'X');
5 ~) `5 ]  y! s        DisplayOneChar(7,0,':');   
0 f& M1 N1 |$ [- Y  }! `        DisplayOneChar(9,0,qian);
8 u/ j) K0 u  p    DisplayOneChar(10,0,bai);         0 Y+ \) X) }  P, N- G
    DisplayOneChar(11,0,shi); ; `+ d2 n: @' N* A5 L
    DisplayOneChar(12,0,'.');% N! S" l8 o  U6 f& Y
        DisplayOneChar(13,0,ge);9 r, K% \! w" x) E
        DisplayOneChar(14,0,0xdf);            //显示 °# r; f7 v# X2 q5 F- q; s
        DisplayOneChar(15,0,' ');8 L4 |7 ~" q  Q  T) T! ^
}4 n' v; r1 ?. ]8 d5 b, q
' N0 S& s: o  w
void PCAinit()        //PCA模块初始化
' g4 b; O( C! \{% ?$ v; ?8 f, F
     CCON=0;
( R5 i  X% j; D* C! f: ?         CL=0;
( O* d1 N0 T9 c( C; h- a! A         CH=0;
# ]* x: o" l+ ]6 ~( D4 o3 s; ~         CMOD=0x00;        //sysclk/12& ]6 }8 }2 r+ B+ i* A
         CCAPM0=0x42;//8位PWM,无中断
' [+ o- v! s* c- @' b4 T) d         CR=1;
1 L$ d+ W  f3 p9 G: n         CCAP0H=CCAP0L=256-240;
) M. e- c" D1 N+ @7 ^0 P& B}9 H4 P$ P5 Y6 P8 B+ m. m
void init_t0()         //定时器0初始化
& {0 h! ~6 z/ p$ T+ R% x3 B{
) F3 p3 A' q7 ^: s9 S1 F2 m    TUXR&=0x7f;         //12T2 v0 }% o: X+ g1 f2 B1 r
        TMOD=0x01;  L2 c  u( T* ^9 ^9 [
        TH0=(65536-50000)/256;4 d, {/ X+ w4 P8 H
        TL0=(65536-50000)%256;
3 C" ?# I' Q$ K5 D/ p        TR0=1;
9 O, A& v7 v8 O( j1 }        EA=1;- ?$ E, e' _+ Z) P
        ET0=1;
3 C' N4 @' [- m- u}
- R8 T5 F1 a# ^+ w# X5 K/ a
3 B; o. B& V$ q& U9 |; t//*********************************************************+ Y: |' k' w8 B( s' n% O
//******主程序********
. C$ \* x1 u& U! O. K//*********************************************************
4 o3 Q# c$ [: ~: vvoid main()% {% a- S3 G5 J/ h7 |
{         
- O3 o# ^8 j5 A! E" x4 a  f" d        char H;        1 G9 X% K0 ]- _" ]# J
        InitLcd();               //液晶初始化ADXL3450 q0 E0 L! w+ j
        Delay5ms();
: v' P2 _  K5 S9 {1 r) H        Init_ADXL345();                 //初始化ADXL345
' d' C8 j) N4 n' W( z% |        PCAinit();
$ H& Y/ U/ s9 Y' c1 s9 s" c) D        init_t0();
9 _% \# m+ W+ p6 L) X        H=CCAP0H;6 e3 T$ X- W# p/ ^( ?

  S1 Y4 D# O7 n& ^+ {        while(1)2 P0 u4 Q+ K$ m+ G" f
        {                                                                        
& M  j, M+ ~6 @0 q' z6 P. S6 w                if(p33==0)
' b  k6 u5 T5 b- c7 x                {         
: W) E( n7 D  ~+ H  x- d/ Z3 A3 C                     Delay5ms();+ I0 s. ?0 }+ z: y1 I$ g
                     if(p33==0)5 l: L; _+ w! S* c
                     {/ R. {: z2 ~/ ^6 H  |3 C
                          H=H+5;
# h1 y* S6 T3 \- J                              if(H>255)H=255;# _$ B# K: K/ L
                              CCAP0H=H;' j1 ^+ T. n, n7 x$ D& W& L5 ?+ x
                              CCAP0L=H;
* Z4 i; F6 _0 V1 ]* }                              while(p33==0);
' H! x0 P+ U$ I( m( o9 @                      }$ R) v- P. ?9 p$ t$ T9 N
            }
& f% y3 u5 x4 M) c. a' {                if(p31==0)4 H/ f' D5 d# `
                {         
0 `, s+ [, o5 R: R                     Delay5ms();+ x/ Q4 P  L8 ^- I. x
                     if(p31==0)2 b% M' w" M- U, v* A
                         {) I, |* S4 t5 h) U5 l1 W& c
                            H=H-5;
! k" s1 h6 F/ M                                if(H<0)H=0;
9 Z5 B9 _" P9 X3 _……………………
* W; }5 `. ~0 M- C) o: D& K
+ \) C* [& Y7 v4 ]: g…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………
+ `: t+ h9 _& f; y3 `% n" u- A& s
0 c& w2 t% `# P# V6 U  e% q- U5 u
游客,如果您要查看本帖隐藏内容请回复
" \' M9 ^) {, Y9 y# t. Q
" Y; G5 }* |# f$ }  N3 _

& R: G) Z# M. f& l* R9 R

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 07:01 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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