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

ADXL345测倾斜角(程序)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ADXL345测倾斜角(程序)
$ G+ P5 Q% ^3 l% V& m

. l* u  R$ p! O% M) ]单片机源程序如下:
  ?- Y2 H  b% j" m! Q+ w. E& h

1 M% Z% U! s* d#include  <REG51.H>        
) `; R% T. L* X3 D( l#include  <math.h>    //Keil library  
0 s  }1 g; }, g4 a/ i+ Q, x#include  <stdio.h>   //Keil library        3 k; b5 Z9 b$ }5 J  t. B# K
#include  <INTRINS.H>
% ~& W' {$ S# [! p2 _6 t
  o  x7 [- R; V7 K+ `: ]/ @1 l#define   uchar unsigned char
$ N* k% j" w% ^#define   uint unsigned int        
5 f: n9 T$ r3 Q8 E. U#define   DataPort P0    //LCD1602数据端口
6 R7 [& u1 I6 ^  U( ~& h+ h. P+ c; v3 A* O4 J6 T# d( r
sfr TUXR=0x8E;/ g6 Y* c0 X  J5 C" n$ W0 s! O8 h* y
sfr CMOD=0xD9;
# K% n7 E! ], s; [; _: P$ Rsfr CCON=0xD8;% c5 k8 m6 }. g. O1 k$ Q
sfr CL=0xE9;: Z6 T. a- U( _/ ?  i
sfr CH=0xF9;
4 g- ^6 r: _8 q3 h1 D) k, Usfr CCAPM0=0xDA;
7 }; h* z! M7 K: p" jsfr CCAPM1=0xDB;
" P; t& q5 {, R0 w5 Usfr CCAP0L=0xEA;# C1 G: ]. S1 e8 p8 a
sfr CCAP0H=0xFA;
8 K7 R2 x( o/ a7 hsfr CCAP1L=0xEB;- y4 f  ?3 c1 [
sfr CCAP1H=0xFB;7 l; X+ A/ l- n$ R8 k
sbit CR=CCON^6;/ j) Y; f: A+ r# x* B% h

: b' y* h" E- F4 ?. v* [5 e2 W/ u9 T3 _
sbit          SCL=P2^0;      //IIC时钟引脚定义
5 K8 K7 s# B& W  S( Xsbit           SDA=P2^1;      //IIC数据引脚定义
4 R( H, g  O  \+ W6 q; m/ usbit  p22=P2^2;
$ k' q9 k; b1 K  U) [6 [+ ]sbit  p31=P3^1;4 o4 S6 Y9 \! C- O- v
sbit  p33=P3^3;$ ?; c  U# G' \# `9 {7 I9 I- _
sbit      LCM_RS=P2^6;   //LCD1602命令端口                ( g/ B( a% l- M- W7 k; }& {
sbit      LCM_RW=P2^5;   //LCD1602命令端口                % C. ?/ m4 _$ u1 Q# ^% I6 d$ ]
sbit      LCM_EN=P2^7;   //LCD1602命令端口
8 O/ y5 d3 q. X; J  r
$ T7 Q0 `" i" n6 s7 P+ ^: a#define        SlaveAddress   0xA6        //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
% O0 T  f* u3 Z$ w- R                            //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A! I8 t& \6 @# B' o; d
typedef unsigned char  BYTE;0 g6 O2 ~$ Q4 n" F* g
typedef unsigned short WORD;8 _2 {- v, V) V$ D; X
5 M( D0 o2 B  T. [( I
BYTE BUF[8];                         //接收数据缓存区              5 O- v1 x+ x, x, d
uchar ge,shi,bai,qian,wan;           //显示变量  个十百千万! J9 Z: U# z  [, k. z" c' F
int  dis_data;                       //变量% O8 [# p! g9 [1 _! t' p
float jd;5 L9 `5 i1 L! p4 b  T
uint PWMH;
. U  N3 j6 T8 {0 d# E5 A$ ~void InitLcd();                      //初始化lcd16026 A2 y% z, E8 p$ O4 {. k# c
void Init_ADXL345(void);             //初始化ADXL345
$ I2 X2 S9 E3 H: @& I- G8 W" x! w
) w7 @- E' `8 J) [! p2 vvoid WriteDataLCM(uchar dataW);                // LCD1602相关函数" d* P( o$ S* q: I2 }
void WriteCommandLCM(uchar CMD,uchar Attribc); /// v! y4 L% b, L5 k% l+ P
void DisplayOneChar(uchar X,uchar Y,uchar DData); //
4 z1 K, V/ n# Q2 Y$ [void conversion(uint temp_data);        //数据处理
# r7 Y3 j3 ^4 j8 @6 }: c" W) \! j. p5 h( w3 ~
void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
# D' z* u3 M0 S8 B- ?8 |uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据) _! \0 `) B# A7 U8 p+ P
void  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据) W* `/ b) x" F8 c7 j
//------------------------------------5 m- T, q2 N2 X* \+ e/ ~
void Delay5us();
+ B: J* B. u- p, d# [0 kvoid Delay5ms();6 d+ \' R/ s$ t4 S0 Y% T
void ADXL345_Start();       //与iic有关函数
" u# i: R) V% F: S4 `2 p/ Qvoid ADXL345_Stop();# v/ e/ ]/ w' K
void ADXL345_SendACK(bit ack); //传送应答
9 U) ^9 @6 ^& R8 M) @bit  ADXL345_RecvACK();                   //接收应答4 ?' w5 J' l' {0 i
void ADXL345_SendByte(BYTE dat);
" h5 D2 L/ k; Z7 w4 c; k6 E; R3 O) w# nBYTE ADXL345_RecvByte();
( b5 w* E6 W0 a" l! K/ Avoid ADXL345_ReadPage();
1 R0 x. ^3 A, y8 L/ X9 \  k. p: G( vvoid ADXL345_WritePage();4 t: r) p* {% T. U

( _- s# B: Y9 h  Z0 _8 Z- G, a/*******************************/) N+ [0 I( i: E  t; j
void WaitForEnable(void)          " C, U* ^3 @8 D2 L/ h
{                                       
/ r. h0 l2 W, w7 W$ q0 K: P        DataPort=0xff;                7 y* \* D; P2 Y9 ?* L! t
        LCM_RS=0;
% `! T; ^+ u+ Y( ^! z, ?        LCM_RW=1;
" x! J, t) m+ s1 c% _: Y6 l        _nop_(); _nop_();
5 K2 c4 D0 O# R' q( g        LCM_EN=1;
& t6 e# u; M7 k: q4 G7 M        _nop_();_nop_(); _nop_();_nop_();
. ^6 o4 ^, l) i0 K8 v) P  C3 z* |8 M        while(DataPort&0x80);        
; M$ g. H; e; U8 f+ P# C$ N8 @        LCM_EN=0;                                ; W$ t0 G  x& F& \# `" q  G# _
}                                        : F2 [3 c$ r9 j
/*******************************/
  G3 B9 m6 q. _* g, Y9 i0 Nvoid WriteCommandLCM(uchar CMD,uchar Attribc)+ v. I+ x7 M; j# S& I( C
{                                       
$ r: P5 I! [9 T1 Z4 X        if(Attribc)5 g' j1 L" Y, j' A4 x" o
        WaitForEnable();        
. j! t% L, R. x8 K8 G6 p        LCM_RS=0;; F  e+ h6 f/ h/ R8 f+ a* ~4 s9 O
        LCM_RW=0;
) u( ~0 r2 m) N+ U6 z/ u        _nop_();_nop_();
8 e' k3 K6 o, o! r5 X0 Q        DataPort=CMD;
7 X' V* i& k  q        _nop_();_nop_();        
- I3 e0 n. _9 C4 L        LCM_EN=1;0 a/ Q! n2 N0 Z+ A' k$ q
        nop_();_nop_();nop_();_nop_();& Z& Q* p1 M: k5 I
        LCM_EN=0;; x0 _: R' Q0 S9 m
}                                       
. ?# {4 B/ z! c! T# [  R/*******************************/
( C" D% e8 z! T, J! @4 w/ t1 J; M# ^void WriteDataLCM(uchar dataW)& P4 K+ K  p# M5 Y
{                                       
2 L. [. b1 c# O        WaitForEnable();                2 ^3 y8 c$ [5 }/ C5 n
        LCM_RS=1;LCM_RW=0;$ a: g0 q0 b2 b6 I; J
        _nop_();_nop_();
! r2 F! q4 |- ]" G3 x6 E        DataPort=dataW;_nop_();        / g2 ^; f$ R3 S2 Y. @3 l  J. r! y
        LCM_EN=1;
6 r0 i4 W$ e& U. J. J        _nop_();_nop_();_nop_();_nop_();4 D7 H/ Z- e8 _+ }* d/ B, X
         LCM_EN=0;
: r+ ?; ^( D; I}                % H" ?0 u; [$ o3 a% I2 b
/***********************************/
" I! C' d' ~5 K1 J& evoid InitLcd()                                3 N* ^/ I* @5 \) t) X
{                        ' j7 z" A4 F9 U! b
        WriteCommandLCM(0x38,1);        
: K# q9 }1 \% \6 X1 B6 p        WriteCommandLCM(0x08,1);        
' F# Z  ^1 N: B" ~        WriteCommandLCM(0x01,1);        
# T6 ^1 ^+ M& E  [7 m- B3 Q5 m        WriteCommandLCM(0x06,1);9 t  g2 \( J% y8 A# S5 k
        WriteCommandLCM(0x0c,1);% D+ a+ T& |3 V+ P
}                        : f  `6 x7 G9 ?: D$ K
/***********************************/
1 d9 H* }+ Y) y6 Evoid DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
5 I% k, m4 u1 G6 p{                                                % U5 [: R4 F+ s, N8 y1 ^0 ]
        Y&=0x01;                                                
7 t3 ^8 L- r' q% K        X&=0x0f;                                                
- C9 c0 ?4 D3 @9 A5 e, \        if(Y)3 V* v' g8 _3 h, f! W
        X|=0x40;   //8+4=c
, p! S8 Q" ~. ]+ S
8 n) \: z+ Y% h" N        X|=0x80;                        
# s" M( I: z% Y/ Y+ d        WriteCommandLCM(X,1);                  i1 ^8 T, t# V( g, N
        WriteDataLCM(DData);                7 E8 p3 c7 y; q# Y5 m# o) A' U
}                                                  w/ D  R6 T4 ^

6 R$ P5 |1 h' y% ]# R! C2 w! q/ ~9 m" x" @
void Delay5us()                //@12.000MHz9 l. Z, D7 t+ N- A  d1 t/ b
{. U9 ^& V) E- K- S/ m$ Y4 `
        unsigned char i;. L0 X/ e: k0 O9 \  Q$ X: @+ Z+ h
' T# U) @# i) b2 y" ?0 c
        i = 12;! Z4 h; `# ^9 v- B
        while (--i);
5 F) j% [6 U1 Y' v( M1 j  ]/ @* N}
: _" A# Z0 l3 `
& g. I; G5 w/ f/ E9 F$ A% p" o
6 L  m: S% K; u& Mvoid Delay5ms()                //@12.000MHz, s5 d  E6 a( i  k  c
{
! p% F; e4 V% h. a        unsigned char i, j;
0 J$ k$ A& V2 M- `, F6 Q6 j5 D, @5 N+ a# Q" P; w  o
        _nop_();: `; X9 A$ m' Q/ f
        _nop_();
! [3 z  a- Y2 x  ^! H: f2 ?5 g+ r        i = 59;
# p. E2 r; D) v- T$ o1 _$ l        j = 89;
% ~0 A) W1 B3 ~# g1 h) x6 J        do/ Y: U" }( X9 n" N) \. n: a; T! |
        {
1 x! O0 J. K! y  {9 ], \                while (--j);  a+ V* Q; \, d; v2 }/ x2 u
        } while (--i);
3 F7 |1 `4 t. C8 c: ^' D}2 i+ z9 |$ S7 P

" Z) j9 q  c' n* u" _' Q
; Z9 \' m2 G  ^. R1 j/ X5 c0 a2 R/**************************************$ Z' d8 x. G+ h) L" B" I0 g, L# l; w( ]  ~
起始信号7 D* c$ i! b8 G! y
**************************************/
6 P5 Y* z# C2 m- j! w4 D4 cvoid ADXL345_Start()
" o% `* u# @. @, `{2 J; [- d$ S' v8 x2 n9 I
    SDA = 1;                    //拉高数据线% {# R; Y9 O5 p4 L# H
    SCL = 1;                    //拉高时钟线2 Z6 \0 o5 D! T' F1 B
    Delay5us();                 //延时( o6 b+ Y. ~; w  G, S
    SDA = 0;                    //产生下降沿
6 a6 V' J8 ^1 e0 Y2 P/ R    Delay5us();                 //延时
* u. Z" K" k% T    SCL = 0;                    //拉低时钟线8 j) ]$ k  o, W
}8 K  p! r! d9 ^5 u  X6 \9 p+ d
! ~! C. J- T3 A( `
/**************************************$ d4 _3 V) G( Z0 i
停止信号
4 {* j6 u7 F1 }  d# K8 A**************************************/
# t( P) Q6 f7 w; y+ ?void ADXL345_Stop()
- y3 q6 B. c9 P; g{0 O" p3 [" v2 E  S. e$ y- Q
    SDA = 0;                    //拉低数据线/ U7 H/ b, A5 {$ R
    SCL = 1;                    //拉高时钟线
( v$ V: a' H0 f' s    Delay5us();                 //延时- L1 p% O; ~7 q( L1 l8 F3 w  ]
    SDA = 1;                    //产生上升沿
) h1 A+ u$ s6 \: z3 C" m$ g    Delay5us();                 //延时% r5 e4 i. G6 }; N1 ^. `# i- I
}+ \3 X! o' l& W0 q
$ ]+ Q2 I3 s  J1 T; u6 c/ `, |' V
/**************************************1 W: O9 S# P! p! m) }) S1 o
发送应答信号
: H5 ]: j  m( x2 H/ h入口参数:ack (0:ACK 1:NAK)4 P$ h9 r( _  R+ E
**************************************/9 m+ T. `2 _5 C
void ADXL345_SendACK(bit ack)# r; s: l: {$ W
{5 f& n, h5 c, X6 F
    SDA = ack;                  //写应答信号* d$ I: @/ _& M5 F
    SCL = 1;                    //拉高时钟线
6 F/ k4 l) H" l    Delay5us();                 //延时
2 W5 m- [6 g! O* v1 u# x: [* G5 ?    SCL = 0;                    //拉低时钟线& H# d% U- k6 A. H
    Delay5us();                 //延时9 `0 {3 s/ f: B3 G- R
}/ s' U- q- u8 E* p* t
4 O& o, D! e9 A
/**************************************
, J3 {% Y  D( f: z: q) S% }接收应答信号
, Y  Z# K0 w/ G$ d4 o# `**************************************/" r; m# G9 U1 P
bit ADXL345_RecvACK()
) k6 H/ [: Y2 H! m/ ^- c5 Y" k. h{
% J/ S$ v2 o: a! t- ~+ k/ c: L" U# c    SCL = 1;                    //拉高时钟线
( u- E8 W: S# y/ \    Delay5us();                 //延时
6 x  L0 }4 d8 w! v$ S    CY = SDA;                   //读应答信号8 S4 k  ^6 L  r' Y5 h% k9 d
    SCL = 0;                    //拉低时钟线
3 k( O3 o3 v, _  n  P9 d8 v$ u) j9 |- _    Delay5us();                 //延时- m& ~& ?( F2 \( {6 N- [0 e
. c. u4 b# v" r$ a$ o( J
    return CY;
. q* l: A: O1 w, j4 u7 B}5 W0 A' X9 ?9 o# G
- i3 u; Q1 n% y& F; J" b
/**************************************& K* J+ U! c1 s! h
向IIC总线发送一个字节数据
  E2 K8 J. b6 W# I* I**************************************/( W- Y, w1 _( ]! D
void ADXL345_SendByte(BYTE dat)
5 D. B- A1 O8 [( Q; N, k{2 {8 u* G2 ^7 Z4 Q% X2 |
    BYTE i;
  m! m' ~" F" V1 S- n. l+ U8 I$ u* ?. {
    for (i=0; i<8; i++)         //8位计数器7 J/ Z/ B% Y; q) q
    {
6 M- L7 M9 |3 K) y0 F        dat <<= 1;              //移出数据的最高位& d, \- B5 S+ |4 w  ~0 g
        SDA = CY;               //送数据口5 t0 x* s7 [0 x: b6 B* f
        SCL = 1;                //拉高时钟线
/ t, z# C+ {) c" E: b        Delay5us();             //延时: F$ u; i& x4 p1 O* R6 W
        SCL = 0;                //拉低时钟线
1 O* g$ D. `5 |9 \, D1 j% B3 \        Delay5us();             //延时4 v3 `9 V( Y! Q, p3 ^3 q. e3 N) G1 x
    }
9 P! B7 B# B* H% v    ADXL345_RecvACK();) H0 e2 b5 ]7 f3 j. G$ |  R
}
% @: H, N7 K7 g/ A- Z8 U+ B& E3 _' U; l
/**************************************
0 [8 ?  V8 X) {7 y' V4 f从IIC总线接收一个字节数据; d' v! t& U, i8 s" b5 [* U
**************************************/
: z$ j3 Y- f$ V$ f' c+ x7 BBYTE ADXL345_RecvByte()2 M" Q1 c  E; Q3 F% T
{
2 Y  m7 Z7 F; }% w6 E/ H3 i9 b  e4 o    BYTE i;2 [. Q! R" Y; z; j# z$ `
    BYTE dat = 0;
3 x: ], H4 G2 O# Q+ _( p( e( l8 {. ]    SDA = 1;                    //使能内部上拉,准备读取数据,; `. G& T, ?/ t/ p" ^* @5 X
    for (i=0; i<8; i++)         //8位计数器" X1 X, k" @. U) f
    {
0 ^' e. @% t* J        dat <<= 1;5 ^' u5 n( V* C% U# z  P
        SCL = 1;                //拉高时钟线
2 K' K6 H' H  M' S1 z0 _        Delay5us();             //延时6 M0 r& Q% f+ A7 N+ S+ s/ t! [+ v
        dat |= SDA;             //读数据               / {( B; X5 U+ o5 w* V
        SCL = 0;                //拉低时钟线% h$ T8 f) F3 K/ l' U% v) U  g
        Delay5us();             //延时6 ?3 A5 l& v; c" u0 p7 A
    }
% t# {4 p0 ?0 l  q    return dat;
) b" s  ~/ Y6 |! S! n/ p}/ X/ a: Y6 x; `& W2 i0 p. [
! P6 T. D" K, L. ^9 A0 Z
//******单字节写入*******************************************/ [* K6 u+ J& Z% |* y& E6 C
//用于ADXL345初始化& t! a$ p2 H$ ^3 d
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
- p: Z0 Z; Z' @( }{5 w# ~% x/ B( H
    ADXL345_Start();                  //起始信号
% _: \  m8 ~2 d2 j2 H4 q% T    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号
( G. S3 E" x& Y9 M    ADXL345_SendByte(REG_Address);  //内部寄存器地址,请参考中文pdf22页 : w& c9 |) K1 J# `  N& L
    ADXL345_SendByte(REG_data);    //内部寄存器数据,请参考中文pdf22页
8 V. i/ C8 E+ Q! r* y" a                                       //相当于 向相应的地址写入命令字 5 `+ D! m: s( ]3 D5 \7 q
    ADXL345_Stop();                 //发送停止信号
0 N+ j% W" Z9 n2 Y. g}2 i3 K1 d; O* }; j4 s

3 O* M/ o% p2 K% s2 J" a' o0 K8 Q//********单字节读取*****************************************0 G2 q9 c/ T, G; [
uchar Single_Read_ADXL345(uchar REG_Address)
, ^. u, F$ J& w6 `; D{   & I' J7 c) \) P% ~/ g2 @' V
    uchar REG_data;
  C9 [$ v+ J9 V8 J( o5 S( j    ADXL345_Start();                          //起始信号, T4 T7 Q! d) Z$ @* M4 R
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号,//0xA6写入
$ |7 i- y5 ^- W, R5 t1 E' ~    ADXL345_SendByte(REG_Address);            //发送存储单元地址,从0开始        
) N4 y& c7 b# s4 }5 F) d    ADXL345_Start();                          //起始信号( N  O& W8 U& W
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号,//0xA7读取+ D* g$ Q" m) j
    REG_data=ADXL345_RecvByte();              //读出寄存器数据4 J- i0 p1 f( e
        ADXL345_SendACK(1);   ' h- m8 u! G4 `! l5 |7 N' Y
        ADXL345_Stop();                           //停止信号. {% |4 i! u# n: J) g: D/ k
    return REG_data;
, t. B% x& ?4 l+ q  Z- n. B4 X2 R}" P0 R( |( M+ J6 ?
//*********************************************************
! d5 w/ b7 Q) W/ r  S) b: R//: i3 l  o) F! @# r# l; t* H) T
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
1 U0 o( o3 k% Q0 J4 `: e//
6 J: P5 y4 u( ~//*********************************************************
( \6 N" E; ^8 X; H( zvoid Multiple_read_ADXL345(void)% z) t! o/ o- F( m" k) q
{   2 T8 |9 U2 c1 [1 F8 l, ]# O" z
    uchar i;
; C  S8 G0 ~8 i8 }6 }    ADXL345_Start();                          //起始信号/ i0 M1 @% g. H/ C7 F1 _( v- {% F
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号% o# g; K/ ]: p2 A
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始        
9 t: ~: J- A2 n0 {    ADXL345_Start();                          //起始信号/ F' a- z% `  J. Q# p0 ?, g
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
" j& x, m5 |5 V9 y3 I, Z- j         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF" i+ [2 M6 O/ h) \- |1 {! A( d6 |
    {
% D$ o! i) G! d6 e! D        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
/ k5 q5 B% m$ G& l& e3 i        if (i == 5)
) s. u6 z: C( ]0 s        {
# \- h, k1 S; q9 }1 {           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
7 D' |% a# u! P        }
6 ^0 X+ ?# v; ]( s$ K  G        else. r; v. x* U0 B4 G$ Y9 x& K
        {0 E) ^& z7 b! N# G
          ADXL345_SendACK(0);                //回应ACK3 P" U! Z+ R, Y/ f: N
       }) M: W' _3 c& F
   }
9 m. k% l9 ~3 N/ Z) |5 b% Z    ADXL345_Stop();                          //停止信号
( ^5 l8 [- ~, U4 z    Delay5ms();
8 f+ p; _7 c$ r  g0 Z1 a}
& b9 ]) b9 R9 \8 P
8 |/ l) `$ Q$ x//*****************************************************************
5 M4 J* B0 ?, y! C- n, o, T
; @: }7 T) Q; `; }3 {//初始化ADXL345,根据需要请参考pdf进行修改************************
  [% y1 ^' Y7 e/ yvoid Init_ADXL345()
  |& W$ `7 J7 E{
0 i7 Z2 ]5 h( g$ F   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式
8 h2 r# z. X9 k. }- E% Y   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页$ Y+ }7 n. J" T$ s2 ~0 c. S; K
   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页3 f- h2 v% g  n6 ]0 P
   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
( s% z5 ~3 t8 T% P( U) S* S! ~: |5 u' P   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量) |$ I. [) i' w! z& @7 b
   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入,pdf29页- a3 o. w4 ]! \7 Y( E' T
   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入,pdf29页
& D% g, P! E' ]1 d}
' w4 E: P$ s' N/ k5 M  d4 C3 M
//*********************************************************
. ?$ S+ {( S( o# J- k% `6 Ivoid conversion(uint temp_data)  
* N+ _& k& L4 A{    F1 ~& O  w( l% |8 g. s6 R8 I+ G
    wan=temp_data/10000+0x30 ;              //0x30='0'
% T! [! }, D+ p    temp_data=temp_data%10000;   //取余运算
! P: c/ R8 S* ]- r2 }7 f% o! d        qian=temp_data/1000+0x30 ;7 t/ l( }" ~) e, `
    temp_data=temp_data%1000;    //取余运算) p! C" ]6 t: g. v8 E) q/ I+ t
    bai=temp_data/100+0x30   ;, t& @. O, |) B( ~# w- y3 T3 A
    temp_data=temp_data%100;     //取余运算
3 N& x6 A! B: C    shi=temp_data/10+0x30    ;
4 {1 Q( k  S  \9 k) L7 Q+ Q. x: R    temp_data=temp_data%10;      //取余运算& P9 G5 ?) q, {3 `
    ge=temp_data+0x30;        2 ]' U+ \# I: e* G$ H% K* Q' s
}  B! M% A/ T; B1 L! Q) d
1 j3 G8 v+ |, t/ h
//显示x轴倾斜角,即x轴与垂线所成角度+ B  B9 m) F2 h; @8 v1 |
void display_jd_x()) r2 b# F$ _. d" O/ p
{   
& Y$ Q: S4 a, e9 G- V( _/ j    bit bj=0;//标记
- B: S7 z$ H2 K& H4 |( z    int  dis_data_x,dis_data_z;  //x,y轴加速度的原始数据,用补码形式表示+ r! C$ j$ ^# \5 |# w3 A$ V
    float mg_x,mg_z;           //角度,加速度
' {: x! v8 p5 ^. K  z, ^, `    dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据   8 \9 `# y8 l; w4 Q9 I7 H
        dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据# ]+ L- r! c6 U% M, L
6 H" M- A! c! y+ x" c% A( U
        if((dis_data_x<=0)&&(dis_data_z>0))          //第二象限
+ K1 j) F" G  p* J3 z% S4 E        {% K; H; l4 ]: T
            dis_data_x=-dis_data_x;
' |4 {8 C# h. s+ b+ h5 n                DisplayOneChar(8,0,' ');
2 |% @+ N$ W2 Q' a! F6 P        bj=1;
5 F# I; U, P. Q& M        }1 X: S- ?8 v) Z$ d* o
        else if((dis_data_z<0)&&(dis_data_x>=0))         //第四象限- _8 K! {8 N5 F3 [
        {; Z; |2 a# {1 T7 }* X, [& y
            dis_data_z=-dis_data_z;
$ [3 E8 l/ J) W2 ~        DisplayOneChar(8,0,'-');  //显示正负符号位/ F4 v0 f. L1 O2 V- b2 y5 \4 ~1 J
        }
; X% v0 c3 [+ Y* N        else if((dis_data_z<=0)&&(dis_data_x<0))           //第三象限4 Z6 F+ X( _' W$ u
        {( z) H, E5 f" s' m9 O3 J
            bj=1;6 e$ I" Z, r& U8 i0 I
            dis_data_z=-dis_data_z;
2 o; V/ O) f/ v. e8 t9 v                dis_data_x=-dis_data_x;
8 @  e6 w5 l# n$ n$ z; J, e4 I        DisplayOneChar(8,0,'-');  //显示正负符号位( C- w; a" p, G& F1 `( e
        }3 e& W; f: ]8 K' n. [( r! A1 f0 f
        else if((dis_data_z>=0)&&(dis_data_x>0))
8 a) m# @( d" ?- g- j3 I0 T         DisplayOneChar(8,0,' ');                //第一象限3 R) H5 L, c, M" W

$ K/ g0 d- m5 y* G( I( ^    mg_x=(float)dis_data_x*3.9;  //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
+ _* C5 `0 L4 n7 S4 g        mg_z=(float)dis_data_z*3.9;         //强制类型转换,dis_data_z的类型和值不会发生改变
' b8 ]5 t+ T) g/ q4 Z0 x
( K% z7 i" z0 i9 @  g% N0 Z        jd=atan2(mg_z,mg_x)*(180/3.14159);! L3 K9 @- N8 |! p- b) p$ n" `, Q
        if(bj==1)jd=180-jd;          r' a& m% ]+ Q
          //jd=jd*10;  消除小数点,便于转换数据和显示
& V: n$ n/ ]9 a6 U) Q! ?    conversion(jd*10);      //转换出显示需要的数据                                        //
0 m/ e  v" N6 V9 ~! l5 {1 ]        DisplayOneChar(6,0,'X');
5 ?) T1 I4 F% `: l/ f4 T        DisplayOneChar(7,0,':');   
3 p/ K. y1 a% ]3 m6 n        DisplayOneChar(9,0,qian);2 n8 l( o5 q8 E; n5 @6 n
    DisplayOneChar(10,0,bai);         
' w- j% X2 G. u/ s& q    DisplayOneChar(11,0,shi); + ?! l8 ^% ~1 t( W7 E  p
    DisplayOneChar(12,0,'.');  E% }. h+ L2 C
        DisplayOneChar(13,0,ge);9 c! t3 t5 R3 ]' U' Z: C
        DisplayOneChar(14,0,0xdf);            //显示 °) V0 H0 N* _9 k9 W) b/ v
        DisplayOneChar(15,0,' ');
5 ]  [1 W# H5 y! H) F}
( U6 k+ `) S: C* t% a9 h3 N6 u: y0 x* R- R- @  V+ x9 ?
void PCAinit()        //PCA模块初始化
# c) K/ F1 W. r& G! P$ l{& r& R4 x8 V8 j7 Y* h
     CCON=0;
