|
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 |
|