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

ADXL345测倾斜角(程序)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ADXL345测倾斜角(程序)

3 k! t  L" X% K8 G  a/ ?# W2 _1 F4 y( p# X7 Y/ |5 o
单片机源程序如下:

. ?6 L5 f* T% I( b4 f9 L* y# D  d1 j) Q/ p
#include  <REG51.H>        5 J3 D# A$ c. \# N' ?3 I- a
#include  <math.h>    //Keil library  
9 z" r7 Y9 {" S: s$ ^#include  <stdio.h>   //Keil library        
6 O4 @! J! x. ]6 P#include  <INTRINS.H>: p  M" u7 B' X1 N0 e0 K: H

! h$ j9 h8 B' ~- d" n! ~#define   uchar unsigned char: F5 i8 l  c: t% R" i% j3 n; q- K. ~
#define   uint unsigned int        
* m. m' I5 @& U#define   DataPort P0    //LCD1602数据端口
$ S  U( T+ q: n, ~3 S* O* i! t6 l
sfr TUXR=0x8E;
+ F: g, _& q( [. L2 W& I8 e  D3 K  F6 Xsfr CMOD=0xD9;
0 ^, k0 l# @( w( D1 gsfr CCON=0xD8;
3 ~) s* Z, w) G: asfr CL=0xE9;
& S# B& B9 U8 Y4 h* gsfr CH=0xF9;7 q3 h! F& @4 J$ ^1 k* R0 J
sfr CCAPM0=0xDA;
7 M9 }& B( n4 W/ S: [! lsfr CCAPM1=0xDB;
" m0 Q+ G+ s! Asfr CCAP0L=0xEA;
; v6 s3 y% U3 g5 K+ `sfr CCAP0H=0xFA;
3 [) }& H7 k2 d4 C) \( J5 Gsfr CCAP1L=0xEB;
9 s7 d" M2 Z# h" T) s4 msfr CCAP1H=0xFB;
# i& @) A5 n* v1 T& r. Wsbit CR=CCON^6;8 I7 s8 a% ~& w) Y( ?
9 q" L5 `' ^' ^
  K9 M- J: j, e" }& K2 V4 e
sbit          SCL=P2^0;      //IIC时钟引脚定义% A3 Y% F* T, F  b' ^& D
sbit           SDA=P2^1;      //IIC数据引脚定义6 F' T) I0 `8 L
sbit  p22=P2^2;; g+ s  t( H( J; i9 Y' E  D" y# w+ K% U
sbit  p31=P3^1;
0 r5 b) z5 j6 ^sbit  p33=P3^3;
3 p2 [- ]3 Z/ l  Z# @/ @sbit      LCM_RS=P2^6;   //LCD1602命令端口               
8 k# P. p4 a- ~! V7 Msbit      LCM_RW=P2^5;   //LCD1602命令端口                1 I: \+ ]$ k3 ~  S% ^8 l2 x
sbit      LCM_EN=P2^7;   //LCD1602命令端口
* b- e6 {7 o% J) \
4 Y; ~5 V$ @+ k6 q( r#define        SlaveAddress   0xA6        //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
* ]0 L& \& W& G+ G                            //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
# {- a% H3 `( j* ztypedef unsigned char  BYTE;- ]0 V* j4 `, G
typedef unsigned short WORD;8 m! p6 I/ @4 {7 u' t

% e. u- @, }  L/ ]: A6 VBYTE BUF[8];                         //接收数据缓存区              
9 s# n+ }6 q4 h. j+ y: n+ @uchar ge,shi,bai,qian,wan;           //显示变量  个十百千万9 x9 _1 W2 k2 d$ J2 K! C% W/ I( s
int  dis_data;                       //变量9 J3 ]- r# J' q, @
float jd;
  Y# [5 o, |+ e0 cuint PWMH;9 B3 e8 t, t& y7 l( q
void InitLcd();                      //初始化lcd1602
/ H) Y5 t" h- V/ ^9 P0 ^void Init_ADXL345(void);             //初始化ADXL345
4 N* e/ B# ~7 C/ t+ w1 n
$ {" ^" J7 y1 H8 R- k7 k* K! }void WriteDataLCM(uchar dataW);                // LCD1602相关函数
) G+ F% [+ T, J* Kvoid WriteCommandLCM(uchar CMD,uchar Attribc); //
: g9 h/ W4 c. w# v( c+ \1 f- t  {( yvoid DisplayOneChar(uchar X,uchar Y,uchar DData); //9 F9 E8 g6 D. N% @% e3 a% |  e
void conversion(uint temp_data);        //数据处理
; y" _' ~; Q3 I
9 {6 \2 Z0 _* K9 S. Z0 _3 Xvoid  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
5 f* s* t! |6 U$ fuchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
0 Q6 B( f. p/ d0 c4 Vvoid  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据
9 W% q' O: U/ M9 C" n//------------------------------------- M3 D+ ~1 e/ U$ U( x' G
void Delay5us();
4 A% T0 K9 ?1 Q' s6 ?( Jvoid Delay5ms();
( r" R% u- b- `& Y5 kvoid ADXL345_Start();       //与iic有关函数2 ^, P! v$ p( I9 M
void ADXL345_Stop();. X- G% t- |9 K: g3 r8 v
void ADXL345_SendACK(bit ack); //传送应答% t% [) v1 {( w6 r- ^
bit  ADXL345_RecvACK();                   //接收应答
; M+ f4 C  Q% I; U( x* kvoid ADXL345_SendByte(BYTE dat);( I" {) g9 v  U9 R  n5 Z" V! n
BYTE ADXL345_RecvByte();
9 d; N, B' A8 F8 K/ M# A7 Lvoid ADXL345_ReadPage();, u4 E1 k/ a6 x. ~2 s
void ADXL345_WritePage();9 g4 @  i( `9 }. x4 @" ]

( Q9 m1 c2 V5 Y, ~# F/*******************************/
/ x/ J4 _. F  {  a. \% F0 h3 K0 xvoid WaitForEnable(void)          7 R2 ?  D) d9 l5 v3 p! {
{                                        / s9 d! b. m: k% r' O% K2 X! h: b
        DataPort=0xff;                0 v/ O5 ?1 D: q/ s+ c9 h$ J( f
        LCM_RS=0;
) q$ @: |0 I. F+ o/ ]        LCM_RW=1;
: ]  Q0 g0 R) c        _nop_(); _nop_();& m; z$ Y$ v3 q* L2 K8 F  V6 `
        LCM_EN=1;
  H1 T2 t7 X- g9 H! q' Y        _nop_();_nop_(); _nop_();_nop_();
2 v$ Y9 i: R) O        while(DataPort&0x80);        ; D* N. d  D0 o/ V  v$ {
        LCM_EN=0;                                
9 U) A) J3 |" Z$ t4 Z, g}                                        - s: U% m' U6 I2 m$ \1 T, O
/*******************************/9 w- g' A* a  B# o
void WriteCommandLCM(uchar CMD,uchar Attribc)1 v- a: e  K0 b" k& a$ o* B, W1 X
{                                       
* A% x7 Z9 d9 C4 p+ ^* B/ a        if(Attribc)- G7 F: e! M( J# C( K8 o- y
        WaitForEnable();        
8 v* b9 F! \7 U- M4 h6 g        LCM_RS=0;
6 E8 u& o4 S8 d- `2 M        LCM_RW=0;
& X6 C  @0 P: v7 ?0 t  b% R  [        _nop_();_nop_();
# H' M. D0 C  N! Y& o% E9 @% f* G        DataPort=CMD;
: t; C7 Q: k0 A8 j- J. W, b        _nop_();_nop_();        
0 ]9 ]1 t" ?& c6 |6 s2 p, ]        LCM_EN=1;
1 o6 N& o6 ~8 F4 o8 W        nop_();_nop_();nop_();_nop_();
( ?% g! M8 H8 X3 O3 l: C9 `        LCM_EN=0;
  T6 N% O7 w* E/ N}                                        5 Z0 l( ?: i7 [' w5 U0 z5 }3 P1 {
/*******************************/
1 y& i" @# C: y5 h* R2 Bvoid WriteDataLCM(uchar dataW)3 W4 B# G1 Y% K7 z8 D, I
{                                       
7 O- q- a. \( J! O        WaitForEnable();               
  G" C. ?: n5 t& d; {        LCM_RS=1;LCM_RW=0;: R( Q* a$ O; g4 ?$ b5 Q
        _nop_();_nop_();
# X; U8 C3 k" I# u" r        DataPort=dataW;_nop_();        $ x: Q- n/ z4 M& _
        LCM_EN=1;  H5 X! T! Z+ Y& f
        _nop_();_nop_();_nop_();_nop_();
5 u" c& E6 ^8 M" L, X! Y- X& f* ~7 k         LCM_EN=0;
8 q# `1 M! @) ~! _' _; V5 q4 _}                + p# d! w  ^* n' ~
/***********************************/% I3 f, _$ I/ O4 I' `7 \1 X% t3 T% i
void InitLcd()                                ) Q) g! {3 d7 k; H4 y
{                        
' N0 P2 Z' n. u7 b+ m        WriteCommandLCM(0x38,1);        
( ~7 C) T% w' Z# Y, p        WriteCommandLCM(0x08,1);        
* Q- V5 ]5 S( _        WriteCommandLCM(0x01,1);        
2 g! v" L2 N! j" a        WriteCommandLCM(0x06,1);
! `' r9 q, j6 n, D8 V: g        WriteCommandLCM(0x0c,1);' G; G9 d7 v9 C; T' {; \
}                        
: J+ i0 k6 _: M  R2 a% t( s# Z/***********************************/& H& J3 [# D5 {5 E
void DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
! b; j0 j$ n) c3 F) a' O" a, n1 q{                                                9 ]) q6 w9 e  F
        Y&=0x01;                                                + b" E# h, A; R* i
        X&=0x0f;                                                $ K3 x" B! p8 f: L8 B
        if(Y)
, c/ }, G% v' r: n        X|=0x40;   //8+4=c% I7 G, d" {( K" s
7 a2 O3 ]; r, _/ P4 W$ \4 k! D: l
        X|=0x80;                        
- ~3 K3 f3 }- y5 h& Q        WriteCommandLCM(X,1);                + l9 s( `1 Z/ d, I' ^" O8 @
        WriteDataLCM(DData);               
: k$ Z& K9 w' G& x# m}                                                
7 L. @. X1 o( [9 }$ {
0 r* D7 z6 o/ G8 s7 {1 J" p
7 |" }, l+ e8 k; c$ @6 }void Delay5us()                //@12.000MHz
5 i5 g1 \# |1 h& }" F{: L. I  r+ d9 g7 C0 {0 n
        unsigned char i;
" W8 ]$ ?' |' o& V
( D( E  y0 q2 d) v) D        i = 12;
) [: n  c4 q! }9 ], o9 y" s% I        while (--i);
, Q- _/ {, [( P7 I$ P}. ^2 c7 u! U; h: C2 u

' I, _  x7 y4 F# r9 y% p! |
& k8 Z1 {+ c+ G, W) |/ Zvoid Delay5ms()                //@12.000MHz
' y4 E. H, m/ \{( d6 ]# H: b5 \# @3 \
        unsigned char i, j;
  ~, X) i1 o: J7 N. L, |
6 D7 [& T$ R' @( Q+ K% m# W( B        _nop_();
4 t: o/ u7 O" P: ?        _nop_();0 r1 C6 |& B0 o2 H: ^' S
        i = 59;( G* J' Z; t- E* ]% O/ ~
        j = 89;! }1 s8 Q( K+ J1 _( V1 a
        do
9 [( \, n( |0 f4 g3 ]- N        {
( ^3 u- b& m' v6 b                while (--j);
5 n( N, S) y3 v# H( K% h' Z        } while (--i);
) Q, ~1 n3 \2 ^3 q}
$ I: w" T% U+ D
# v3 Q- U. L% }/ X: i- |/ B: X
# Z1 x2 O9 r1 c- h/**************************************
) q0 x7 R8 C( e  U4 O起始信号
  J0 _. L4 {' V7 }! t" B; I& @**************************************/$ p1 u. `3 i9 `4 Y$ ~( b' Y
void ADXL345_Start(), R0 M. j$ z& Y3 g8 |. J4 j' e' S- Y
{: ]* }1 b- \! p! h* z$ Q
    SDA = 1;                    //拉高数据线& g8 F+ {1 z  U  E* r+ w: Q
    SCL = 1;                    //拉高时钟线4 y3 Q  j# m: e) Z' I+ ?/ k' R/ j4 R* W5 ]
    Delay5us();                 //延时
# g1 O, N- A- z' U$ [    SDA = 0;                    //产生下降沿( ]. C  Q4 K  F6 S' y# A
    Delay5us();                 //延时" {8 w) j0 G% e2 d* k9 G9 q2 U
    SCL = 0;                    //拉低时钟线+ O% I  N* k7 V2 h. F
}: M: v3 e5 Q5 L; S

9 y+ p& ], K3 S: |/**************************************
  |. y1 }; G5 Z4 c( \停止信号6 `/ F- S1 q1 ^5 A3 Q0 U% j" @  d
**************************************/
0 C& V, i) A+ `9 Gvoid ADXL345_Stop()3 K! ]* \' J7 c; J) O1 e7 O9 n
{+ g3 s0 p6 i5 Y9 W7 L
    SDA = 0;                    //拉低数据线
, ^; s4 s- Z  d1 R' f$ d/ ]    SCL = 1;                    //拉高时钟线
3 g* }. ~. c1 s1 G: ^# h% b" L) [, Q    Delay5us();                 //延时
3 j4 W7 ?. }$ i  T! Q& ?% L    SDA = 1;                    //产生上升沿; z$ g, h% I$ N$ F2 L4 V1 `( w
    Delay5us();                 //延时
7 e- o8 Q% h0 a# Z, N" u" G}& u% M* n8 D# Z8 ~
& X. `" a) b. Q2 ?+ K5 u0 d" h: R9 ^
/**************************************
, W0 J6 A4 g6 ~) E; h发送应答信号
# L# f5 ^% p8 S0 u入口参数:ack (0:ACK 1:NAK)
9 }6 V6 Z( ~5 @; I**************************************/
0 O7 K9 y8 x" a1 Svoid ADXL345_SendACK(bit ack)- E# _( n3 J: p5 s, c! `  U& i6 C3 y
{" i0 k7 N7 v# j0 ?3 A# Q
    SDA = ack;                  //写应答信号
0 x8 }5 ?9 ]1 W+ I    SCL = 1;                    //拉高时钟线
4 c# F3 i+ z' _# S8 N: {    Delay5us();                 //延时
! Y2 [0 _; h' d; p    SCL = 0;                    //拉低时钟线
' k' H6 C9 E! a0 e. ?    Delay5us();                 //延时& _; C  C. {5 X6 o" Z" |7 R
}
% u+ a% `7 @( X$ _: ]/ B
/ V2 ?5 F1 ]/ y/**************************************; i/ Q/ z& q. ^: I
接收应答信号: i( x: t) X& U" Z' J+ Y3 `+ k- F
**************************************/+ n* F/ k& E& Y! S! s# ?
bit ADXL345_RecvACK()
% w) r1 Y1 R5 ~; o$ [{
+ H0 `, @; W* d* }    SCL = 1;                    //拉高时钟线
' @; s9 V3 P3 ]8 l8 f0 O    Delay5us();                 //延时
" {6 `( |4 B& |0 V3 p    CY = SDA;                   //读应答信号# }0 \" f+ N! v1 Q) I6 {
    SCL = 0;                    //拉低时钟线* l, }7 ~: V& B- ~8 x* w% F
    Delay5us();                 //延时
, x) V- }) a( F4 {
& f  K0 \! _+ L( C. j, u2 [; p  y    return CY;
; `3 H4 ]$ I3 i& R: p}. a  M+ J( _8 {5 X" c( x3 d

6 m6 D! n: Y2 D/**************************************/ G# {; k$ a7 W0 g, o  H
向IIC总线发送一个字节数据, y: _, K% B6 z2 p
**************************************/
! d! _) Y& M- r; P: S6 jvoid ADXL345_SendByte(BYTE dat)
; |% Q; _: p/ D% K( a0 T! F0 F{  z: U4 A+ s/ N8 ~0 C$ n6 X
    BYTE i;
5 y8 _, K, m, l2 R6 E, }7 O" [3 p" I8 w% K
    for (i=0; i<8; i++)         //8位计数器4 _( a! ~6 P; e# U' V, H8 d
    {4 e8 ?& y/ \) G- T
        dat <<= 1;              //移出数据的最高位
1 }8 w+ D6 u0 X  I& ]; J        SDA = CY;               //送数据口
3 L: }9 X9 X* ?2 j        SCL = 1;                //拉高时钟线
7 ?% d" [* _; K/ _* R        Delay5us();             //延时9 Q. k# _7 h1 V% k$ r0 P
        SCL = 0;                //拉低时钟线
/ s/ h0 J" Q# z        Delay5us();             //延时5 K+ w$ r. G5 c3 B9 l3 N
    }0 V- D+ b4 H/ v% m0 V6 H
    ADXL345_RecvACK();, T4 o/ u/ e6 n: d
}1 ~+ u. [0 \$ @/ S* G6 r

: Q' q- [  ^5 q' b/**************************************" s/ {4 W% K3 r9 a; ?" H9 |
从IIC总线接收一个字节数据
' {; y. j$ a: u**************************************/
6 R1 C- L6 J9 F* J; b1 L9 |- ?BYTE ADXL345_RecvByte()
* r5 {' b9 U6 E7 e/ `* N- a; a( j{) ^0 g/ l9 a7 l! c( i
    BYTE i;# |9 N1 [5 l* S+ g! t4 `; t0 H
    BYTE dat = 0;
7 s& S# P7 Z; Q    SDA = 1;                    //使能内部上拉,准备读取数据,
% i% W8 L+ ~7 Y  S5 v8 }7 l    for (i=0; i<8; i++)         //8位计数器
8 P6 f; x( }8 g2 p6 b" C    {
5 [3 y* o! H1 C+ s8 X        dat <<= 1;! q5 J5 _- P: C- e
        SCL = 1;                //拉高时钟线
; ]& v9 [" k/ H  b- l6 g3 D' h2 ?        Delay5us();             //延时
5 ^( g8 C: y. W; h, V        dat |= SDA;             //读数据               # s8 V( e; `6 @0 O0 ?
        SCL = 0;                //拉低时钟线
8 S' F9 |! E, z( C+ f3 H# [- v        Delay5us();             //延时
/ f4 @; K1 S4 k, L5 F. T    }
& F* _. z  s' c) H3 y  j    return dat;
- e$ T6 [" t) t1 ?+ G) G, k}
) u, b1 e4 i. T- ^% x! Y% f. I+ Q% N% w* R! x! o6 Y
//******单字节写入******************************************** v0 A5 p: L- q; l8 A4 x, r/ O
//用于ADXL345初始化
5 z' ?. t& C1 I. t$ w5 n$ ]void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
% R  h' i4 D! d3 T# W{$ \. M, C5 I9 @8 W: M  c
    ADXL345_Start();                  //起始信号
& Y: [$ q" w& v4 T: j    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号8 j# [+ V6 N+ z$ g9 G. b3 b
    ADXL345_SendByte(REG_Address);  //内部寄存器地址,请参考中文pdf22页 ) r) ?3 f) }+ p' n0 y4 h7 ~
    ADXL345_SendByte(REG_data);    //内部寄存器数据,请参考中文pdf22页
1 k; w% o- u3 C) D                                       //相当于 向相应的地址写入命令字
( V  m& d- K% L& T    ADXL345_Stop();                 //发送停止信号% O* p. p7 v2 G" N+ ?. w
}
& T4 x; p3 [* Z& f2 f. ~8 G0 r- |3 p1 }2 [; `& _
//********单字节读取*****************************************  O4 Z% y; H' b# f  q5 t* W8 J
uchar Single_Read_ADXL345(uchar REG_Address)/ d: ~: Z% S, J% f
{   
$ X0 d9 E9 d' k- ^    uchar REG_data;1 r# Y, J6 L9 }" e2 ~2 Z6 N1 e
    ADXL345_Start();                          //起始信号
7 z! ]  Q: G5 z7 d( A    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号,//0xA6写入; D- p/ W/ V1 f8 t9 `% r
    ADXL345_SendByte(REG_Address);            //发送存储单元地址,从0开始          m: o+ r9 s1 Q9 A
    ADXL345_Start();                          //起始信号2 j+ T# k. l( M% A. ^% F
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号,//0xA7读取" d7 ?& d7 {" q- ~  }
    REG_data=ADXL345_RecvByte();              //读出寄存器数据
6 K0 X; D6 n; Q8 i2 F! ]- C2 Q- l        ADXL345_SendACK(1);   1 a7 x  K  C6 \+ ~- e( l
        ADXL345_Stop();                           //停止信号3 d3 \8 V, X: ^6 n- E/ G. }
    return REG_data;
0 [0 d- T: ]$ Y7 _+ z}- d4 W) x" V/ [- k' O( ?2 |
//*********************************************************; S. I6 Y7 M  D/ A, k4 Z
//
: @' F) t! G. `//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
. T( O8 V% [5 m( J6 M" E# c//4 s/ G# r8 f7 H- O0 }. Y
//*********************************************************
( Q8 B7 ]& p: w1 Y% ^/ Gvoid Multiple_read_ADXL345(void)
8 {7 ]: m1 n0 F, V# Q, `' z{   
# ?: z9 W. @/ p( y3 L4 p7 h3 f& l( b    uchar i;
7 k8 r7 b  a3 P: D1 `- B    ADXL345_Start();                          //起始信号, ]% o; |, U6 y) {6 k9 H
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号, g& i8 \7 d3 I: S7 i3 ^8 |( \
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始        3 o: Z- y" E" E# U
    ADXL345_Start();                          //起始信号2 ^7 s: [: H# J, @6 J9 J
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号9 C. `" G9 H7 ^2 h
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
! ]: h6 U( a5 P7 u; C' {% }  \    {2 |( b2 a% s& d6 y5 ^' q
        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据4 ], s, `+ U; K" {' q' S
        if (i == 5)* ]1 L6 e" J+ u* v; k
        {
1 B; r6 J& K3 M; u: C           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
: Y" z& P; t' O9 }        }- L0 [5 w' l: `$ w! H/ j* F
        else
/ G, H( |% ]. V/ i        {# \$ @, B6 `/ i/ k( W
          ADXL345_SendACK(0);                //回应ACK6 `, z# f+ F  _% p2 O* t: J
       }
, v8 Q+ ?. e$ h   }
, f3 N8 R: U1 E) u/ d" w    ADXL345_Stop();                          //停止信号
& V# H! s* Z1 Q1 {  t7 H9 P    Delay5ms();* j' Y0 D2 V9 g! n- B/ f! Z. B8 Y' [
}# H' n+ V/ n. g9 r  w. _$ v

+ ?1 ^2 G+ N0 X( Y) [* k; C& F//*****************************************************************
. y. i% w+ o9 G5 y) }; Y$ ]) A" m8 k# Q- m" B3 P
//初始化ADXL345,根据需要请参考pdf进行修改************************9 i8 i/ _6 S; ~. i
void Init_ADXL345()
/ J* x; I" v8 G{2 D2 l" t# t3 P/ W7 a
   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式+ x! T2 A' S$ h: ?; m8 N) _
   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页
) g( a5 a; u) u   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
& F( q) c2 _! |5 |7 @   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
$ b  U* \. g. m1 Q& [7 z! i   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量
4 A& w! s" l$ d$ k   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入,pdf29页" S4 N& j) G/ ^3 j) E  W$ H
   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入,pdf29页
9 Z  v; M& r. p2 C8 m0 U}
4 a, n$ U1 ~! a0 F. B; D8 U, s
9 h& ]- q4 z/ b* \  I0 [ //*********************************************************
/ L( M3 j1 {& V) p) P9 Rvoid conversion(uint temp_data)  
+ w2 u+ ]# A4 n{  - \; {; s: t) l0 A
    wan=temp_data/10000+0x30 ;              //0x30='0'
+ l0 u" T" Z1 I; A" f4 G' _: |    temp_data=temp_data%10000;   //取余运算6 x$ K" v4 k+ A, f
        qian=temp_data/1000+0x30 ;1 f2 V% q% f( @0 ~; J
    temp_data=temp_data%1000;    //取余运算- Z! D' w: l* f# R
    bai=temp_data/100+0x30   ;2 y5 Q, T' w- V! X
    temp_data=temp_data%100;     //取余运算
+ _7 q% F% m  Q& _    shi=temp_data/10+0x30    ;
2 O0 W3 o+ K) y9 A! L( _+ n    temp_data=temp_data%10;      //取余运算, h7 v  z7 r- z# c8 v
    ge=temp_data+0x30;        
& w& ~* h2 P+ c; N2 o- u. ~2 s5 w: j}
0 z$ S& U! |* p# o: V& I
9 Z: v0 H+ j. Y: U) |5 ` //显示x轴倾斜角,即x轴与垂线所成角度% m& V1 e  }6 d$ H. T; H5 A
void display_jd_x()( ^0 Y+ d+ {+ ]' ~7 l$ t
{   
/ K# r. O- N  u# Y) I& _    bit bj=0;//标记! N$ R0 ^7 B; u
    int  dis_data_x,dis_data_z;  //x,y轴加速度的原始数据,用补码形式表示3 s: p& U: m' ?, i( ]! E
    float mg_x,mg_z;           //角度,加速度
7 G' o% W) ?, R: P& Q& q. T    dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据   
4 h9 r0 `; G3 S% A! P! W1 y        dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据/ n6 j$ E( k; i( T) l
  V( I  V, C4 F  Q& Z/ Y5 J5 n
        if((dis_data_x<=0)&&(dis_data_z>0))          //第二象限1 K8 |; l9 ^1 O: R8 h5 \
        {9 o* ^6 L; X1 u3 V1 Q+ ]
            dis_data_x=-dis_data_x;
1 i1 G# m: l! f+ D' g, M1 Z: P; |                DisplayOneChar(8,0,' ');
# `$ h6 n/ D( a8 P' L# F        bj=1;. V/ W6 \* M, j- m' a0 J  a$ w: f
        }, _+ ~: R% j( d
        else if((dis_data_z<0)&&(dis_data_x>=0))         //第四象限
7 ~! L. M  ^* y1 r5 O        {
  w2 R" L* u1 p, ^/ u! C            dis_data_z=-dis_data_z;* b# n- g2 b2 [1 S9 ]: e& d
        DisplayOneChar(8,0,'-');  //显示正负符号位
' D8 b0 F5 L  r$ h; |" m        }
% s& L0 d/ ^2 O8 Q0 x9 q4 m: [        else if((dis_data_z<=0)&&(dis_data_x<0))           //第三象限% y: s: u% w. S( W6 M
        {
- f: [; h! N- Q$ c            bj=1;! H: `# p! u' o
            dis_data_z=-dis_data_z;: o( l2 ~) ]; V, N& H$ t# H5 @# |
                dis_data_x=-dis_data_x;- D6 O; Z% c9 x# Q
        DisplayOneChar(8,0,'-');  //显示正负符号位( p. Q7 _( _/ w  _# X( U' l, G# u
        }. W/ G- \2 L: T( Y
        else if((dis_data_z>=0)&&(dis_data_x>0))
$ i% L1 [6 O7 b         DisplayOneChar(8,0,' ');                //第一象限
2 I( ]  W  `8 |, @/ D
( P) h3 `! |: s3 X7 h8 i    mg_x=(float)dis_data_x*3.9;  //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
! {' u' N: w1 d% B3 m: C; P        mg_z=(float)dis_data_z*3.9;         //强制类型转换,dis_data_z的类型和值不会发生改变6 V! n2 [! @2 m% a8 N1 b. a

1 j# N4 K# t5 @. J        jd=atan2(mg_z,mg_x)*(180/3.14159);
5 ?, m$ E% \/ \( K* P& y! y! q        if(bj==1)jd=180-jd;        
- |1 J9 x" P9 G7 X          //jd=jd*10;  消除小数点,便于转换数据和显示
% h/ w0 ^4 `% U    conversion(jd*10);      //转换出显示需要的数据                                        //
' M) e: X7 i3 t0 r        DisplayOneChar(6,0,'X');
; _# _& |& m2 W8 T        DisplayOneChar(7,0,':');   
/ e9 e, ]% n9 G, ~" Y( V        DisplayOneChar(9,0,qian);
# \" z* y8 z# `" F- B1 ?# h" @, k    DisplayOneChar(10,0,bai);         3 h4 B. h! k" y" o8 d3 |
    DisplayOneChar(11,0,shi); # L- b8 i3 z4 B3 Z% h
    DisplayOneChar(12,0,'.');. D. s5 U* `+ t3 n
        DisplayOneChar(13,0,ge);# u; S$ A; j9 L* L2 l6 s
        DisplayOneChar(14,0,0xdf);            //显示 °
  K1 E, e/ y0 f! ?        DisplayOneChar(15,0,' ');: E( i6 [( {$ c& j" m
}) N# G/ Y; f8 W& L! R7 J( t: z
9 T+ a3 S# Y3 d5 @- e
void PCAinit()        //PCA模块初始化/ f3 ]0 f! Q9 x" l; P, ?
{" g5 q# b& A0 t: Q/ R
     CCON=0;
# o2 s$ A7 f2 k" e# A         CL=0;" z" H# {) n  _2 O; c
         CH=0;
9 t% {. z; z/ l" I) f( {! l  w         CMOD=0x00;        //sysclk/12
3 m; [# u* V$ _         CCAPM0=0x42;//8位PWM,无中断
0 l/ B, k! }9 G4 s% \2 J         CR=1;
6 e0 |' V: m1 D/ ~0 B         CCAP0H=CCAP0L=256-240;4 U# G) c0 i+ o; r: p" _
}! Q* W9 e6 q- N4 A
void init_t0()         //定时器0初始化
1 U/ h5 z  `6 f0 `8 S/ n{
9 n* n# ]% l% c/ t3 J6 o    TUXR&=0x7f;         //12T  o9 n, }1 Y7 E' X9 F5 E
        TMOD=0x01;
' d1 @$ N( X- q3 p8 C1 @3 ?        TH0=(65536-50000)/256;* S" z, V( y8 i% M4 @+ v6 f
        TL0=(65536-50000)%256;0 [% c+ [) ^3 e  [" ]9 D
        TR0=1;
5 A% U6 s) H- }: }& B; d, v" I        EA=1;
1 j" O9 U: c) p8 y        ET0=1;- P+ f4 T8 g8 d2 Q
}* y3 n0 d! v4 p/ T& R0 ]

- ?% r# D; A) W7 B( [# }. q4 u//*********************************************************" `; `% B8 E0 R4 t9 T8 A: N
//******主程序********
, c. h4 k& @5 v" G* e" n# @3 S. ]//*********************************************************
& Q& t0 v  d, w6 A+ ]' n9 `; \& Dvoid main()8 i" z) ~$ K: i$ \0 q+ i' Q
{         
9 e' f+ j9 G$ D- T# J6 P* ?& [3 n        char H;        
8 m! L5 a! O# X  N# x% H8 x; t: T        InitLcd();               //液晶初始化ADXL345
  C* q0 c) x3 m# x- D& S* ?" r        Delay5ms();' \; G  q1 a0 f7 f, n4 _5 x
        Init_ADXL345();                 //初始化ADXL345
# n! Y3 T) P" z9 j. f* X        PCAinit();1 ]8 M- _! F& X9 H8 T$ ?/ }
        init_t0();2 H% {9 Y8 x0 v: G
        H=CCAP0H;& K3 U; f8 ?; h: `6 C4 y# c7 W

( ?+ O% C8 f/ L) n        while(1)! ~# n( v4 w5 x" K8 V( m- P
        {                                                                         - k3 o0 m5 z, d6 E% W/ r- x
                if(p33==0)4 W( U% F7 Y- K( {! l; c+ p
                {         
/ f, I2 k9 X. g* I                     Delay5ms();
& q* W# {0 J7 m* g! o                     if(p33==0)- H5 J" M! c0 R# a! r0 |
                     {# q  y. G# ]& O4 ?" J# n
                          H=H+5;
7 k2 x4 O1 [2 e* ]2 o: h% L  P                              if(H>255)H=255;
" s, T% W9 K4 O+ m7 Y( }9 u( }                              CCAP0H=H;
; A4 x( G7 R" {* F                              CCAP0L=H;# U6 j& a; S+ z3 y6 E
                              while(p33==0);( w9 q, ~6 s% W6 |  C6 S9 R
                      }
% x" t, p& {2 a% b) n3 R+ V            }
4 M: Z+ Y( _  i                if(p31==0)6 a. `5 ?7 X- [7 T2 s
                {         
2 l+ U' W3 F$ D8 X                     Delay5ms();
  Y9 n) j0 P" @& Y. M                     if(p31==0)1 \* j6 I6 ]' C* w
                         {
! Y. _8 f- N& H7 [" O. S+ b* A                            H=H-5;
# N! ~  T% ?# r4 x/ x& M5 Q                                if(H<0)H=0;
# `. x8 N  A. v……………………- B" Z) C$ z+ ]

- B/ Y2 a% d* ]( S* j) D6 }( n! F…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………; o1 T' t4 y- t- s( T0 M( i- c

- z4 G% f1 U& T/ _4 C1 l5 \7 Y
游客,如果您要查看本帖隐藏内容请回复

: I9 _! k6 F2 R- x7 r
1 }( G% [" u' m5 o
- n4 i; ~2 V% f" F$ {+ Z- W

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-4 19:46 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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