|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程
4 [' l1 g6 u/ g3 FGY-271模块教程分享,这是HMC5883L电子指南针罗盘模块 三轴磁场传感器 的相关教程,带stc单片机。avr单片机和Arduino平台的源码。有需要的同学可以看看
" _, ?6 X2 o1 O$ U8 x! S3 r2 l. |' i, i0 r% N
GY-271 HMC5883L模块外观图:
0 X0 a' A, |( ` n9 M4 `2 m8 b
8 e& [; I9 Y4 `! `1 \
( L, h6 ~+ ]% pGY-271 HMC5883L模块原理图:
$ z# {2 u$ T* H+ o# r! W " R: A" C3 F' O7 ? I+ F4 M$ ^
6 [2 U8 U' _3 ?
GY-271 HMC5883L模块尺寸图: J- A0 @4 ]. P) x* V. [
- W9 o& V& ?/ @6 O. j! u
: Z- C& B/ [: U/ Y
/ [ T# h' u- d4 O+ c
, f; h7 s+ B X# N9 D; O5 u与单片机的通讯接口程序:
5 R' D# ?# n% L! ^: M7 Z//***************************************( Y) n+ B9 t" m0 `) I! d
// HMC5883 51串口测试程序: e+ O( d5 g/ @4 }! G9 g# |0 E
// 使用单片机STC89C51
! S- X& _7 c, ~* q// 晶振:11.0592M3 m: T( U& j+ r' [
// 显示:PC串口
: Y0 e$ ~- o; S! n// 编译环境 Keil uVision2
! {2 c3 h: F7 U1 t// 参考宏晶网站24c04通信程序! h& k3 W( b* |( Y9 @/ A7 L
// 时间:2011年3月1日1 ^/ R1 o4 N/ k& i
//****************************************, r- z5 V- m- N6 ]5 T
#include <REG51.H>
# V$ V& i3 M3 D+ G#include <math.h> //Keil library 3 n: l5 _5 t# K* K. C1 U$ C
#include <stdio.h> //Keil library * [2 W$ W. Q) `6 Y! a5 ^
#include <INTRINS.H>1 J5 n2 A1 A- H7 {" \
#define uchar unsigned char
' i4 h* O; w. f$ Q9 d#define uint unsigned int
& v( o( a- S T$ \& N6 p//使用的端口,请按照以下接线9 M j8 Q% X+ y* {# c% N# b; i
#define DataPort P0 //LCD1602数据端口
% x- M6 M" q N2 f Y7 E3 Ysbit SCL=P1^0; //IIC时钟引脚定义
( _. R; e- j4 J; I! rsbit SDA=P1^1; //IIC数据引脚定义
+ y' k/ _+ s% s" z- d7 G- t& w% h. {" \9 l9 y2 t7 A
) G1 Z+ H" ~8 F. M* e* P! {
2 A7 i) o1 v! l+ a5 b: |1 [
! B; a9 v8 e, x) D* r' T" k#define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址0 C' w0 l& p8 |, X" k
typedef unsigned char BYTE;, K, B8 _9 }9 {8 c- o3 E3 [1 {# L
typedef unsigned short WORD;* u4 l* H1 N0 l& D
- Q% n. r6 }$ r& m; C
+ e& a. W+ X! p% r* f3 F( R1 bBYTE BUF[8]; //接收数据缓存区 & [! v9 p0 Z# T* e' p) b
uchar ge,shi,bai,qian,wan; //显示变量: t. ^( P2 U$ x7 s' p9 r
int dis_data; //变量5 Y" u, O6 D; ?0 z1 P1 }
//************
) X$ Q, N& Y3 g9 c/ [4 p8 r O
. J0 w% V# y* ~ {/ X/ ~/ e- R7 I
" n! @& E" R* i3 |* v7 _$ ^2 U! ?//************: d- j% H2 v/ b+ y; q i' @
void delay(unsigned int k);
5 ^5 f; k. t7 G0 Z0 a7 D: B: c& Lvoid Init_HMC5883(void); //初始化5883
6 c" G! y3 `: ^void conversion(uint temp_data);8 y$ o4 G2 \1 y2 r' ]2 y T- X
& \' k( C, ?$ L3 p2 I3 `, h5 y2 G
* g4 D* G; ] E/ `void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据" Z. n" y0 d5 ^: p% U% l& `
//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据: Q0 T) s2 n( v% G2 N# b
void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据
7 L/ s+ k4 l. L; f* T* n+ F E//以下是模拟iic使用函数-------------
, e. G& y& p, x, m* c) C* V, Uvoid Delay5us();
0 @! R) {, E$ ]! e( I3 Ovoid Delay5ms();
( E0 ?2 H7 l" Y5 Y& h t' mvoid HMC5883_Start();" H: x4 C# A! t: Z6 u( W) a
void HMC5883_Stop();
F' L! c: a1 ^% C: H7 n% q8 n# Qvoid HMC5883_SendACK(bit ack);
( X% ?3 I; B1 N) b: ^% n' Sbit HMC5883_RecvACK();
/ D& I1 U/ v0 `# H* l2 r( M2 ?void HMC5883_SendByte(BYTE dat);: m4 d0 N" @$ s9 w: m
BYTE HMC5883_RecvByte();2 R5 u k0 @( d5 w
void HMC5883_ReadPage();, Q2 L. {# N L" N3 y
void HMC5883_WritePage(); K7 H! K5 F/ K; A1 O: {
//-----------------------------------
# P. V: r7 M" f7 h u
) W9 d5 P# c" V0 i
* V+ Z; Y) L3 A//*********************************************# P6 a) N3 _1 n- z
//串口初始化
$ @0 R2 x3 o% s& B1 C//9600 bps @ 11.059 MHz 1 I7 r+ o3 {5 c( v/ ~
void init_uart()
3 |8 d) ^9 B" l7 ^0 u5 `0 J{7 D* Z8 v, ~, W" M5 g
TMOD=0x21; : v8 u. p9 P+ W: d% t1 b7 e
TH1=0xfd; * F ~1 \6 X3 d2 }7 W
TL1=0xfd;
9 P7 T6 Z1 B5 ?6 w! s9 U- k! k SCON=0x50;/ }% a. X2 t- K5 u: Y- o4 P
PS=1; //串口中断设为高优先级别1 \7 f; B3 P1 C6 ~" s" S4 Y9 @* O
TR0=1; //启动定时器
% f2 J X: ^0 I! c0 \2 a5 B: ?: d TR1=1;
; ^$ N" B0 I, @0 \8 J8 S' f+ d* N) T ET0=1; //打开定时器0中断
, ~$ X, e0 a' n ES=1; / C) j" T3 L" D8 X2 L8 B) i( {
}9 }* K$ _: N4 P0 _. H$ l0 H
4 x* B# O& ?4 l! Q. k1 X2 p
. M5 t: R0 _& e) b& n1 b1 e) N//*********串口数据发送******************( ?+ B2 N% ^$ N: R! S5 e# H! S
void SeriPushSend(uchar send_data), H& |# s+ c8 N1 x
{+ U4 j) u E: j8 a* c" ~
SBUF=send_data; . x& u7 E2 Q5 Q5 ]+ n7 L
while(!TI);TI=0; , u y' ]" ~6 k
}
: s7 h+ ~* L! M) Y. S" J" d//*********************************************************3 `1 `9 j3 j3 O
void conversion(uint temp_data) * a* Y) t% w1 H5 s* E" U5 {
{
Q) n. ]" R* H8 a% ]1 @ wan=temp_data/10000+0x30 ;
) W9 r9 P! P( k4 L3 J3 g% N8 u temp_data=temp_data%10000; //取余运算0 v* ~8 }0 z. K" B. U5 a" L
qian=temp_data/1000+0x30 ;
" s1 j# {, `3 T# ^; Z temp_data=temp_data%1000; //取余运算
1 Z! s1 q" z N# H bai=temp_data/100+0x30 ;! X! G. X4 n& S2 f6 H8 t: Z0 ^/ ^
temp_data=temp_data%100; //取余运算# Y* D, O6 r4 j' o( R
shi=temp_data/10+0x30 ;8 O. O. C K; l
temp_data=temp_data%10; //取余运算% Y* L Q, V7 ?8 m; O! O
ge=temp_data+0x30; 0 X: M5 \, s, {' ]; r2 w5 e
}, t j7 |; y, q' j
, q' E" \1 l, T5 h7 K/ U4 U+ R
8 Y3 Y$ o' f5 O z, F1 x/*******************************/0 _* L" k: a; u" o/ a
void delay(unsigned int k)
6 n) k, Y( w9 E{ / _( |3 D4 U+ p# ]& U& C* g) E
unsigned int i,j;
+ s' t1 @4 E7 j# Ifor(i=0;i<k;i++)$ I0 [! z7 j6 _$ O1 K
{ ' Q3 {& ~+ |9 F
for(j=0;j<121;j++) 4 }1 z7 @% l1 a- f! _; A
{;}} + B/ B! ~& j. p n) w- I/ r
}
% k' b7 l& m4 u1 d7 p" t' V; k) J 7 D, {5 _1 X& o5 c8 ~! z) Z2 d P6 W
& q3 l! b/ k" S$ c: P
0 a! B1 }! F2 d- R, O; F- ~/**************************************: m; ]5 k0 U1 }8 K. o5 _
延时5微秒(STC90C52RC@12M)
1 B) p. e3 K" C6 l& Z6 [不同的工作环境,需要调整此函数,注意时钟过快时需要修改) c5 H3 r+ ~0 ~4 R! ~' p, f( {% U
当改用1T的mcu时,请调整此延时函数4 u* m* k8 P& h8 b) I- z W: p
**************************************/
) T# m1 z0 k+ C0 kvoid Delay5us()
' g* h( W3 V5 S! b$ q" m/ I{) n$ i/ K9 G5 ?* O3 L
_nop_();_nop_();_nop_();_nop_();2 i* [, a- @5 ~0 h u
_nop_();_nop_();_nop_();_nop_();0 F. b2 K4 d& Q1 W9 v& f& R% W6 p
_nop_();_nop_();_nop_();_nop_();
! V+ Y! f& p, A F! _ _nop_();_nop_();_nop_();_nop_();
+ }$ `; \6 N; ^4 z _nop_();_nop_();_nop_();_nop_();
9 b" G6 U3 h& _% L* c! x* D}
3 z& @/ L- J* v D3 l6 E% a7 j9 s% m# w5 ^% f; Y6 @
x, }3 Z4 E) a# R3 N/**************************************
- v# ]0 z5 ]) k. W6 q/ H$ M' T0 Z延时5毫秒(STC90C52RC@12M) e1 x8 y$ i+ k) `' J. I Y
不同的工作环境,需要调整此函数! n5 q8 D) w! u* M6 `
当改用1T的MCU时,请调整此延时函数7 Z* s9 u: P. B& l
**************************************/
; d8 [3 z! J8 wvoid Delay5ms()4 j7 o4 ^* g! L" o- I5 `8 c
{7 L7 T; U/ G( a$ H
WORD n = 560;$ b, l+ |$ K' v
% ]4 n5 i' U( h' Z' u' b/ A; R: Y' U: o/ H: B
while (n--); s) {. Q8 y. M2 ?
}5 ~' q2 m4 D5 K0 O2 i
! B4 e7 m. `0 c6 c' i% N7 X
( m( n- q$ Q8 p! V, A0 M" B3 A/ K/**************************************- T3 O* j, R1 D& N
起始信号/ p+ |5 N2 s7 ]3 t/ Q% O, P# R
**************************************/
- G% s( B! d+ b7 Wvoid HMC5883_Start()
9 V6 R0 @. r' c# K4 [) f9 x{+ W! l/ ~. i# W R7 q) Z- V
SDA = 1; //拉高数据线
9 ?5 h, k/ u' R3 e& j4 S7 J$ } SCL = 1; //拉高时钟线
5 ]2 x. F0 w( Y( \8 i1 G+ L Delay5us(); //延时
9 B8 B& X. t* I0 s* S2 G* v9 g SDA = 0; //产生下降沿) y/ Q2 T0 v A8 ^! U o5 r0 e5 _5 l
Delay5us(); //延时! `4 X- g- z. a1 Q4 m
SCL = 0; //拉低时钟线
, r- Y# _1 k s4 S# n' [' k}
7 j1 c0 k3 N* x0 m( u9 s8 S7 Y( H1 B$ |9 ?4 |+ s
; a! M; e( ^6 v/**************************************
; s+ B! q% Y! S' m) F. ~停止信号6 t1 O1 N( @3 W4 |# d
**************************************/5 v5 T6 {1 X+ [7 x# {2 o: y
void HMC5883_Stop()% J9 i$ R9 N- q* e( u
{; ~6 i/ O' R) g7 C" P- Z: G- S$ R
SDA = 0; //拉低数据线
6 j& d5 ?1 n- u8 U+ f' s' H SCL = 1; //拉高时钟线
$ L2 V) i5 ]; W6 ^: w! D; b e9 ? Delay5us(); //延时
4 j3 U" h0 F e SDA = 1; //产生上升沿* T; v; j2 c' |! _4 X
Delay5us(); //延时. i' g; C$ A! [7 f) g
}
! q. b3 S) v; @6 Q; }, t, L7 j/ R: \) Y4 v
! d0 e7 E7 ]- T" P9 s% J5 ?) A9 m/**************************************5 l" {3 N) v9 Z2 ?
发送应答信号
( Z* ]% A" j% h2 E- U入口参数:ack (0:ACK 1:NAK)
: J8 K" V* B* y: x2 k1 H**************************************/. @# b9 V3 R# Y; x# s# }
void HMC5883_SendACK(bit ack)( d# R9 M* t2 D* A+ [6 Q+ Z6 i3 p
{
& l1 C4 |; V) A+ z SDA = ack; //写应答信号
8 Q0 A" T- @2 ?/ n7 Z0 u6 V SCL = 1; //拉高时钟线
5 X( A8 z2 T w6 f/ q Delay5us(); //延时
! @8 j. u$ }5 v. T9 e1 F G SCL = 0; //拉低时钟线: J1 k5 _/ h: I7 e# Z
Delay5us(); //延时
+ v7 C1 _% o w& _; I1 \3 L}
5 Z6 Y% _& x9 P x3 w& M/ q4 U% p) V8 G) \' v% a: W# |
. F9 X9 h; {6 s: Z b/ ~/**************************************7 `' {7 V7 t8 F0 |+ t4 i% F
接收应答信号
8 `) f( P$ V' e0 A* P- F9 ?**************************************/
9 m) B& _9 _& }# R' h, rbit HMC5883_RecvACK()
9 I6 ?' C' H$ o% u, [{! Z, d$ ?; M* v- J% a
SCL = 1; //拉高时钟线
8 |" K" S7 ^: z) E6 l; O+ I Delay5us(); //延时' {& ~# x' _1 S* T
CY = SDA; //读应答信号2 d3 e+ n5 `8 j6 v+ V5 v' l" X
SCL = 0; //拉低时钟线
$ M4 R2 k' ~" u! ~) r6 K* j Delay5us(); //延时
; U& f# T9 m' c! N: m: N7 p# m2 Y- C, p' L& r0 G4 ^
# Z( `) H$ z+ A2 c' P9 Y6 o
return CY;
( _- u% p# _8 h}, w/ q' K; V* z* a/ i+ I+ I
: ?2 n8 b* k1 e5 n
: d+ n5 ]* c4 Y* U- }3 t/**************************************% D. w1 x/ o1 I$ e6 V
向IIC总线发送一个字节数据
/ ^/ X7 t6 t5 S) E**************************************/
( d+ S# T. o5 {, Svoid HMC5883_SendByte(BYTE dat)( ~2 S' _) {% c& K/ J% f: g8 Q
{- g# _! N) |7 j% j. q* ?- h
BYTE i;4 q/ L/ a6 _# ~0 O; t; [4 i/ o
- Q$ }+ U, W0 \: k/ B6 |8 b0 ]; Y
) _$ x# } s% l3 T! g/ _5 W: a for (i=0; i<8; i++) //8位计数器( |* V# V" b" b- R( n
{
, @: `3 _5 Y, x dat <<= 1; //移出数据的最高位& l4 [& { k0 [$ Y; P( B, B
SDA = CY; //送数据口7 d, ~. [! q s4 r4 S4 ]3 A6 F8 r
SCL = 1; //拉高时钟线& E( C6 n6 u4 e2 s1 S
Delay5us(); //延时
( T! Y) G( ~2 q' e" ]) ` SCL = 0; //拉低时钟线
0 ~ q6 W3 U/ y2 c8 M5 [ Delay5us(); //延时" P3 w: L# z, n
}
+ C# p; r& V. \' F) f; h5 J HMC5883_RecvACK();" u; a- ^7 ~1 _, H" v* O; ~
}: A" S% _# ^$ K+ ^. @: v" F
) L- K$ e& l, ]& r4 i$ w
( ]$ r1 |1 [- \/ x& D/**************************************/ c, p- R) O6 p: |7 K D
从IIC总线接收一个字节数据* ?. K4 I# L2 q
**************************************/
% R9 r$ q: T- uBYTE HMC5883_RecvByte()
) x( K7 e& H8 f! \0 C{
4 \! _; L# r: ~ BYTE i;& L& c/ [+ L* w W& X
BYTE dat = 0;/ {. q2 ?) D8 j2 j
5 [/ x. E6 O6 M9 T2 X. B
A- d& r% ^' i4 a1 X" A0 | SDA = 1; //使能内部上拉,准备读取数据,
9 L1 P7 {8 G4 p1 x for (i=0; i<8; i++) //8位计数器/ [$ G* g) k3 q
{
; L/ X. i% z! ?' r dat <<= 1;0 T" p. p' ]* m- ^. Y
SCL = 1; //拉高时钟线, ~$ L3 }4 o# ~& f4 R7 y1 Y I: N4 {1 J
Delay5us(); //延时- I4 v8 v' B) ]! q0 Y& W
dat |= SDA; //读数据 6 j' m j5 s8 n# k
SCL = 0; //拉低时钟线
2 G/ x+ k+ t L8 B _ Delay5us(); //延时1 _9 k: v4 J. N) N" ^
}9 Z9 w7 h/ k+ U, N! c0 w- y+ k
return dat;
2 O% ^2 |" h3 g& w}% L/ |# ^+ x) {- C6 ^- S4 @
2 F0 t- y8 b; ?2 T9 ^: M3 D5 S7 ~& q$ Z& c- U
//***************************************************
0 l5 v* p7 v; ]* P( P! I
( q: i" w6 o- W! G
) G3 Z7 l: M; D; B& zvoid Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
- D( Y! B2 R5 @+ e9 Q" ^{
( p( i; R+ l+ F2 I5 [( ^
5 }% r* H3 I2 r! _
' A8 X! @" B8 @- O h3 [( y. d2 {- t9 y0 D# i: H' H4 a
& F" B- F$ y) b' u
…………限于本文篇幅 余下代码请下载附件…………
3 o! x3 o5 }) ?* p/ l& b2 D% n* J1 d2 Q% @2 I$ r) q) j
2 F4 N- C' w! J+ d
0 I* j3 @! P; r8 U' y- W4 f" g; y1 ^6 B6 J& T
' G7 M' H$ S7 ]
* |: C/ T: X% f
% K+ D6 U+ L* U G& G- \7 j5 i7 _) L; r7 f: M9 v" S5 o' @9 K
9 b- e0 }; u1 M8 Q6 \8 P5 g% v. C- G& f0 a
6 Z5 W& j; e* d# ~" u! ~% G" _8 p5 B7 K; a( e
|
|