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