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