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