|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ADXL345测倾斜角(程序)$ G+ P5 Q% ^3 l% V& m
. l* u R$ p! O% M) ]单片机源程序如下: | ?- Y2 H b% j" m! Q+ w. E& h
1 M% Z% U! s* d#include <REG51.H>
) `; R% T. L* X3 D( l#include <math.h> //Keil library
0 s }1 g; }, g4 a/ i+ Q, x#include <stdio.h> //Keil library 3 k; b5 Z9 b$ }5 J t. B# K
#include <INTRINS.H>
% ~& W' {$ S# [! p2 _6 t
o x7 [- R; V7 K+ `: ]/ @1 l#define uchar unsigned char
$ N* k% j" w% ^#define uint unsigned int
5 f: n9 T$ r3 Q8 E. U#define DataPort P0 //LCD1602数据端口
6 R7 [& u1 I6 ^ U( ~& h+ h. P+ c; v3 A* O4 J6 T# d( r
sfr TUXR=0x8E;/ g6 Y* c0 X J5 C" n$ W0 s! O8 h* y
sfr CMOD=0xD9;
# K% n7 E! ], s; [; _: P$ Rsfr CCON=0xD8;% c5 k8 m6 }. g. O1 k$ Q
sfr CL=0xE9;: Z6 T. a- U( _/ ? i
sfr CH=0xF9;
4 g- ^6 r: _8 q3 h1 D) k, Usfr CCAPM0=0xDA;
7 }; h* z! M7 K: p" jsfr CCAPM1=0xDB;
" P; t& q5 {, R0 w5 Usfr CCAP0L=0xEA;# C1 G: ]. S1 e8 p8 a
sfr CCAP0H=0xFA;
8 K7 R2 x( o/ a7 hsfr CCAP1L=0xEB;- y4 f ?3 c1 [
sfr CCAP1H=0xFB;7 l; X+ A/ l- n$ R8 k
sbit CR=CCON^6;/ j) Y; f: A+ r# x* B% h
: b' y* h" E- F4 ?. v* [5 e2 W/ u9 T3 _
sbit SCL=P2^0; //IIC时钟引脚定义
5 K8 K7 s# B& W S( Xsbit SDA=P2^1; //IIC数据引脚定义
4 R( H, g O \+ W6 q; m/ usbit p22=P2^2;
$ k' q9 k; b1 K U) [6 [+ ]sbit p31=P3^1;4 o4 S6 Y9 \! C- O- v
sbit p33=P3^3;$ ?; c U# G' \# `9 {7 I9 I- _
sbit LCM_RS=P2^6; //LCD1602命令端口 ( g/ B( a% l- M- W7 k; }& {
sbit LCM_RW=P2^5; //LCD1602命令端口 % C. ?/ m4 _$ u1 Q# ^% I6 d$ ]
sbit LCM_EN=P2^7; //LCD1602命令端口
8 O/ y5 d3 q. X; J r
$ T7 Q0 `" i" n6 s7 P+ ^: a#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
% O0 T f* u3 Z$ w- R //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A! I8 t& \6 @# B' o; d
typedef unsigned char BYTE;0 g6 O2 ~$ Q4 n" F* g
typedef unsigned short WORD;8 _2 {- v, V) V$ D; X
5 M( D0 o2 B T. [( I
BYTE BUF[8]; //接收数据缓存区 5 O- v1 x+ x, x, d
uchar ge,shi,bai,qian,wan; //显示变量 个十百千万! J9 Z: U# z [, k. z" c' F
int dis_data; //变量% O8 [# p! g9 [1 _! t' p
float jd;5 L9 `5 i1 L! p4 b T
uint PWMH;
. U N3 j6 T8 {0 d# E5 A$ ~void InitLcd(); //初始化lcd16026 A2 y% z, E8 p$ O4 {. k# c
void Init_ADXL345(void); //初始化ADXL345
$ I2 X2 S9 E3 H: @& I- G8 W" x! w
) w7 @- E' `8 J) [! p2 vvoid WriteDataLCM(uchar dataW); // LCD1602相关函数" d* P( o$ S* q: I2 }
void WriteCommandLCM(uchar CMD,uchar Attribc); /// v! y4 L% b, L5 k% l+ P
void DisplayOneChar(uchar X,uchar Y,uchar DData); //
4 z1 K, V/ n# Q2 Y$ [void conversion(uint temp_data); //数据处理
# r7 Y3 j3 ^4 j8 @6 }: c" W) \! j. p5 h( w3 ~
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据
# D' z* u3 M0 S8 B- ?8 |uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据) _! \0 `) B# A7 U8 p+ P
void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据) W* `/ b) x" F8 c7 j
//------------------------------------5 m- T, q2 N2 X* \+ e/ ~
void Delay5us();
+ B: J* B. u- p, d# [0 kvoid Delay5ms();6 d+ \' R/ s$ t4 S0 Y% T
void ADXL345_Start(); //与iic有关函数
" u# i: R) V% F: S4 `2 p/ Qvoid ADXL345_Stop();# v/ e/ ]/ w' K
void ADXL345_SendACK(bit ack); //传送应答
9 U) ^9 @6 ^& R8 M) @bit ADXL345_RecvACK(); //接收应答4 ?' w5 J' l' {0 i
void ADXL345_SendByte(BYTE dat);
" h5 D2 L/ k; Z7 w4 c; k6 E; R3 O) w# nBYTE ADXL345_RecvByte();
( b5 w* E6 W0 a" l! K/ Avoid ADXL345_ReadPage();
1 R0 x. ^3 A, y8 L/ X9 \ k. p: G( vvoid ADXL345_WritePage();4 t: r) p* {% T. U
( _- s# B: Y9 h Z0 _8 Z- G, a/*******************************/) N+ [0 I( i: E t; j
void WaitForEnable(void) " C, U* ^3 @8 D2 L/ h
{
/ r. h0 l2 W, w7 W$ q0 K: P DataPort=0xff; 7 y* \* D; P2 Y9 ?* L! t
LCM_RS=0;
% `! T; ^+ u+ Y( ^! z, ? LCM_RW=1;
" x! J, t) m+ s1 c% _: Y6 l _nop_(); _nop_();
5 K2 c4 D0 O# R' q( g LCM_EN=1;
& t6 e# u; M7 k: q4 G7 M _nop_();_nop_(); _nop_();_nop_();
. ^6 o4 ^, l) i0 K8 v) P C3 z* |8 M while(DataPort&0x80);
; M$ g. H; e; U8 f+ P# C$ N8 @ LCM_EN=0; ; W$ t0 G x& F& \# `" q G# _
} : F2 [3 c$ r9 j
/*******************************/
G3 B9 m6 q. _* g, Y9 i0 Nvoid WriteCommandLCM(uchar CMD,uchar Attribc)+ v. I+ x7 M; j# S& I( C
{
$ r: P5 I! [9 T1 Z4 X if(Attribc)5 g' j1 L" Y, j' A4 x" o
WaitForEnable();
. j! t% L, R. x8 K8 G6 p LCM_RS=0;; F e+ h6 f/ h/ R8 f+ a* ~4 s9 O
LCM_RW=0;
) u( ~0 r2 m) N+ U6 z/ u _nop_();_nop_();
8 e' k3 K6 o, o! r5 X0 Q DataPort=CMD;
7 X' V* i& k q _nop_();_nop_();
- I3 e0 n. _9 C4 L LCM_EN=1;0 a/ Q! n2 N0 Z+ A' k$ q
nop_();_nop_();nop_();_nop_();& Z& Q* p1 M: k5 I
LCM_EN=0;; x0 _: R' Q0 S9 m
}
. ?# {4 B/ z! c! T# [ R/*******************************/
( C" D% e8 z! T, J! @4 w/ t1 J; M# ^void WriteDataLCM(uchar dataW)& P4 K+ K p# M5 Y
{
2 L. [. b1 c# O WaitForEnable(); 2 ^3 y8 c$ [5 }/ C5 n
LCM_RS=1;LCM_RW=0;$ a: g0 q0 b2 b6 I; J
_nop_();_nop_();
! r2 F! q4 |- ]" G3 x6 E DataPort=dataW;_nop_(); / g2 ^; f$ R3 S2 Y. @3 l J. r! y
LCM_EN=1;
6 r0 i4 W$ e& U. J. J _nop_();_nop_();_nop_();_nop_();4 D7 H/ Z- e8 _+ }* d/ B, X
LCM_EN=0;
: r+ ?; ^( D; I} % H" ?0 u; [$ o3 a% I2 b
/***********************************/
" I! C' d' ~5 K1 J& evoid InitLcd() 3 N* ^/ I* @5 \) t) X
{ ' j7 z" A4 F9 U! b
WriteCommandLCM(0x38,1);
: K# q9 }1 \% \6 X1 B6 p WriteCommandLCM(0x08,1);
' F# Z ^1 N: B" ~ WriteCommandLCM(0x01,1);
# T6 ^1 ^+ M& E [7 m- B3 Q5 m WriteCommandLCM(0x06,1);9 t g2 \( J% y8 A# S5 k
WriteCommandLCM(0x0c,1);% D+ a+ T& |3 V+ P
} : f `6 x7 G9 ?: D$ K
/***********************************/
1 d9 H* }+ Y) y6 Evoid DisplayOneChar(uchar X,uchar Y,uchar DData) //X,Y为字符坐标
5 I% k, m4 u1 G6 p{ % U5 [: R4 F+ s, N8 y1 ^0 ]
Y&=0x01;
7 t3 ^8 L- r' q% K X&=0x0f;
- C9 c0 ?4 D3 @9 A5 e, \ if(Y)3 V* v' g8 _3 h, f! W
X|=0x40; //8+4=c
, p! S8 Q" ~. ]+ S
8 n) \: z+ Y% h" N X|=0x80;
# s" M( I: z% Y/ Y+ d WriteCommandLCM(X,1); i1 ^8 T, t# V( g, N
WriteDataLCM(DData); 7 E8 p3 c7 y; q# Y5 m# o) A' U
} w/ D R6 T4 ^
6 R$ P5 |1 h' y% ]# R! C2 w! q/ ~9 m" x" @
void Delay5us() //@12.000MHz9 l. Z, D7 t+ N- A d1 t/ b
{. U9 ^& V) E- K- S/ m$ Y4 `
unsigned char i;. L0 X/ e: k0 O9 \ Q$ X: @+ Z+ h
' T# U) @# i) b2 y" ?0 c
i = 12;! Z4 h; `# ^9 v- B
while (--i);
5 F) j% [6 U1 Y' v( M1 j ]/ @* N}
: _" A# Z0 l3 `
& g. I; G5 w/ f/ E9 F$ A% p" o
6 L m: S% K; u& Mvoid Delay5ms() //@12.000MHz, s5 d E6 a( i k c
{
! p% F; e4 V% h. a unsigned char i, j;
0 J$ k$ A& V2 M- `, F6 Q6 j5 D, @5 N+ a# Q" P; w o
_nop_();: `; X9 A$ m' Q/ f
_nop_();
! [3 z a- Y2 x ^! H: f2 ?5 g+ r i = 59;
# p. E2 r; D) v- T$ o1 _$ l j = 89;
% ~0 A) W1 B3 ~# g1 h) x6 J do/ Y: U" }( X9 n" N) \. n: a; T! |
{
1 x! O0 J. K! y {9 ], \ while (--j); a+ V* Q; \, d; v2 }/ x2 u
} while (--i);
3 F7 |1 `4 t. C8 c: ^' D}2 i+ z9 |$ S7 P
" Z) j9 q c' n* u" _' Q
; Z9 \' m2 G ^. R1 j/ X5 c0 a2 R/**************************************$ Z' d8 x. G+ h) L" B" I0 g, L# l; w( ] ~
起始信号7 D* c$ i! b8 G! y
**************************************/
6 P5 Y* z# C2 m- j! w4 D4 cvoid ADXL345_Start()
" o% `* u# @. @, `{2 J; [- d$ S' v8 x2 n9 I
SDA = 1; //拉高数据线% {# R; Y9 O5 p4 L# H
SCL = 1; //拉高时钟线2 Z6 \0 o5 D! T' F1 B
Delay5us(); //延时( o6 b+ Y. ~; w G, S
SDA = 0; //产生下降沿
6 a6 V' J8 ^1 e0 Y2 P/ R Delay5us(); //延时
* u. Z" K" k% T SCL = 0; //拉低时钟线8 j) ]$ k o, W
}8 K p! r! d9 ^5 u X6 \9 p+ d
! ~! C. J- T3 A( `
/**************************************$ d4 _3 V) G( Z0 i
停止信号
4 {* j6 u7 F1 } d# K8 A**************************************/
# t( P) Q6 f7 w; y+ ?void ADXL345_Stop()
- y3 q6 B. c9 P; g{0 O" p3 [" v2 E S. e$ y- Q
SDA = 0; //拉低数据线/ U7 H/ b, A5 {$ R
SCL = 1; //拉高时钟线
( v$ V: a' H0 f' s Delay5us(); //延时- L1 p% O; ~7 q( L1 l8 F3 w ]
SDA = 1; //产生上升沿
) h1 A+ u$ s6 \: z3 C" m$ g Delay5us(); //延时% r5 e4 i. G6 }; N1 ^. `# i- I
}+ \3 X! o' l& W0 q
$ ]+ Q2 I3 s J1 T; u6 c/ `, |' V
/**************************************1 W: O9 S# P! p! m) }) S1 o
发送应答信号
: H5 ]: j m( x2 H/ h入口参数:ack (0:ACK 1:NAK)4 P$ h9 r( _ R+ E
**************************************/9 m+ T. `2 _5 C
void ADXL345_SendACK(bit ack)# r; s: l: {$ W
{5 f& n, h5 c, X6 F
SDA = ack; //写应答信号* d$ I: @/ _& M5 F
SCL = 1; //拉高时钟线
6 F/ k4 l) H" l Delay5us(); //延时
2 W5 m- [6 g! O* v1 u# x: [* G5 ? SCL = 0; //拉低时钟线& H# d% U- k6 A. H
Delay5us(); //延时9 `0 {3 s/ f: B3 G- R
}/ s' U- q- u8 E* p* t
4 O& o, D! e9 A
/**************************************
, J3 {% Y D( f: z: q) S% }接收应答信号
, Y Z# K0 w/ G$ d4 o# `**************************************/" r; m# G9 U1 P
bit ADXL345_RecvACK()
) k6 H/ [: Y2 H! m/ ^- c5 Y" k. h{
% J/ S$ v2 o: a! t- ~+ k/ c: L" U# c SCL = 1; //拉高时钟线
( u- E8 W: S# y/ \ Delay5us(); //延时
6 x L0 }4 d8 w! v$ S CY = SDA; //读应答信号8 S4 k ^6 L r' Y5 h% k9 d
SCL = 0; //拉低时钟线
3 k( O3 o3 v, _ n P9 d8 v$ u) j9 |- _ Delay5us(); //延时- m& ~& ?( F2 \( {6 N- [0 e
. c. u4 b# v" r$ a$ o( J
return CY;
. q* l: A: O1 w, j4 u7 B}5 W0 A' X9 ?9 o# G
- i3 u; Q1 n% y& F; J" b
/**************************************& K* J+ U! c1 s! h
向IIC总线发送一个字节数据
E2 K8 J. b6 W# I* I**************************************/( W- Y, w1 _( ]! D
void ADXL345_SendByte(BYTE dat)
5 D. B- A1 O8 [( Q; N, k{2 {8 u* G2 ^7 Z4 Q% X2 |
BYTE i;
m! m' ~" F" V1 S- n. l+ U8 I$ u* ?. {
for (i=0; i<8; i++) //8位计数器7 J/ Z/ B% Y; q) q
{
6 M- L7 M9 |3 K) y0 F dat <<= 1; //移出数据的最高位& d, \- B5 S+ |4 w ~0 g
SDA = CY; //送数据口5 t0 x* s7 [0 x: b6 B* f
SCL = 1; //拉高时钟线
/ t, z# C+ {) c" E: b Delay5us(); //延时: F$ u; i& x4 p1 O* R6 W
SCL = 0; //拉低时钟线
1 O* g$ D. `5 |9 \, D1 j% B3 \ Delay5us(); //延时4 v3 `9 V( Y! Q, p3 ^3 q. e3 N) G1 x
}
9 P! B7 B# B* H% v ADXL345_RecvACK();) H0 e2 b5 ]7 f3 j. G$ | R
}
% @: H, N7 K7 g/ A- Z8 U+ B& E3 _' U; l
/**************************************
0 [8 ? V8 X) {7 y' V4 f从IIC总线接收一个字节数据; d' v! t& U, i8 s" b5 [* U
**************************************/
: z$ j3 Y- f$ V$ f' c+ x7 BBYTE ADXL345_RecvByte()2 M" Q1 c E; Q3 F% T
{
2 Y m7 Z7 F; }% w6 E/ H3 i9 b e4 o BYTE i;2 [. Q! R" Y; z; j# z$ `
BYTE dat = 0;
3 x: ], H4 G2 O# Q+ _( p( e( l8 {. ] SDA = 1; //使能内部上拉,准备读取数据,; `. G& T, ?/ t/ p" ^* @5 X
for (i=0; i<8; i++) //8位计数器" X1 X, k" @. U) f
{
0 ^' e. @% t* J dat <<= 1;5 ^' u5 n( V* C% U# z P
SCL = 1; //拉高时钟线
2 K' K6 H' H M' S1 z0 _ Delay5us(); //延时6 M0 r& Q% f+ A7 N+ S+ s/ t! [+ v
dat |= SDA; //读数据 / {( B; X5 U+ o5 w* V
SCL = 0; //拉低时钟线% h$ T8 f) F3 K/ l' U% v) U g
Delay5us(); //延时6 ?3 A5 l& v; c" u0 p7 A
}
% t# {4 p0 ?0 l q return dat;
) b" s ~/ Y6 |! S! n/ p}/ X/ a: Y6 x; `& W2 i0 p. [
! P6 T. D" K, L. ^9 A0 Z
//******单字节写入*******************************************/ [* K6 u+ J& Z% |* y& E6 C
//用于ADXL345初始化& t! a$ p2 H$ ^3 d
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
- p: Z0 Z; Z' @( }{5 w# ~% x/ B( H
ADXL345_Start(); //起始信号
% _: \ m8 ~2 d2 j2 H4 q% T ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
( G. S3 E" x& Y9 M ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 : w& c9 |) K1 J# ` N& L
ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
8 V. i/ C8 E+ Q! r* y" a //相当于 向相应的地址写入命令字 5 `+ D! m: s( ]3 D5 \7 q
ADXL345_Stop(); //发送停止信号
0 N+ j% W" Z9 n2 Y. g}2 i3 K1 d; O* }; j4 s
3 O* M/ o% p2 K% s2 J" a' o0 K8 Q//********单字节读取*****************************************0 G2 q9 c/ T, G; [
uchar Single_Read_ADXL345(uchar REG_Address)
, ^. u, F$ J& w6 `; D{ & I' J7 c) \) P% ~/ g2 @' V
uchar REG_data;
C9 [$ v+ J9 V8 J( o5 S( j ADXL345_Start(); //起始信号, T4 T7 Q! d) Z$ @* M4 R
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号,//0xA6写入
$ |7 i- y5 ^- W, R5 t1 E' ~ ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始
) N4 y& c7 b# s4 }5 F) d ADXL345_Start(); //起始信号( N O& W8 U& W
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号,//0xA7读取+ D* g$ Q" m) j
REG_data=ADXL345_RecvByte(); //读出寄存器数据4 J- i0 p1 f( e
ADXL345_SendACK(1); ' h- m8 u! G4 `! l5 |7 N' Y
ADXL345_Stop(); //停止信号. {% |4 i! u# n: J) g: D/ k
return REG_data;
, t. B% x& ?4 l+ q Z- n. B4 X2 R}" P0 R( |( M+ J6 ?
//*********************************************************
! d5 w/ b7 Q) W/ r S) b: R//: i3 l o) F! @# r# l; t* H) T
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
1 U0 o( o3 k% Q0 J4 `: e//
6 J: P5 y4 u( ~//*********************************************************
( \6 N" E; ^8 X; H( zvoid Multiple_read_ADXL345(void)% z) t! o/ o- F( m" k) q
{ 2 T8 |9 U2 c1 [1 F8 l, ]# O" z
uchar i;
; C S8 G0 ~8 i8 }6 } ADXL345_Start(); //起始信号/ i0 M1 @% g. H/ C7 F1 _( v- {% F
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号% o# g; K/ ]: p2 A
ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始
9 t: ~: J- A2 n0 { ADXL345_Start(); //起始信号/ F' a- z% ` J. Q# p0 ?, g
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号
" j& x, m5 |5 V9 y3 I, Z- j for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF" i+ [2 M6 O/ h) \- |1 {! A( d6 |
{
% D$ o! i) G! d6 e! D BUF = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据
/ k5 q5 B% m$ G& l& e3 i if (i == 5)
) s. u6 z: C( ]0 s {
# \- h, k1 S; q9 }1 { ADXL345_SendACK(1); //最后一个数据需要回NOACK
7 D' |% a# u! P }
6 ^0 X+ ?# v; ]( s$ K G else. r; v. x* U0 B4 G$ Y9 x& K
{0 E) ^& z7 b! N# G
ADXL345_SendACK(0); //回应ACK3 P" U! Z+ R, Y/ f: N
}) M: W' _3 c& F
}
9 m. k% l9 ~3 N/ Z) |5 b% Z ADXL345_Stop(); //停止信号
( ^5 l8 [- ~, U4 z Delay5ms();
8 f+ p; _7 c$ r g0 Z1 a}
& b9 ]) b9 R9 \8 P
8 |/ l) `$ Q$ x//*****************************************************************
5 M4 J* B0 ?, y! C- n, o, T
; @: }7 T) Q; `; }3 {//初始化ADXL345,根据需要请参考pdf进行修改************************
[% y1 ^' Y7 e/ yvoid Init_ADXL345()
|& W$ `7 J7 E{
0 i7 Z2 ]5 h( g$ F Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式
8 h2 r# z. X9 k. }- E% Y Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页$ Y+ }7 n. J" T$ s2 ~0 c. S; K
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页3 f- h2 v% g n6 ]0 P
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断
( s% z5 ~3 t8 T% P( U) S* S! ~: |5 u' P Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入,pdf29页//自己调试,得出偏移量) |$ I. [) i' w! z& @7 b
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入,pdf29页- a3 o. w4 ]! \7 Y( E' T
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入,pdf29页
& D% g, P! E' ]1 d}
' w4 E: P$ s' N/ k5 M d4 C3 M
//*********************************************************
. ?$ S+ {( S( o# J- k% `6 Ivoid conversion(uint temp_data)
* N+ _& k& L4 A{ F1 ~& O w( l% |8 g. s6 R8 I+ G
wan=temp_data/10000+0x30 ; //0x30='0'
% T! [! }, D+ p temp_data=temp_data%10000; //取余运算
! P: c/ R8 S* ]- r2 }7 f% o! d qian=temp_data/1000+0x30 ;7 t/ l( }" ~) e, `
temp_data=temp_data%1000; //取余运算) p! C" ]6 t: g. v8 E) q/ I+ t
bai=temp_data/100+0x30 ;, t& @. O, |) B( ~# w- y3 T3 A
temp_data=temp_data%100; //取余运算
3 N& x6 A! B: C shi=temp_data/10+0x30 ;
4 {1 Q( k S \9 k) L7 Q+ Q. x: R temp_data=temp_data%10; //取余运算& P9 G5 ?) q, {3 `
ge=temp_data+0x30; 2 ]' U+ \# I: e* G$ H% K* Q' s
} B! M% A/ T; B1 L! Q) d
1 j3 G8 v+ |, t/ h
//显示x轴倾斜角,即x轴与垂线所成角度+ B B9 m) F2 h; @8 v1 |
void display_jd_x()) r2 b# F$ _. d" O/ p
{
& Y$ Q: S4 a, e9 G- V( _/ j bit bj=0;//标记
- B: S7 z$ H2 K& H4 |( z int dis_data_x,dis_data_z; //x,y轴加速度的原始数据,用补码形式表示+ r! C$ j$ ^# \5 |# w3 A$ V
float mg_x,mg_z; //角度,加速度
' {: x! v8 p5 ^. K z, ^, ` dis_data_x=(BUF[1]<<8)+BUF[0]; //合成数据 8 \9 `# y8 l; w4 Q9 I7 H
dis_data_z=(BUF[5]<<8)+BUF[4]; //合成数据# ]+ L- r! c6 U% M, L
6 H" M- A! c! y+ x" c% A( U
if((dis_data_x<=0)&&(dis_data_z>0)) //第二象限
+ K1 j) F" G p* J3 z% S4 E {% K; H; l4 ]: T
dis_data_x=-dis_data_x;
' |4 {8 C# h. s+ b+ h5 n DisplayOneChar(8,0,' ');
2 |% @+ N$ W2 Q' a! F6 P bj=1;
5 F# I; U, P. Q& M }1 X: S- ?8 v) Z$ d* o
else if((dis_data_z<0)&&(dis_data_x>=0)) //第四象限- _8 K! {8 N5 F3 [
{; Z; |2 a# {1 T7 }* X, [& y
dis_data_z=-dis_data_z;
$ [3 E8 l/ J) W2 ~ DisplayOneChar(8,0,'-'); //显示正负符号位/ F4 v0 f. L1 O2 V- b2 y5 \4 ~1 J
}
; X% v0 c3 [+ Y* N else if((dis_data_z<=0)&&(dis_data_x<0)) //第三象限4 Z6 F+ X( _' W$ u
{( z) H, E5 f" s' m9 O3 J
bj=1;6 e$ I" Z, r& U8 i0 I
dis_data_z=-dis_data_z;
2 o; V/ O) f/ v. e8 t9 v dis_data_x=-dis_data_x;
8 @ e6 w5 l# n$ n$ z; J, e4 I DisplayOneChar(8,0,'-'); //显示正负符号位( C- w; a" p, G& F1 `( e
}3 e& W; f: ]8 K' n. [( r! A1 f0 f
else if((dis_data_z>=0)&&(dis_data_x>0))
8 a) m# @( d" ?- g- j3 I0 T DisplayOneChar(8,0,' '); //第一象限3 R) H5 L, c, M" W
$ K/ g0 d- m5 y* G( I( ^ mg_x=(float)dis_data_x*3.9; //计算数据和显示,查看ADXL345快速入门第4页,1LSB=3.9mg(毫g)
+ _* C5 `0 L4 n7 S4 g mg_z=(float)dis_data_z*3.9; //强制类型转换,dis_data_z的类型和值不会发生改变
' b8 ]5 t+ T) g/ q4 Z0 x
( K% z7 i" z0 i9 @ g% N0 Z jd=atan2(mg_z,mg_x)*(180/3.14159);! L3 K9 @- N8 |! p- b) p$ n" `, Q
if(bj==1)jd=180-jd; r' a& m% ]+ Q
//jd=jd*10; 消除小数点,便于转换数据和显示
& V: n$ n/ ]9 a6 U) Q! ? conversion(jd*10); //转换出显示需要的数据 //
0 m/ e v" N6 V9 ~! l5 {1 ] DisplayOneChar(6,0,'X');
5 ?) T1 I4 F% `: l/ f4 T DisplayOneChar(7,0,':');
3 p/ K. y1 a% ]3 m6 n DisplayOneChar(9,0,qian);2 n8 l( o5 q8 E; n5 @6 n
DisplayOneChar(10,0,bai);
' w- j% X2 G. u/ s& q DisplayOneChar(11,0,shi); + ?! l8 ^% ~1 t( W7 E p
DisplayOneChar(12,0,'.'); E% }. h+ L2 C
DisplayOneChar(13,0,ge);9 c! t3 t5 R3 ]' U' Z: C
DisplayOneChar(14,0,0xdf); //显示 °) V0 H0 N* _9 k9 W) b/ v
DisplayOneChar(15,0,' ');
5 ] [1 W# H5 y! H) F}
( U6 k+ `) S: C* t% a9 h3 N6 u: y0 x* R- R- @ V+ x9 ?
void PCAinit() //PCA模块初始化
# c) K/ F1 W. r& G! P$ l{& r& R4 x8 V8 j7 Y* h
CCON=0;
: k3 d3 T9 ]" h, n CL=0;
* u( ]2 }% O! X0 g( ] CH=0;4 y, B! ^2 m2 M+ c
CMOD=0x00; //sysclk/12
$ R7 y; b& t: |2 u3 Y \6 Q* ^. J CCAPM0=0x42;//8位PWM,无中断
% J' D v4 X8 D& d! m9 U. X CR=1;
, ?! b) m6 r! o- d; J+ j# V CCAP0H=CCAP0L=256-240;
( }* [3 n/ ^# I2 r# T6 ^}8 ] }7 w9 a! K- g# \: D$ v
void init_t0() //定时器0初始化% M" O: K/ u7 K8 p
{
4 A) B4 a1 y9 F3 {) o TUXR&=0x7f; //12T
6 E L* |# }; j1 {* z# V% c8 x1 Q TMOD=0x01;" v& j, D4 [- j8 D
TH0=(65536-50000)/256;
' J z" |2 B, |. v TL0=(65536-50000)%256;# Q, m" `5 z* o
TR0=1;! m" W, c3 @: a9 y
EA=1;
5 `3 k \8 p8 S! g' h# f# w" `' ` ET0=1;% s% y; h9 x2 q$ S. _1 }
}: V# V$ o4 j5 t8 R" p N
" k0 d0 E& f' Q I+ Z4 U//*********************************************************
4 y: f! E* S) r+ ?* W//******主程序********$ Q5 }# b" S3 S0 j* o! q! V
//*********************************************************
- o7 I1 a% H) y+ Lvoid main()! [: M3 S5 m1 ?" U! X9 |* s
{
9 m" x9 C% @+ Q char H; {* l+ o O2 p- M
InitLcd(); //液晶初始化ADXL345
% F" _1 W5 w( N" y4 t1 q3 O Delay5ms();, \2 `4 n8 j) t$ u- u
Init_ADXL345(); //初始化ADXL345
) @( ?/ Y# @5 V) P" W PCAinit();
, F* L/ A# Y' B, i) s init_t0();
9 M) b3 S. [. ]8 Y H=CCAP0H;( j8 S& n- ?6 J: I2 N' ?
q; K& z. h' n1 H+ T% ^ while(1)
* S& k$ F' C" x! V, ~: G {
$ r. @' z9 D6 P) \/ {! f& v' h- v. H if(p33==0), J9 ~: U1 b- M( a% F0 S8 U6 D9 {
{ ' `4 k3 P: V# c+ F6 e! q7 v
Delay5ms();
8 D6 I K) k2 P if(p33==0)
: v( R$ Q6 C/ n5 {1 F8 A {( A) G6 X/ H P# y* D+ F l V
H=H+5;
' u. `8 X5 b, f/ w if(H>255)H=255;
% y! k- a7 d; ?" F E5 y CCAP0H=H;
v. }) x- s- \( M3 L+ U8 r CCAP0L=H;6 Q; [) [$ l- T. l( x7 C: y
while(p33==0);
2 S ^, @: V: `5 z' F9 | }5 v+ }4 u6 C* h, ]4 H
}
# [5 D/ F+ ^& U8 G; K( b, A if(p31==0)
- b+ ]! F, A1 p) E( V: O' p {
) N- E* x* p. L3 T" l" @, W Delay5ms();/ p' o1 N+ M' R+ z% {0 i0 b' R
if(p31==0)3 i8 T& g, I/ @; r
{
% b. C* H" f" M9 p! V3 w9 l N H=H-5;
7 v& Z9 {. t0 Q; K" _1 ?9 f) ? if(H<0)H=0;
' V0 j8 H. X2 k9 w( O* @" N* i/ q……………………7 b5 q& N! R5 `7 N9 }9 J
8 H- L3 R/ h5 y; H. Y
…………限于本文篇幅 余下代码请从EDA365论坛下载附件…………( v( n6 r. d" G/ j& g$ y/ X
! J1 E! q4 p0 M! U4 m! D
; D/ O. q }& N3 i, g
2 m' W$ x5 p7 S8 r3 `5 V0 u$ U+ b7 X2 O; ?& j+ h2 y6 \
|
|