: k3 d3 T9 ]" h, n         CL=0;
* u( ]2 }% O! X0 g( ]         CH=0;4 y, B! ^2 m2 M+ c
         CMOD=0x00;        //sysclk/12
$ R7 y; b& t: |2 u3 Y  \6 Q* ^. J         CCAPM0=0x42;//8位PWM,无中断
% J' D  v4 X8 D& d! m9 U. X         CR=1;
, ?! b) m6 r! o- d; J+ j# V         CCAP0H=CCAP0L=256-240;
( }* [3 n/ ^# I2 r# T6 ^}8 ]  }7 w9 a! K- g# \: D$ v
void init_t0()         //定时器0初始化% M" O: K/ u7 K8 p
{
4 A) B4 a1 y9 F3 {) o    TUXR&=0x7f;         //12T
6 E  L* |# }; j1 {* z# V% c8 x1 Q        TMOD=0x01;" v& j, D4 [- j8 D
        TH0=(65536-50000)/256;
' J  z" |2 B, |. v        TL0=(65536-50000)%256;# Q, m" `5 z* o
        TR0=1;! m" W, c3 @: a9 y
        EA=1;
5 `3 k  \8 p8 S! g' h# f# w" `' `        ET0=1;% s% y; h9 x2 q$ S. _1 }
}: V# V$ o4 j5 t8 R" p  N

