|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ADXL345测倾斜角(程序)( X$ E) s, M" B- l1 N
3 b, E+ g+ f- ?; q单片机源程序如下: |
" m2 I; N' x0 t [' o; ?* |/ i
r8 k! R" N# J#include <REG51.H> * B4 d- F' J- R _- V5 @
#include <math.h> //Keil library
( I5 I$ c5 E- Q4 e, P#include <stdio.h> //Keil library # H& G+ w/ x" S7 u& O( [9 N! c' Y J
#include <INTRINS.H># n1 I/ ~; i, `4 Y
: } s: ?( U; o1 o& Y' w#define uchar unsigned char' s6 ~, ~0 h" F1 N- U* s/ V' j' ]
#define uint unsigned int
& L2 `; h. l( `2 A! s4 E#define DataPort P0 //LCD1602数据端口+ u1 w, x6 v& g! {" O4 I5 ^
' u L! u' g# A, O5 \$ g! i
sfr TUXR=0x8E;5 ~6 b( I* }+ _0 |$ I3 t
sfr CMOD=0xD9;
# a$ m9 Z) M3 m; k& f' Xsfr CCON=0xD8;# @6 ^$ H! Z' o, t8 ]
sfr CL=0xE9;
; w ]% ~7 Y5 osfr CH=0xF9;& C J9 D. D- A7 v# [
sfr CCAPM0=0xDA;. n6 |$ u; ~/ C5 x* K# w' R
sfr CCAPM1=0xDB;
4 U* [# Q2 w4 s- W# O/ d/ z& ysfr CCAP0L=0xEA;
2 N" n. X2 |$ {) [sfr CCAP0H=0xFA;
# f# o7 ?9 {, G$ a( r, qsfr CCAP1L=0xEB;2 M, r" h0 y; }+ c
sfr CCAP1H=0xFB;
& H& H& h( F! j( `; xsbit CR=CCON^6;
% L2 |( z+ M( m5 K! g, c6 `; q5 v4 g4 P* M
0 u. W4 _' O, p; B
sbit SCL=P2^0; //IIC时钟引脚定义0 {2 v; f p; d) D9 @9 c
sbit SDA=P2^1; //IIC数据引脚定义
9 m. O/ N2 O5 @sbit p22=P2^2;' h! \! H! k; s/ w+ j
sbit p31=P3^1;
" n& t9 M3 q# C' x2 Dsbit p33=P3^3;
q9 }2 x: x$ p8 q# W8 ]$ k0 tsbit LCM_RS=P2^6; //LCD1602命令端口 c: W. y9 |" \
sbit LCM_RW=P2^5; //LCD1602命令端口
; @2 y5 u- u. d3 e7 `, psbit LCM_EN=P2^7; //LCD1602命令端口
* L$ B6 ]$ q" i/ H, N" N
( P" c" `0 _' O#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
* b5 d6 h8 l) J' r //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
, p _& m- X5 s5 k5 qtypedef unsigned char BYTE;2 R" ]& h! }+ R. |& V
typedef unsigned short WORD;
6 G0 f% y s( ?8 _& C/ x
' e% \8 j: X! l; @BYTE BUF[8]; //接收数据缓存区 ! O7 ?4 |. T* f9 q# J
uchar ge,shi,bai,qian,wan; //显示变量 个十百千万
! T# p4 `+ M3 ~2 K, n" Dint dis_data; //变量9 e5 S" D' y6 j$ m: c; d9 [$ s
float jd;/ G; ?% }% J7 w2 ^' e# N
uint PWMH;+ m @/ u5 @$ [+ v- C
void InitLcd(); //初始化lcd1602
- [+ E0 ?* W( ?7 [. gvoid Init_ADXL345(void); //初始化ADXL345( x' r8 u$ v2 P3 M
- H4 v4 x7 p& m8 T% m+ _void WriteDataLCM(uchar dataW); // LCD1602相关函数
, v! X2 x& Q) x! F) }void WriteCommandLCM(uchar CMD,uchar Attribc); //
+ T. @5 |5 @" J( F" v) evoid DisplayOneChar(uchar X,uchar Y,uchar DData); //
" z2 d! G$ _- H( p( F+ R; ]void conversion(uint temp_data); //数据处理
L' F8 `! V% J; H, \% _
9 [# X) {# G/ |' [+ }void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据6 L% y% k! g0 |' F+ p. c
uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据
+ }" S' E' Y+ ]void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据
! a1 h3 e: V3 `. O# q6 x9 k//------------------------------------1 k! A: ^# ~, X; l2 ]
void Delay5us();
: f( {7 f1 f! \5 s# P, u6 A* }void Delay5ms();
8 x2 B& V+ g/ p. l# [; d: {3 [& Pvoid ADXL345_Start(); //与iic有关函数
1 T5 b( c7 J$ v# h% y0 Lvoid ADXL345_Stop();
* H/ k8 r* g" z8 ]9 h& [void ADXL345_SendACK(bit ack); //传送应答
) |4 k- J& W, r% ]% _! Qbit ADXL345_RecvACK(); //接收应答* D g& r3 h( h$ c) |/ z
void ADXL345_SendByte(BYTE dat);
5 d* `" \8 c) w3 Z3 Q( [6 UBYTE ADXL345_RecvByte();! ^, m$ d$ u( t. H9 C
void ADXL345_ReadPage();: |5 ^" V* E* A r" T3 o, S
void ADXL345_WritePage();
# G+ F7 e/ X, j4 ?$ t( V {. H: T& `. J$ E1 ~8 V
/*******************************/
# S U2 F' p) \+ B6 d2 Mvoid WaitForEnable(void)
* C5 e0 @3 q# t0 z+ B5 l; N' w- Z) o{ / E6 F! z, b- T3 q" E1 D+ p
DataPort=0xff; : T. p7 R, [" C6 ]/ g. r
LCM_RS=0;
% x, X: H2 p# z- K LCM_RW=1;
; x& d; ?( {8 D( J" l# A- j! b _nop_(); _nop_();
9 ~2 P9 G% w& m8 p% }- L9 A7 | LCM_EN=1;! h+ j+ o/ _9 ]
_nop_();_nop_(); _nop_();_nop_();
* u( Q. U- c N: a$ S2 N while(DataPort&0x80); , {2 _1 d0 }! x* q: E3 I
LCM_EN=0;
& c' I- b9 x- C2 [}
7 e; C* S1 _8 u; v/ W |) j/*******************************/
3 J7 Y- O' _* E( g1 {4 [8 zvoid WriteCommandLCM(uchar CMD,uchar Attribc)
5 E9 r Q% s. b{ % c( H7 d: c) p- b+ _8 V
if(Attribc)7 R2 j! v3 g& N3 v7 S/ J
WaitForEnable();
# q e7 W3 d2 x/ j LCM_RS=0;: G% ?, ^5 r0 O. C2 j
LCM_RW=0;' ]: w% e+ A6 w s# U
_nop_();_nop_();1 J7 o8 X+ k' F- k, @4 ^# E
DataPort=CMD;
4 H. m( W8 M3 p0 N% L/ P7 q _nop_();_nop_();
2 v1 y. @! `4 R- F% y: e LCM_EN=1;
- E% S3 g$ i- I' H6 g/ b5 p nop_();_nop_();nop_();_nop_();
" @" }% T1 v5 j) J0 {" ]. t6 ] \ LCM_EN=0;4 Z3 n$ n; E# E p: S% C
}
. E& g# B1 H1 T1 g' Y+ ~/*******************************/% Q% b# s. B3 p/ h; s7 M
void WriteDataLCM(uchar dataW)1 B0 P; w) [9 H$ z4 F8 g' D
{
& d1 Q$ Z) b. o0 c# {2 k# a WaitForEnable(); ( C" k) f5 `( n# ^ [$ n: q( E1 V
LCM_RS=1;LCM_RW=0;0 z [3 O I$ t! e/ C( [
_nop_();_nop_();" S9 M$ i5 e/ r) b; p# D
DataPort=dataW;_nop_();
6 \ }; F6 t' B LCM_EN=1;
6 g5 g' F; D! l) Y! T _nop_();_nop_();_nop_();_nop_(); g& L/ [, j5 h/ n- [8 {& @
LCM_EN=0;
- Z% x% K) _, G. W' _}
/ ]7 S* j& f7 _; w( P/***********************************/ A+ F" E, ^1 [
void InitLcd()
4 U: i6 R e; b{ + \7 D; b2 X- m9 E* X, t- e' ~
WriteCommandLCM(0x38,1); ) V; U* r8 G+ g d* J" y% M
WriteCommandLCM(0x08,1);
( W1 z8 ~2 |% u6 r WriteCommandLCM(0x01,1);
; M' h9 D1 R( S9 ^$ P; j3 B WriteCommandLCM(0x06,1);
# u2 [1 T: _( ?; i( W' x+ J+ J WriteCommandLCM(0x0c,1); ]( V& s! R U/ I2 Y/ o/ B/ K
} ( B2 R. X' Z7 {5 Y
/***********************************/# V: p: l" [6 A, W
void DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
& z0 d3 Z+ c2 V3 d{ , T/ Y% ^ N) }3 M | O
Y&=0x01; ) m$ g0 Z' v) J
X&=0x0f;
; _- h9 D! ~, }9 _ if(Y), A" |/ u% q7 Z& {8 u% [( k
X|=0x40; //8+4=c
0 \5 {1 V) ]9 w3 P& V
* p) k" a, d A7 ?# f a X|=0x80; ; K( ?- w! h% p9 c, l q
WriteCommandLCM(X,1); ! `2 p* r# k: f, x$ b7 J: `
WriteDataLCM(DData);
" S0 O* v% x6 d7 ?* I}
/ O9 D- {( K2 z: G6 o9 k
; J1 J' m( N2 x& j" I/ H* X8 ?) F+ A' w2 p
void Delay5us() //@12.000MHz/ i3 M# s! u3 e5 z! m* O- c
{) C' F7 N/ b! B3 w5 I
unsigned char i;. a8 V) M5 [, [/ S; Y
: z! _" t, q. D4 U; |! p4 C/ K i = 12;( H0 j& I9 H2 M! U5 n
while (--i);8 T% C3 ]7 {) m! V, N* E/ j! W4 a
}
5 T5 g- M- C# h/ {7 ^' I3 \/ c( C
0 D+ N! _; |1 }' e0 G' \5 W
void Delay5ms() //@12.000MHz G9 v; v: a5 G: z V v( H" F
{1 q6 c& l% X* o1 Y7 o, I
unsigned char i, j;3 V" N# M( |, [8 r1 T) R
`/ R0 ]7 B+ @! f3 Z/ F
_nop_();
6 O8 W. m) n# ?( P, c _nop_();! D! t6 p7 Y6 T/ v" @' c8 m4 O( b
i = 59;2 w1 w' X' ]% ?% c6 t
j = 89;
: I1 |. v+ e2 ~; e) R& f do( y4 O$ `0 W" z7 B8 Q* ?. A' |4 z
{
2 @: C" a X# y( L3 C5 G while (--j);
" O) F3 b2 ?& {3 o' m( { } while (--i);& r8 K' Z. k/ \1 |) x/ C
}
9 X3 s9 J. \/ n/ P2 z1 E( `
( e- _5 F8 g9 i3 e4 D. E4 J& F, r7 c! |8 P' [) \( |
/**************************************
3 Y3 n3 B3 ~/ i& I- R; n起始信号7 ^! c9 v5 v8 ]. k
**************************************/$ ]5 `. S9 ]$ I8 j- s- c! \
void ADXL345_Start()% n J' c7 `( o" N9 ~# }
{1 x& i7 D, s8 I m
SDA = 1; //拉高数据线
9 V" f8 t* S0 X" R0 L' U/ Q5 p/ f# F SCL = 1; //拉高时钟线
2 {# D& Q4 O0 I9 P, G5 q Delay5us(); //延时
0 K: k; K+ A+ ] SDA = 0; //产生下降沿. f+ Z8 v1 A& A. |' i% n
Delay5us(); //延时
* l/ j' _4 K) [% q SCL = 0; //拉低时钟线
6 O: T+ @9 p7 u}3 ~0 e; K0 t% `5 @ D* F+ x
) U' `& i4 P# E$ k, \5 o3 L) E8 t. L/**************************************5 B9 e. b3 k: E# J5 K8 {; _
停止信号
. H- B& q; b& O7 z**************************************/( f, w* ~4 x) O) v' Z+ O; w1 h+ d* W
void ADXL345_Stop()
2 c4 d3 {. \& r# z{
/ c# x( a1 d) m4 \9 W, w+ ?" ^ SDA = 0; //拉低数据线
- O1 B, [8 v. r3 T3 v% Z SCL = 1; //拉高时钟线
2 m) K6 P, Z, J& u1 K `" R' L Delay5us(); //延时4 _9 Y g: m+ a3 I, x
SDA = 1; //产生上升沿
) B8 ?$ ]4 z# z* y/ t Delay5us(); //延时0 I% \, P7 o- P/ D* A
}
9 q1 X8 @+ l) J" G7 g( y; I; Z" A- p) z, @7 I2 I! O0 o/ \' |) C
/**************************************
# _' ?) o, j9 L; L发送应答信号, ?# z& a" @9 Q5 G6 t6 D
入口参数:ack (0:ACK 1:NAK)- W) Q3 V1 |: V, V2 ]1 i7 _. u+ I
**************************************/" k7 {$ ]. k4 o/ X' `. [/ M K
void ADXL345_SendACK(bit ack)& n0 n: z4 j( ]' @( n1 g1 j% `
{
" B& g& X3 b9 [ K- w' H SDA = ack; //写应答信号+ k8 I5 a _) r. f
SCL = 1; //拉高时钟线9 o/ @" ~# i6 S" F1 N
Delay5us(); //延时
* s0 B& J0 E4 o9 _2 @* o9 B/ X SCL = 0; //拉低时钟线9 r! l) ?, v& E2 u
Delay5us(); //延时
& q9 |; p7 F$ i}
) n9 f- A1 y; [9 c' u. ?* ]8 Z I0 Z) C5 ]0 I
/**************************************& ]5 z9 u8 f! t* [$ K4 j( Z, m
接收应答信号& ^# N" k2 Q3 {4 P- U
**************************************/
# i) c# m4 y2 h. u: j, d+ _bit ADXL345_RecvACK()
# V( Z/ P8 m; l$ A, n9 g{( z0 ^ _9 R/ q$ R1 Z1 Z
SCL = 1; //拉高时钟线1 S- `$ q* `5 l$ n' ]+ ^4 q, O2 i
Delay5us(); //延时4 c3 a) V+ T$ a$ ~: f/ y
CY = SDA; //读应答信号
* W i7 a1 I8 A SCL = 0; //拉低时钟线8 u+ y/ z7 G# O# p7 z
Delay5us(); //延时5 S. a! s3 m, o% ~4 l# `* w. q$ f
V; n1 K- N A/ _; m return CY;
1 |/ \ ] w. d}
7 z2 o/ m% l5 Q
: D5 |. A* g) A0 J* u1 g& {% v9 z/**************************************
( z" {% G6 |* S5 q+ T7 X向IIC总线发送一个字节数据) H5 V& C' T! X7 a
**************************************/
& W6 T3 R# `6 N* s6 i; l+ gvoid ADXL345_SendByte(BYTE dat)' V v. Q2 R6 J
{* Q L" ~4 H' f, ?" I- [# [
BYTE i;' v3 X' w% j$ I, M- y$ v) `& R
$ K/ N, V3 i$ h1 B& [3 q
for (i=0; i<8; i++) //8位计数器
1 y, k) t. p* X" T8 ^) i {6 m5 }$ F; r( D, R; X8 K
dat <<= 1; //移出数据的最高位
3 ~: L2 ?# W: ?( I4 Z2 {' Q SDA = CY; //送数据口
4 R- W& N8 w! n( g SCL = 1; //拉高时钟线! O! _: A* V8 [0 _1 e) M# B
Delay5us(); //延时, q; f( [1 w0 V0 y8 t
SCL = 0; //拉低时钟线
: L% C% L5 o: a$ G' N Delay5us(); //延时" t }# s% D# \2 V' }5 A3 g% e
}& U s2 p& w5 C* L
ADXL345_RecvACK();. ?8 p7 J5 j! @
}
9 x& ~ M& b/ e) X
# O' A$ ?' _) v' k* I4 s; s/**************************************
" A$ N; _( b# j r+ J从IIC总线接收一个字节数据
6 v8 U0 Y `& X5 @5 {+ W1 p**************************************/9 ]- O' g5 u( J0 Z! u. J' K( q
BYTE ADXL345_RecvByte()
6 D$ l; J4 i2 ~. h4 Q& F{5 G6 s8 h" r3 @' B3 I9 b9 [
BYTE i;
6 P" U, B+ e5 E& V+ p BYTE dat = 0;) n% N Y# ~7 c
SDA = 1; //使能内部上拉,准备读取数据,
7 B) h' o$ A- T. Z; Q for (i=0; i<8; i++) //8位计数器
7 Y) }" J9 d9 P3 i' M0 u {2 n# v" a# G- O; d& I9 o# Y" M1 i
dat <<= 1;
' w' G. ?- J. a) [4 h SCL = 1; //拉高时钟线
# s* c( b: N$ O3 Q& H8 y Delay5us(); //延时
4 [) F1 R% L' G. P% D9 U dat |= SDA; //读数据
8 P1 a3 H% S: L6 F0 i SCL = 0; //拉低时钟线# f3 z& A) C }! V. ?
Delay5us(); //延时9 V" E% [8 m% o0 x
}
$ l# _' |' f- V/ s. {; u return dat;
6 K' l+ k5 P9 j+ l/ u}
$ s6 R1 B3 c0 A4 Q1 I2 h# C- _) u( q* _5 ~- g; @
//******单字节写入*******************************************9 S" r$ I* W' X" ~/ K
//用于ADXL345初始化. M9 E( e3 t; ^! j. e
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
* g! ~$ D5 X% k% R" O, s6 |{
+ W9 O! a8 y( B ADXL345_Start(); //起始信号
* r4 \ d$ j: m, W3 ~% Y) C/ i ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
7 U% X% _7 }1 w) p ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
+ }, x& n# U3 R; Q ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
1 |9 S% N6 e B( @3 d# ^ //相当于 向相应的地址写入命令字
# k7 L& V2 X7 }# p ADXL345_Stop(); //发送停止信号
3 F% I/ ~+ h+ C, w3 B6 ~}
$ B" ]0 @$ B l8 \7 [9 V; V1 h" ^/ f" r. Y
//********单字节读取*****************************************
$ Y8 z% n- \0 ?uchar Single_Read_ADXL345(uchar REG_Address), H4 ^" } {! c9 ^5 ?% O
{
* H N! I/ `1 Y* r2 \ uchar REG_data;
. j% H& ]" a5 J+ B$ Q/ a ADXL345_Start(); //起始信号
$ L: s6 {3 i B3 C6 ^( }- v ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号,//0xA6写入
) U4 d2 u% F: O3 d; W6 j9 S ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始
) K! h0 i. Q; K( S ADXL345_Start(); //起始信号8 G4 k6 w. v) ?/ |
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号,//0xA7读取
# x* L$ p |" G7 D0 O REG_data=ADXL345_RecvByte(); //读出寄存器数据9 ^9 H$ Z4 q0 Q- n4 q4 n
ADXL345_SendACK(1); 1 ~9 `9 ?' ^% I: _
ADXL345_Stop(); //停止信号
5 a: H0 Y1 p0 `1 X% e& d2 z return REG_data; + _7 H" ^5 E; i8 G) W
}6 I- a5 B# M( X1 ]; W
//*********************************************************
) ~, H4 X S: c# ~# W& E//
0 D/ u- D/ ^6 X# u, u2 u//连续读出ADXL345内部加速度数据,地址范围0x32~0x37: d6 g8 ^' D7 h. j
//
% O9 t; h7 m2 ~- @; k2 U% `! a//*********************************************************1 ?5 L! g5 g% K' b( }- b
void Multiple_read_ADXL345(void), d% V- D, B1 z. u. A) _
{ 3 V& F9 f2 P$ j" e! n C- z8 |
uchar i;1 M, N0 P" o# C
ADXL345_Start(); //起始信号- V2 j& M- k. F7 s6 E, W) C
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号 |5 E3 b" E/ E! i. N
ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始 b1 L- A: J! T- u+ S
ADXL345_Start(); //起始信号& k1 x* X1 u2 y {% P! I
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号! U% y( T O+ ?$ b/ X
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF8 U( C* l; C6 T, K7 K
{; l' Y/ C) T" }" l1 M2 I
BUF = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据
6 v Q- Q3 U+ d- @9 n: g$ A' ^: Z" e if (i == 5)1 @. L+ M& q- q+ ]: f6 }
{% W9 `; `( n) C2 V- H1 g
ADXL345_SendACK(1); //最后一个数据需要回NOACK
7 Z& ]# d- ]8 ] q/ s# y2 R }
0 C: S- G& _) s else/ P8 C- U7 z) i& Y. c. @
{
+ x. X1 j8 i( K; v+ ^8 T ADXL345_SendACK(0); //回应ACK5 O% j; `9 _! H8 b: z; c" y# J
}
/ R; x7 _& U3 }+ k: e B }
4 {& y2 Y/ Q1 b t/ G @ ADXL345_Stop(); //停止信号
+ ^4 @; q- A! c3 u Delay5ms();* b7 q2 }' W% W1 F: P8 q3 t7 a
}
, _' y0 `6 v, X) l! ]; t
8 y1 y* U! w/ w/ f8 H' Q//*****************************************************************: ?/ T1 H: Z) r6 @8 u- T( L
8 P' E9 R0 e- X; o2 P4 v//初始化ADXL345,根据需要请参考pdf进行修改************************0 b$ T; ?* M( r( h! u) T# T
void Init_ADXL345()
# J' n# f6 X3 s& n: T{; v! p% C: B' ]: Y
Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式, }# ]3 z; D4 u% x0 P3 {! y% h1 Z# v
Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页9 M. K1 F+ Q6 F# x" a @5 O' d
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页
0 W' j) F- y8 p! F% m6 m Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断
' m, ]5 l4 E( ~5 k! ] Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量+ T5 m- x4 A1 J; \/ a
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入,pdf29页) A/ W, _+ T% s* K( M
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入,pdf29页
* _1 z* K5 A: W! C$ r}
8 F1 Z% r% P: t, Z
4 z' M4 L- c6 S! g1 ~7 _# d //*********************************************************
$ E1 E5 K! j, G& B0 [0 p8 h% Nvoid conversion(uint temp_data)
% k) S) T+ z; T' M1 {3 c{
1 L) F, z6 V' k' k- M wan=temp_data/10000+0x30 ; //0x30='0'
0 k' [: B C2 v R+ ~ temp_data=temp_data%10000; //取余运算3 |8 A* ]3 I# K5 ?+ p1 U) h. R
qian=temp_data/1000+0x30 ;1 O% K" [1 n2 T, ]4 V
temp_data=temp_data%1000; //取余运算
) F% \2 T) S/ {+ E0 q bai=temp_data/100+0x30 ;. J4 c. S) f3 X9 g. X
temp_data=temp_data%100; //取余运算8 j3 g4 R4 s; }9 G3 ^: @
shi=temp_data/10+0x30 ;
8 _: c- j$ |& H' I* Z# o temp_data=temp_data%10; //取余运算
% Z* ~( l: @1 ]# x, Y' g ge=temp_data+0x30; ( g. t r/ p6 l: f8 o, x6 I
}# R9 G* {* j3 H# [: D9 Q3 S3 ]# O* n
2 N1 v! `4 q) F //显示x轴倾斜角,即x轴与垂线所成角度8 S' D5 U) S6 G& {, @
void display_jd_x(): y/ Y: J- D4 A) _) A5 D0 B/ y4 z
{
+ Z1 |7 Y# q" b" z" G/ c. W bit bj=0;//标记. W5 h% p" n$ H' D; j
int dis_data_x,dis_data_z; //x,y轴加速度的原始数据,用补码形式表示) P/ R* g9 t. T
float mg_x,mg_z; //角度,加速度/ P6 i9 Z4 S4 z& a; B
dis_data_x=(BUF[1]<<8)+BUF[0]; //合成数据
S# A, `7 ^9 g5 C dis_data_z=(BUF[5]<<8)+BUF[4]; //合成数据 L4 z) U6 K3 d' k& g+ i, u& Y
: f- ?0 k0 {( l8 _ `: a if((dis_data_x<=0)&&(dis_data_z>0)) //第二象限/ Y$ W9 W6 ~& M% P3 B
{- O" r: l E# R5 ^. }7 r0 ]; G
dis_data_x=-dis_data_x;
: o3 s! s! G/ }9 {2 q1 V DisplayOneChar(8,0,' ');9 o: j0 S6 h) F; l5 B" D- v0 b
bj=1;
5 O9 _' I; v" k2 Q- y) i }4 w' o/ _. |. u% V/ F1 P
else if((dis_data_z<0)&&(dis_data_x>=0)) //第四象限
" A4 m, ]3 C' c$ u$ R {
$ _3 b8 d0 j- a dis_data_z=-dis_data_z;2 J! U) h& ^/ ]; \7 j
DisplayOneChar(8,0,'-'); //显示正负符号位
( I9 m A8 }3 s; F" }4 ]2 B }
) ]8 u* d9 d$ j0 O6 V1 y else if((dis_data_z<=0)&&(dis_data_x<0)) //第三象限 ^0 f# s& Y& W7 s8 f" l( q! [
{ G5 d( D2 |( N6 f. m$ \
bj=1;9 l$ u0 z) |* i+ o3 D
dis_data_z=-dis_data_z;$ c7 e7 Z ~! _3 c0 h' x1 P* {3 n
dis_data_x=-dis_data_x;# Q/ W) R6 W. _, G4 i& ^4 a
DisplayOneChar(8,0,'-'); //显示正负符号位- N$ g5 X$ p* a5 R5 g: p
}
! f2 y# P6 J8 q' f' g8 m/ N: Y7 g* W5 W. c else if((dis_data_z>=0)&&(dis_data_x>0))$ _* G1 {. A8 `/ Y" c K# u, L
DisplayOneChar(8,0,' '); //第一象限
( O7 i ^0 g- D5 `. T; J1 N- W; f0 f
! E1 d9 ^ G O, B! X! ]2 { mg_x=(float)dis_data_x*3.9; //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
4 H6 l ~3 M' g% W/ ^ mg_z=(float)dis_data_z*3.9; //强制类型转换,dis_data_z的类型和值不会发生改变
$ w- t5 d3 y. Q) R6 H' F2 |) V. N9 e4 T/ b+ }! c
jd=atan2(mg_z,mg_x)*(180/3.14159);% M5 n R% h# ~& {
if(bj==1)jd=180-jd; $ c( A% ^0 Q' l' u/ t# I' S& h
//jd=jd*10; 消除小数点,便于转换数据和显示
; D4 P7 Q+ w/ k8 h conversion(jd*10); //转换出显示需要的数据 // & L# E, y/ o! J" C
DisplayOneChar(6,0,'X');
. `6 H$ L, s( ]. ]6 q DisplayOneChar(7,0,':');
$ v& \* q# Z6 b# i& T DisplayOneChar(9,0,qian);, d& R* M% A0 B& n/ i
DisplayOneChar(10,0,bai);
2 a; P9 F- n& b! d! {- ] DisplayOneChar(11,0,shi);
2 W4 }4 `4 |0 a1 }8 ~% O. ^/ ] DisplayOneChar(12,0,'.');& v$ ^7 o2 E: g# N
DisplayOneChar(13,0,ge);
9 ?! z; M1 ]3 A6 W DisplayOneChar(14,0,0xdf); //显示 °
. C0 F2 t8 V1 B4 c. g DisplayOneChar(15,0,' ');: B- d) n. A. j1 s5 G# V) O9 H4 p
}
8 n! e& j+ g- j7 a( R M9 b, z, [. J% e+ C, D, G, t
void PCAinit() //PCA模块初始化, p9 i! D1 S. u( p' k
{8 `$ Z" `) K K, X
CCON=0;7 a, G5 R, M# T! a
CL=0;1 ^& b4 C8 H. b. t
CH=0;
2 F& ~( ?+ o3 |$ [5 N- P CMOD=0x00; //sysclk/12
6 U9 q, T' n: _) ^ CCAPM0=0x42;//8位PWM,无中断/ R6 d$ {& Y* Y* u. y% a
CR=1;
; ~5 R; L( J7 _$ S CCAP0H=CCAP0L=256-240;
9 N7 Q7 f! o$ f& m2 p}
, i4 A- ^3 \, m2 c) L4 Rvoid init_t0() //定时器0初始化0 S- @9 b+ L0 m
{7 C1 T5 f1 M% t" m
TUXR&=0x7f; //12T
! l+ Z- E- E9 F' ^* `5 b2 ~ TMOD=0x01;
/ `9 t$ k' q) G( _9 f3 k5 Q: q TH0=(65536-50000)/256;
0 O! v' ?9 Q/ h1 P: L; {" { Z: J TL0=(65536-50000)%256;
2 t) v6 k# a) s$ Z TR0=1;0 a5 `0 ^: H) N* V( W; ?% o
EA=1;
' J) ?" d$ X, T ET0=1;
1 O* m; l, J; v r}
7 @- g& _9 V8 ?1 j
' m S5 S. B0 w4 b//*********************************************************
* p3 l$ v* b: [6 \7 i7 b* Y//******主程序********
c1 f" I% v6 f7 O//*********************************************************
: c9 L' n6 |* P; x$ e; dvoid main()
; J8 j3 u' q; W, C& ^0 u r{
, X3 s. _ {! b: p! a D3 b char H;
6 ]# M/ O8 m0 |* d2 g- s- o% I5 ] InitLcd(); //液晶初始化ADXL345+ K+ [" `# H9 y) q3 w
Delay5ms();
+ j- l: q9 ^ L1 r; l; q5 ? Init_ADXL345(); //初始化ADXL345
H% T; z8 b) k PCAinit();
: s% U& s0 S& o init_t0();
. t: W4 L3 y. j! W H=CCAP0H;
% v0 d/ x" }. x( C2 B; d8 \' H" a7 \* ~. E& S6 X9 G5 D
while(1)" W+ w: e& H. x( A9 g
{ / ], j4 I( O, s
if(p33==0)
( a6 | z* c7 X! J { 6 y0 ~1 R5 f4 V
Delay5ms();
+ O6 D( s! `9 o5 J: R& f if(p33==0)( s' M2 D) Y( q
{, e k7 [" W5 @! t" o) H# |8 B m
H=H+5;
7 t6 n3 T8 P; e, Y' s: L2 k: t if(H>255)H=255;
8 l6 ?; [( F% G# i: e" A# Q [ CCAP0H=H;
- t' t' c& x& \ CCAP0L=H;* x3 x2 Q9 x( t3 {: ]9 L& x" l
while(p33==0);& \8 H8 @8 z3 P5 F f0 @
}! ]+ y/ \6 t. Y( q
}. x2 n4 T2 ?8 R( p( c; z; B
if(p31==0)' a+ s/ e: ]5 q @$ t, w
{ X V* G7 S: Y! Q! r
Delay5ms();4 Y9 ^2 U/ G& |6 s& j3 l
if(p31==0)& I0 S* S6 o. P! H8 o
{9 q4 ~! v! p1 M7 A
H=H-5;
8 Z4 n& ~ h5 q1 X. K* L) u if(H<0)H=0;3 J H& s- X: U6 V; H
……………………! ^1 X, F5 A( M, _( l
3 c+ B# ?3 j3 G; n! C
…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………
$ i' g2 z1 E- ~2 V* V
: v4 V9 l+ m8 g5 z/ c0 Z- i
) ?6 ~0 o! I7 K# s+ i
! ~9 b$ g# d, m. ?/ Z; J# H1 M( `& A# P
|
|