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

ADXL345测倾斜角(程序)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ADXL345测倾斜角(程序)

7 |( o) t; x) R/ h) I7 S( J! F# B1 r& f; \4 ^" V* z. D
单片机源程序如下:

% `( g* c: H, F1 H, h' f* Y, c
, Z0 f/ D9 X# n( \' g- }( q: s#include  <REG51.H>        ) E/ p& N: y* ?" I% `
#include  <math.h>    //Keil library  % _8 ^. u, A4 l1 K
#include  <stdio.h>   //Keil library        9 c5 D5 c' z4 T# p2 v& w
#include  <INTRINS.H>
# L9 C# V( m) L& \/ t. D/ J* M$ R/ Y9 G4 o' g# U* X( [/ _
#define   uchar unsigned char
7 k% M5 `+ f8 j" r#define   uint unsigned int        
1 \5 Q, @  F) Q#define   DataPort P0    //LCD1602数据端口, U. ^1 i/ J# i; u* o: E( q' N
' s  X4 c" ^  D% G0 I& r/ x( T9 Q+ j
sfr TUXR=0x8E;
, Q' I! U/ s9 L& Y% [sfr CMOD=0xD9;  R5 Q1 n' N1 c/ c2 l% W
sfr CCON=0xD8;  r* X7 ^3 [, _5 X# V, D) x
sfr CL=0xE9;% `1 D. `1 ~7 C1 V/ i7 I- {
sfr CH=0xF9;
0 d- o5 T- U6 ]$ ^, U1 w- }sfr CCAPM0=0xDA;9 T' I4 y; F1 Y  q$ e' n5 b
sfr CCAPM1=0xDB;
! O3 i' u5 H- z1 J7 Wsfr CCAP0L=0xEA;3 r9 j& B  v1 a' S3 b" {' g7 l
sfr CCAP0H=0xFA;( d# Z, T" `" W- m1 W- e
sfr CCAP1L=0xEB;
: Z' r& T" O3 |1 @0 psfr CCAP1H=0xFB;
1 X+ Z9 Y$ J$ ~+ J: H  a# Osbit CR=CCON^6;+ k% X% P0 l% h! \) z8 z
- C! f% \8 \- i0 W# r+ f0 x

# q( r& K: v- m1 y9 k$ Xsbit          SCL=P2^0;      //IIC时钟引脚定义6 N# e6 ]( p) F. \% X/ g/ }
sbit           SDA=P2^1;      //IIC数据引脚定义) T, e% v5 g% F2 ^
sbit  p22=P2^2;0 V, Z7 e2 w" V
sbit  p31=P3^1;
6 H& e  H7 d: e- H+ R1 ?& V3 ?! ^sbit  p33=P3^3;
4 T, B: o- V% V7 z2 U, f  X. Msbit      LCM_RS=P2^6;   //LCD1602命令端口               
1 C/ ?1 ?3 R$ Asbit      LCM_RW=P2^5;   //LCD1602命令端口                ' W* s& N* V* E' I( Z
sbit      LCM_EN=P2^7;   //LCD1602命令端口" m- d# e* K' u6 R% w& r+ t
3 T. m$ J$ U3 C* o6 [) w+ x  a2 J
#define        SlaveAddress   0xA6        //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
+ i- F) u) N1 }/ d4 j( M. x                            //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
, p4 A- H- u7 ^. Z: U; w; htypedef unsigned char  BYTE;
( q( k& ~1 K' C4 W% l( U) m/ |3 W& Ptypedef unsigned short WORD;
7 j+ _  h1 `' _  j/ _4 \0 J: j" r- \# q
BYTE BUF[8];                         //接收数据缓存区              1 v9 }6 W8 Z5 Q, |* W( t" v
uchar ge,shi,bai,qian,wan;           //显示变量  个十百千万
3 x9 a' G: k) e/ D+ {+ _% ?int  dis_data;                       //变量
0 h: \4 Q( v' h6 O- Nfloat jd;
" ~* G  V& x4 \! g. uuint PWMH;: ^6 z' [9 W; z7 E  S# w6 i3 R
void InitLcd();                      //初始化lcd1602
: Z) k# k" N; \/ v; u5 [void Init_ADXL345(void);             //初始化ADXL3452 I9 Q9 r* c. q/ |) t( V0 ?

: d0 f% Q. B  E3 nvoid WriteDataLCM(uchar dataW);                // LCD1602相关函数
; H  I+ r% }; L4 I9 Mvoid WriteCommandLCM(uchar CMD,uchar Attribc); //8 [/ v! Q2 p" A7 V
void DisplayOneChar(uchar X,uchar Y,uchar DData); //
% O+ k$ B  R, _. v- j& ovoid conversion(uint temp_data);        //数据处理
; j$ S4 U' y' D' x1 ]/ n* ~' k/ |$ a# k0 d
void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
2 }# C4 ?2 @: Vuchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
. c& i3 C- W5 w, w4 `: Y. e0 j# vvoid  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据! d3 I6 V! ^% q% f/ h& ^
//------------------------------------
+ q" c) A7 a; ]8 e  {# lvoid Delay5us();
* M1 T4 p% R4 u& B: q# gvoid Delay5ms();
8 ?* e) F6 q; l0 a9 x. svoid ADXL345_Start();       //与iic有关函数, Q1 ^: M/ h* r( F# |3 d
void ADXL345_Stop();
6 n: b8 V0 T; O8 f( z0 Kvoid ADXL345_SendACK(bit ack); //传送应答
6 d+ `5 J0 A8 R, ?bit  ADXL345_RecvACK();                   //接收应答, c. y% b! u, {+ E' z% i4 ?9 F$ f
void ADXL345_SendByte(BYTE dat);% }* K+ [8 [$ F' C
BYTE ADXL345_RecvByte();* \1 q: y3 ?4 p% {2 B/ v: [
void ADXL345_ReadPage();
) q; A+ K. ?' U  Tvoid ADXL345_WritePage();( G" B% P4 H( \" k5 M
+ Z) s0 S; v  F- P
/*******************************/9 S$ N+ k1 {3 y' F7 U; {
void WaitForEnable(void)         
% D2 d' D4 P* y! H6 P{                                       
% ^6 q! E) X8 t        DataPort=0xff;               
& |3 U- Z7 F* I4 }( M  Y        LCM_RS=0;2 ^' M* I! j8 o! p
        LCM_RW=1;
' q5 X' c' m% p1 e7 T        _nop_(); _nop_();
& c- p3 ^" w/ T        LCM_EN=1;
- j; J" J: c/ ]' U+ I& l        _nop_();_nop_(); _nop_();_nop_();
8 t- S  z7 V+ A) m" d- _2 }) F        while(DataPort&0x80);        . b2 h3 f1 S# Z
        LCM_EN=0;                                ( }: C& ]$ J. N* R5 N" _# K
}                                        ' X, K# T8 p( X& r) U4 p
/*******************************/8 R# u3 B7 z) A. A3 R- d
void WriteCommandLCM(uchar CMD,uchar Attribc)# f7 q* t# s) |( d5 T
{                                          P# Y+ k8 v2 o. a8 s
        if(Attribc)
9 d) |, p- ]4 e2 f% ?        WaitForEnable();        
# @5 P$ r; v5 C6 c        LCM_RS=0;
: I1 \5 }& j+ ^& ]        LCM_RW=0;
2 n. {6 W7 J4 C" e- t/ t" N        _nop_();_nop_();
1 p: S* P) I& |0 y& f0 g: I1 V        DataPort=CMD;4 f  K/ G& V( a0 H) |! V9 L
        _nop_();_nop_();        $ E( p, Y0 G9 X7 H7 D
        LCM_EN=1;
$ j7 e) l+ P4 F3 O* q        nop_();_nop_();nop_();_nop_();3 W* [" Y) _# |4 r9 v1 H7 h: u
        LCM_EN=0;
( v: `- Q/ m0 r2 o3 V7 ?! N+ Q}                                       
6 h. E: u6 d! t- X7 ~2 k/*******************************/# t9 w' x) }; s4 x- g( Z* v
void WriteDataLCM(uchar dataW)4 t9 R) U6 [/ X8 H7 J8 n2 y
{                                        # }( p" N2 C% D
        WaitForEnable();                7 K" j9 f' N5 b9 f
        LCM_RS=1;LCM_RW=0;
4 h! f( I* E1 j% Q2 I        _nop_();_nop_();
/ D! ~' R! m5 Z$ e2 d        DataPort=dataW;_nop_();        
) L. g6 X1 P4 {( F7 _1 a; o        LCM_EN=1;* i1 Q, H, M6 h2 ~6 `
        _nop_();_nop_();_nop_();_nop_();
/ x) H: c; y4 n6 h# }         LCM_EN=0;
- J: J7 |4 P8 u- F}                2 a4 U3 X$ K$ j2 u3 ^
/***********************************/% F* g3 \8 b7 e5 j0 `
void InitLcd()                                
2 {% |7 ^) m4 u1 i6 d, @; R  F{                        4 b- h  S5 l6 I/ v
        WriteCommandLCM(0x38,1);        
, |4 N# Z' k6 Y3 c, i/ @6 [        WriteCommandLCM(0x08,1);        
& d1 W6 _, s3 B8 t; K        WriteCommandLCM(0x01,1);        
1 y& N( ^  _, {- _+ @- p) Y! N        WriteCommandLCM(0x06,1);( a2 s# w# R, s
        WriteCommandLCM(0x0c,1);
8 U9 t, |8 {) `, v! D}                        : Y& w  W) Z: Y+ v8 @. F0 f8 ]
/***********************************/" @( K) {. u5 @& A/ H+ }
void DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
& l- F$ [( c# U" i8 t6 M! Q* v{                                                / a( I+ v7 ?$ ?1 G
        Y&=0x01;                                                5 y, Q/ s  ?* h! p+ L2 _/ w& E; u5 ?
        X&=0x0f;                                                7 e" p% i3 J$ W" M2 P
        if(Y)
$ Q5 f. ^$ O: Q  B9 W% H        X|=0x40;   //8+4=c3 E5 F- A9 h; R

. M& S9 z* {: k/ z( v        X|=0x80;                        
- n  Y+ O8 G9 }9 ?, V3 R        WriteCommandLCM(X,1);               
  X* m- u4 N4 k; I, U6 ?3 j0 z        WriteDataLCM(DData);                2 j6 K* k5 p6 y
}                                                
) V& G8 W2 i$ J& g1 k1 [& [6 t  F8 I. B" c/ M

' e. w! |: B0 v- k, v7 Lvoid Delay5us()                //@12.000MHz
+ A" R3 h5 L# g% p( A9 s0 Y* I7 J{/ _/ s4 |$ Y, y
        unsigned char i;6 z. O/ w" B) Z  F4 x. J* B3 P

' f! P7 u2 s4 V) X# X: ?        i = 12;
2 v* u# y' M/ i        while (--i);6 P& m2 Q5 Z$ u8 W2 Q' ?& ?
}
1 }  I5 {1 r: }- n
) P* t2 L& p8 j5 i
3 Q: m  g" s4 x) l8 g2 P" kvoid Delay5ms()                //@12.000MHz) i6 R  W& u+ P
{  M9 G% g0 O, G4 V
        unsigned char i, j;
3 ^& N8 \+ y% D1 E5 a) i$ R! K; e% r: m. D' R
        _nop_();* D: Z5 V! @4 S7 R1 c
        _nop_();6 O$ G5 o( l# |. B5 |" ^% w# ^8 K" g
        i = 59;
0 c! d) b# d: w        j = 89;
" H% h3 M. ?# g) Q" |( a        do" s3 F" T- U$ B& S
        {% d( n: @, Q  z* l( W0 ?
                while (--j);
- Z7 L( ?  M+ J$ U! v; \        } while (--i);( p8 L3 U1 S+ N# ]# E6 q
}1 S6 M- E$ p% X9 K. i/ `

+ f2 I, M* y. w8 r# z9 S  P3 X) f: z. V6 m. ^0 O( H* V6 I
/**************************************
. k, E) E( N* ?$ h1 b起始信号
4 j/ y; w5 X0 N) V. T; w* M" _**************************************/" Y# g$ ^, F, o  j8 ]
void ADXL345_Start()( @  B6 x9 ^$ W
{
/ S4 k5 p( C) a5 k- R4 R    SDA = 1;                    //拉高数据线
' |; F9 c" [2 ^2 J. c2 E6 ~& s5 t    SCL = 1;                    //拉高时钟线" @1 {) A: d) `9 P' p1 a" M
    Delay5us();                 //延时$ |  i- |- d  ~1 q$ c) O( x; [
    SDA = 0;                    //产生下降沿
  k: f* ]- W5 b0 j) @; W8 T0 }    Delay5us();                 //延时
1 U# E+ T! }! c! Z0 N    SCL = 0;                    //拉低时钟线' r) v$ ~* z: w* g4 N0 @
}! J. s6 c* U: ^
& V2 g$ ^, w) o
/**************************************. S* L# X; N( v& j! I; n7 K
停止信号
# b- n& r, [: n! W6 d3 V& t**************************************/6 @$ n' L  e9 V$ {
void ADXL345_Stop()8 M' \5 g9 n! z. X% H  s
{
7 P8 c+ `! U+ p0 L( A    SDA = 0;                    //拉低数据线
8 P% l3 P1 |0 W8 v: h& u    SCL = 1;                    //拉高时钟线0 A* [1 t! B' F" C8 x; N
    Delay5us();                 //延时
0 c0 m+ d3 e! F) g4 H, F9 n    SDA = 1;                    //产生上升沿( Z3 @+ o8 z1 j( {# |5 ~, ^
    Delay5us();                 //延时# _' n$ I% Z/ [6 T
}, f7 i) Y7 B$ U3 w7 M9 p3 `( j* o

, Q7 `+ r1 j1 V6 r/**************************************
  `/ b6 a% g3 C发送应答信号. o8 b7 c! x: ]/ M1 S' \
入口参数:ack (0:ACK 1:NAK)
3 t, G& }8 J1 M% I" @( T**************************************/
" K2 T  u1 h3 ?3 E. Nvoid ADXL345_SendACK(bit ack)
' F: O! U& f& J  U' ~! D{
! F- y/ U5 X" j# K+ m+ Z$ H0 }$ I* j    SDA = ack;                  //写应答信号" z6 q% _9 E" K% y1 N
    SCL = 1;                    //拉高时钟线
3 g: h& t& W/ y9 X' l    Delay5us();                 //延时
$ Q# P' S7 _3 l) _: \/ E    SCL = 0;                    //拉低时钟线$ w9 p( M8 D1 x$ t1 }
    Delay5us();                 //延时2 X' \2 ]: P, k
}; `, M6 N% F/ w6 f

. ]# d  {  h3 A3 s3 N6 y1 C/**************************************- @4 Y  h# u+ g1 Z! K
接收应答信号
2 D' T4 ]9 s( _**************************************/3 @8 `; ]( _3 N+ J* K
bit ADXL345_RecvACK()
+ h, E' @+ w3 j$ l. @/ r, J4 P1 w* H{
4 ^8 f* D7 k2 A! Y' d. M# a) v    SCL = 1;                    //拉高时钟线) \; l8 F3 v$ }; o" k
    Delay5us();                 //延时
) J; C/ [9 D, }( z% Z    CY = SDA;                   //读应答信号! G- K6 d' w! h9 r9 [% _7 Q
    SCL = 0;                    //拉低时钟线) o! k# [5 [7 `; Q
    Delay5us();                 //延时
6 A7 \9 A! m+ ?& ~  d' `. f) c0 N+ N5 ?8 V9 g# b  n
    return CY;$ a5 K! r; \& `7 ?. \0 m
}
7 Q2 G+ g! s: Z% v
1 R+ o3 |0 o9 E9 J( U8 T( m/**************************************
2 o3 g" D1 G) ~5 y- }- [# X向IIC总线发送一个字节数据" r2 u' s9 W1 Q% z: V7 Z! \
**************************************/
. {  j) F1 S# xvoid ADXL345_SendByte(BYTE dat)
' @8 E3 `" T6 u4 }{
! S- m! R3 E9 f: O    BYTE i;
3 c/ E& f  P; e2 |$ y* H6 w3 [& E4 B
    for (i=0; i<8; i++)         //8位计数器4 ~: V3 j( H$ P3 Y, Q3 z
    {
! K. k+ C9 k3 w) R' u" F        dat <<= 1;              //移出数据的最高位+ Y7 A2 H0 n' F+ O. f1 P& ~3 @
        SDA = CY;               //送数据口
% ?% @! ?7 d+ v* h; u: C        SCL = 1;                //拉高时钟线
  c7 p  ?8 t$ }! _5 x2 `        Delay5us();             //延时
' n. L) z2 B% @/ P' C5 L        SCL = 0;                //拉低时钟线0 n/ J+ ?( L: s2 t1 i
        Delay5us();             //延时0 E% i0 m8 R9 u2 X) q
    }' T( S4 h3 V$ \/ ]2 e) P4 g: Z
    ADXL345_RecvACK();
4 i9 i' H  J+ d1 q1 C' ~4 o9 z}
/ s( c* {$ N% }8 z1 N$ t/ U2 i; ]$ p/ i
/**************************************
% _' A" K- K4 d. o6 Y从IIC总线接收一个字节数据/ z* ?, V  |% w) w
**************************************/
4 m9 `4 v% U8 H1 t) R$ C' P2 Q" }BYTE ADXL345_RecvByte()+ I9 l) O# e6 G6 b1 {9 t
{
* a9 x4 E1 z3 P7 E$ w' [3 k3 Q6 n    BYTE i;
9 c( D# s1 ~6 P% S    BYTE dat = 0;" E  x1 L) p4 U
    SDA = 1;                    //使能内部上拉,准备读取数据,
/ o8 q- x1 p( B- b6 f    for (i=0; i<8; i++)         //8位计数器; l* y" G& \6 \2 I! e6 ]
    {
  C8 J/ L/ `, A6 n        dat <<= 1;
) p5 W6 \2 W3 \( g0 q' V& S        SCL = 1;                //拉高时钟线
/ s8 _) G. K1 H$ s  N        Delay5us();             //延时. w2 ~; T/ S8 W% c- H; \/ M
        dat |= SDA;             //读数据               . ?, F) j$ |5 v4 ~8 C
        SCL = 0;                //拉低时钟线
% C/ G( q+ e' l0 S/ n1 s* d9 d        Delay5us();             //延时3 Y3 Y7 t5 W1 q! k' I/ y" X: ^
    }
2 q$ l" ?& |4 H4 ?    return dat;
3 F# v+ y6 m( I}
" q) Z" C5 f+ j, R" N  a% |3 o) `5 G7 d% N* j
//******单字节写入*******************************************" ~8 I1 P9 S0 R
//用于ADXL345初始化
% Z+ |2 o1 J. f* h) {, F* r- Yvoid Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
8 p, U( K) y7 f; b{
1 Z! ~; T( \4 h, h* M    ADXL345_Start();                  //起始信号. @8 t! K/ t) n( [
    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号" R$ z& J: ^8 m' v5 N
    ADXL345_SendByte(REG_Address);  //内部寄存器地址,请参考中文pdf22页
- d- z7 @( V) t: e0 M% F6 k    ADXL345_SendByte(REG_data);    //内部寄存器数据,请参考中文pdf22页
0 v+ ^* L* Q/ b. r7 m" _                                       //相当于 向相应的地址写入命令字
5 g2 @# m! c$ q' i+ Y0 F    ADXL345_Stop();                 //发送停止信号
/ k5 G& ^4 {5 m9 C" m}7 o1 D* w9 B5 [) i+ y. X4 F

9 [, `& _! E) b$ z//********单字节读取*****************************************: ]2 D8 P& Q) P- ?! ^1 C7 `
uchar Single_Read_ADXL345(uchar REG_Address)
! I5 Z4 H8 a# c/ h; }8 \{   
4 o; q( H  u$ f5 e5 a$ F- o    uchar REG_data;0 j2 [7 x$ h6 L3 ?! ^# U+ k
    ADXL345_Start();                          //起始信号
4 y& C* P, s& A  X0 u7 h& ^! b    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号,//0xA6写入9 @. W- ^/ Z8 {6 {$ j% h. `) `7 d
    ADXL345_SendByte(REG_Address);            //发送存储单元地址,从0开始        
  P) V& Y1 w; @5 X( X, S: r. g    ADXL345_Start();                          //起始信号( T! p& ?! S' M6 ]) y4 ?
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号,//0xA7读取
7 M9 X1 b1 E# @/ c    REG_data=ADXL345_RecvByte();              //读出寄存器数据
0 O5 I+ [, ]. `: r% X        ADXL345_SendACK(1);   2 }1 B5 H: B3 l6 q% }  C. T
        ADXL345_Stop();                           //停止信号
: r8 x; v7 H+ ?    return REG_data; . K) r5 I" H6 |
}% n1 `: }7 k* _$ @* Q
//*********************************************************1 s3 U" @" \. ]3 I6 j+ ?: u& D% x
//# G4 u  k+ k  J7 o3 b4 d( o- H
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37# W0 [3 K* q8 B! X4 v' N+ C
//% s5 q- Y1 D1 f
//*********************************************************2 @# ~' K4 q- ^2 B3 D! |" C1 l
void Multiple_read_ADXL345(void)
, c; |- M. n- ]9 x5 \  ~% n# A{   
$ `$ c' s; O& C9 M: f( D  z8 ^( g    uchar i;
- d6 G! i/ a( R! ]    ADXL345_Start();                          //起始信号
: s' N' z; i9 |0 o9 k- g. I    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号% ~+ u: _! q7 A2 B" W  C/ N
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始          W  ]2 K7 R9 |
    ADXL345_Start();                          //起始信号# B' ?; |- l3 F5 C6 x" @( i
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
6 Q  p( v, s# h% m# t* w* V         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF0 b; R( o' p% r
    {
. ~1 `$ ^8 ~/ d6 g% }8 ~) ^; ~        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
5 Z) J2 _, z6 R6 R; j        if (i == 5)
# n& P+ d( C" K9 C        {
9 c0 A+ o) O9 S           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
; K! h  J' p$ m) f* b+ P( p- e        }
, w* h" z9 L. n9 ^        else
  a; t: X. C: v1 c        {$ }* V7 R( [  d: ~5 Y: S
          ADXL345_SendACK(0);                //回应ACK' r& e  H1 N& A  |- h: N9 {+ N! ^
       }* e( P( T/ h% l6 p4 n
   }0 b7 R  L6 V  U$ P  r9 |
    ADXL345_Stop();                          //停止信号
7 C: b# @) b. `; P    Delay5ms();
3 ]8 ?- t, Y3 D. d4 G2 n}& B7 y" ^' J7 h  }
8 [8 n2 i! v8 u; @7 a4 d+ z8 x
//*****************************************************************
! C1 |: F' F: W( q( D: d0 J1 {7 {6 f3 l8 w/ h0 Q4 M; w, g
//初始化ADXL345,根据需要请参考pdf进行修改************************2 @, J- c- q: A; i
void Init_ADXL345(). P2 R& \$ Z- |2 }3 ?4 O
{
8 {3 T: h/ ~7 ^6 _   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式% X/ L6 W( {9 ?. e$ Q  f; g9 o
   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页
2 p/ e6 k0 s6 G   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页  u, v! D6 A+ c4 F. o4 [4 g
   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断. R4 ~+ q+ i. d5 z1 g1 p" _
   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量
4 A2 T1 N( D5 Z5 j  J   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入,pdf29页
& s! g1 M7 t6 v   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入,pdf29页4 G. d3 z5 E. V8 z2 A+ z5 t% V8 f
}. j: a: a# ]/ k# ?; F4 |# f

( x$ F3 V3 O7 {2 X  r5 x //*********************************************************1 s; A" f/ ]) V8 O- V. U5 _4 O- r4 E
void conversion(uint temp_data)  
9 v/ q3 h( d) \7 N3 ]& N{  
. m/ H8 t% ?: A+ T" Z" \    wan=temp_data/10000+0x30 ;              //0x30='0', Q3 f& P3 A% Z% W
    temp_data=temp_data%10000;   //取余运算* z. k9 M) B: T% D1 q8 @- A
        qian=temp_data/1000+0x30 ;6 e% [0 d7 |2 f/ m; `' U
    temp_data=temp_data%1000;    //取余运算
1 D) s8 a* ~1 l    bai=temp_data/100+0x30   ;. r# [, q6 S, t( E. ^6 |
    temp_data=temp_data%100;     //取余运算
  _$ e7 U0 a: ?' q2 U( |    shi=temp_data/10+0x30    ;
" _$ Z# V. M8 B# ^1 y5 W& v' G9 r    temp_data=temp_data%10;      //取余运算  u5 W9 ?2 P$ L/ Y- L
    ge=temp_data+0x30;        , v+ K+ [7 C9 l& Q1 @9 z
}" I/ `8 A+ E. n) u

9 M/ r) Q6 \' c //显示x轴倾斜角,即x轴与垂线所成角度, S7 k8 x" ^; P, S4 z, u
void display_jd_x()
: g+ e) X  U6 J1 R) B% s{   
; j; H2 W- q0 Y    bit bj=0;//标记' m8 v  B: {+ z+ O" g+ [6 E
    int  dis_data_x,dis_data_z;  //x,y轴加速度的原始数据,用补码形式表示
$ Y! O" N3 y/ N' W, i5 I; n! {    float mg_x,mg_z;           //角度,加速度
8 F5 E+ Y( {  Z2 J    dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据   * D7 }& \: P( W0 I: j% f+ z
        dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据
7 _8 ]3 K) n7 O- H, N: F+ }! ~# |
5 @: f; z; U, k. [        if((dis_data_x<=0)&&(dis_data_z>0))          //第二象限2 W; _, `" h# k& P8 F; [& |. ~
        {% B! y! U8 R: u' t  p
            dis_data_x=-dis_data_x;7 R8 s( [0 U' ~$ m1 O/ P  I* F$ y2 {
                DisplayOneChar(8,0,' ');/ n$ c4 j3 ~, a$ H: i& {
        bj=1;
: p8 s' A1 l" H. M) Z        }9 g$ |5 R8 |. x/ _) `: ^7 L  K
        else if((dis_data_z<0)&&(dis_data_x>=0))         //第四象限  X' i2 }' _3 {
        {9 M& a& D3 I! m. E- e: \6 S- U; k
            dis_data_z=-dis_data_z;
" M* D9 f; x% h9 S0 P# J' s7 R" a        DisplayOneChar(8,0,'-');  //显示正负符号位
) j) ^: u9 M8 s4 i; g. Z3 t        }
6 ?# J( t! K8 h2 v        else if((dis_data_z<=0)&&(dis_data_x<0))           //第三象限
" X. h+ M* b" A+ u4 }0 R& H, j" {        {2 ~6 K2 s: Z- a6 p+ I8 W
            bj=1;
' r5 ]) C$ p8 y# x& L            dis_data_z=-dis_data_z;
6 q  @$ E7 @- m! {8 k- B% p' {5 o                dis_data_x=-dis_data_x;5 @9 P$ a8 o% v' M. f% N
        DisplayOneChar(8,0,'-');  //显示正负符号位
" a7 M; ~+ m1 Q7 {/ {1 E- R        }/ r. r! Z9 B6 q+ a2 k* ?- F
        else if((dis_data_z>=0)&&(dis_data_x>0))
! I1 ]& J/ X& {+ g6 U         DisplayOneChar(8,0,' ');                //第一象限
3 J, F1 I9 U7 i% Z* G
3 w) k8 K  O8 \5 f. I# Q* Y    mg_x=(float)dis_data_x*3.9;  //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)* P5 N- A/ f6 [- q3 C
        mg_z=(float)dis_data_z*3.9;         //强制类型转换,dis_data_z的类型和值不会发生改变. _2 m( c( {2 U- }: |

- g1 e3 M  Q& b        jd=atan2(mg_z,mg_x)*(180/3.14159);6 P  P" S) v, z. e1 G1 U
        if(bj==1)jd=180-jd;        
: h* n6 J7 t$ _+ Z7 D( K- H: W8 z          //jd=jd*10;  消除小数点,便于转换数据和显示
! E# `7 V6 _% _# Q# A2 d) y    conversion(jd*10);      //转换出显示需要的数据                                        //
2 @$ ?0 H' @0 Y* o& U! ^        DisplayOneChar(6,0,'X');. X3 d* W: n) V' n7 A3 G. n* d
        DisplayOneChar(7,0,':');   " L1 D' Q% P/ n; b
        DisplayOneChar(9,0,qian);
  A3 ?: B& r" Y) g4 G. _. D) \7 I    DisplayOneChar(10,0,bai);         
; h! e3 |6 s# P    DisplayOneChar(11,0,shi);
1 F8 R% L+ S0 Z: }) M* I) F; x% b    DisplayOneChar(12,0,'.');- W; M$ W1 E" [: p3 M" K2 Z. q
        DisplayOneChar(13,0,ge);) H* ~1 t5 w; i+ \+ n: C
        DisplayOneChar(14,0,0xdf);            //显示 °3 G4 O8 l3 Z) C/ z' i
        DisplayOneChar(15,0,' ');
2 r, b! u! o0 X3 }7 x- P}2 e, ~' t0 ]3 H1 |8 _; l0 D" \* j

0 {- w; B, U) q- W% u  `; C5 d6 t# ^void PCAinit()        //PCA模块初始化
# V+ M$ {5 [  i* u2 o4 I; F{
0 \  D, I: D/ i( [) j% w$ P     CCON=0;
6 g& Q1 H1 S% c! S( F) w) M- y         CL=0;
, `8 d; D/ u" ^: K; s+ r         CH=0;
, W% v4 M; q  u1 R         CMOD=0x00;        //sysclk/126 T/ ?! e9 T9 ?" K; e
         CCAPM0=0x42;//8位PWM,无中断* e( `; \& ^5 s8 R' l: z' M2 d
         CR=1;
5 s- o( q9 q% e) m+ }         CCAP0H=CCAP0L=256-240;
9 p' Y4 D+ [& a5 l. S. M}4 f% @0 I# z2 B0 m. }' w6 I
void init_t0()         //定时器0初始化
$ f( G2 h, V- a/ n6 N4 p{
2 I8 |4 Y& Q* t: ]7 ^0 n; Q    TUXR&=0x7f;         //12T
+ U: `8 p9 x  T        TMOD=0x01;  A8 Q# f& W6 @+ x$ N2 g/ T
        TH0=(65536-50000)/256;
+ J# A) l; `$ S" |( D        TL0=(65536-50000)%256;( Y* s3 Q- N" t% j
        TR0=1;# q/ k, U9 g0 s
        EA=1;$ [1 v9 @) h- V1 B; P6 Q0 T
        ET0=1;
- ?  j' r$ Z; {* M) k: \  n7 B1 e}) N/ n8 o, _8 Y; I, E
4 s( e( _- I3 z
//*********************************************************8 R8 @+ d: Y9 V8 C
//******主程序********
# {) [$ q- \- c# s//*********************************************************0 R) J. U9 _( f: u
void main()4 F7 r: m. u" Q. k6 K  [
{         
6 u) _# j; d6 h        char H;        3 D, |& t' \# H. B' _
        InitLcd();               //液晶初始化ADXL345+ r( |! O0 `0 i7 K' {- N$ O7 o8 U
        Delay5ms();* h1 U; K, l8 c+ @/ E. g& n
        Init_ADXL345();                 //初始化ADXL345
4 S0 r7 M$ v6 Z' c, A9 P        PCAinit();( Y% V0 h+ ?$ q, r; U
        init_t0();
8 \! J3 D! l6 ]5 a/ }0 P        H=CCAP0H;
7 ^1 j8 v  e# P) u3 J' ?' j5 x; {# Z% r7 p% L0 Z4 P
        while(1)
( S  Z' [0 k; c( F. ~' k4 l        {                                                                        
0 _! v" R% S4 s8 w0 U                if(p33==0)% ?  E2 s! }0 ^3 @) P4 k
                {         
0 h1 D+ M. `4 I- }* [. v' n                     Delay5ms();
8 f: a7 n2 t$ L: Z/ M& G) e/ b5 P6 ?                     if(p33==0)$ O9 V2 w; M$ K; {) q: i$ U! k# D
                     {
4 r+ V2 T2 X4 }- Q+ r% @                          H=H+5;
* Z1 S2 W/ Z" ~1 z                              if(H>255)H=255;
: @6 z) ^5 E% @: g0 [/ x                              CCAP0H=H;
) R0 n! F# v6 A  a                              CCAP0L=H;. N) K3 ~3 q+ v! t* p( W" h  s
                              while(p33==0);
$ Z5 |# N  N* \3 F6 f                      }
6 D. p) }( e9 ~4 n  J            }* |3 q% J5 W  ~4 t! g3 B
                if(p31==0)
4 `3 ~0 k1 x' U+ P# u                {         + J" E  A* L) o; U% J0 a
                     Delay5ms();3 r; c* j+ i7 U$ W
                     if(p31==0)
6 z7 o0 ?! k& r                         {
) Q" [* F% t" H( A4 K                            H=H-5;
7 X% i8 H; j+ Y- Q                                if(H<0)H=0;! U, U4 P' s7 ?* W& d
……………………
2 G' ~$ q- J2 S& p4 A+ a. S
* y( ^# Z6 k) Y…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………
0 j% ?6 G& C. _
' S  i2 l3 C! d& B. F
游客,如果您要查看本帖隐藏内容请回复
) z) n% B. X6 @) x" G

' e- B8 M/ H" T$ h7 z% {
* z# B( j/ D6 v. n; E

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 13:15 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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