" k0 d0 E& f' Q  I+ Z4 U//*********************************************************
4 y: f! E* S) r+ ?* W//******主程序********$ Q5 }# b" S3 S0 j* o! q! V
//*********************************************************
- o7 I1 a% H) y+ Lvoid main()! [: M3 S5 m1 ?" U! X9 |* s
{         
9 m" x9 C% @+ Q        char H;          {* l+ o  O2 p- M
        InitLcd();               //液晶初始化ADXL345
% F" _1 W5 w( N" y4 t1 q3 O        Delay5ms();, \2 `4 n8 j) t$ u- u
        Init_ADXL345();                 //初始化ADXL345
) @( ?/ Y# @5 V) P" W        PCAinit();
, F* L/ A# Y' B, i) s        init_t0();
9 M) b3 S. [. ]8 Y        H=CCAP0H;( j8 S& n- ?6 J: I2 N' ?

  q; K& z. h' n1 H+ T% ^        while(1)
* S& k$ F' C" x! V, ~: G        {                                                                        
$ r. @' z9 D6 P) \/ {! f& v' h- v. H                if(p33==0), J9 ~: U1 b- M( a% F0 S8 U6 D9 {
                {         ' `4 k3 P: V# c+ F6 e! q7 v
                     Delay5ms();
8 D6 I  K) k2 P                     if(p33==0)
: v( R$ Q6 C/ n5 {1 F8 A                     {( A) G6 X/ H  P# y* D+ F  l  V
                          H=H+5;
' u. `8 X5 b, f/ w                              if(H>255)H=255;
% y! k- a7 d; ?" F  E5 y                              CCAP0H=H;
  v. }) x- s- \( M3 L+ U8 r                              CCAP0L=H;6 Q; [) [$ l- T. l( x7 C: y
                              while(p33==0);
2 S  ^, @: V: `5 z' F9 |                      }5 v+ }4 u6 C* h, ]4 H
            }
# [5 D/ F+ ^& U8 G; K( b, A                if(p31==0)
- b+ ]! F, A1 p) E( V: O' p                {         
) N- E* x* p. L3 T" l" @, W                     Delay5ms();/ p' o1 N+ M' R+ z% {0 i0 b' R
                     if(p31==0)3 i8 T& g, I/ @; r
                         {
% b. C* H" f" M9 p! V3 w9 l  N                            H=H-5;
7 v& Z9 {. t0 Q; K" _1 ?9 f) ?                                if(H<0)H=0;
' V0 j8 H. X2 k9 w( O* @" N* i/ q……………………7 b5 q& N! R5 `7 N9 }9 J
8 H- L3 R/ h5 y; H. Y
…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………( v( n6 r. d" G/ j& g$ y/ X

! J1 E! q4 p0 M! U4 m! D
游客,如果您要查看本帖隐藏内容请回复

; D/ O. q  }& N3 i, g
2 m' W$ x5 p7 S8 r3 `5 V0 u$ U+ b7 X2 O; ?& j+ h2 y6 \

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 09:00 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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