|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程% \( I# ^5 J) u5 z+ Q& o
GY-271模块教程分享,这是HMC5883L电子指南针罗盘模块 三轴磁场传感器 的相关教程,带stc单片机。avr单片机和Arduino平台的源码。有需要的同学可以看看6 k1 I% T" N6 u
4 D# {9 I. D( @2 AGY-271 HMC5883L模块外观图:( }% f0 r% |/ R! [
7 d# h3 _( z B" A- ~
, i, R7 o* z& O1 o6 n; U4 e) GGY-271 HMC5883L模块原理图:
y/ i8 U/ @( T 7 y- {) Q1 n, ]. Z e
4 V* @/ A; z* V$ v0 S& k
GY-271 HMC5883L模块尺寸图:
3 J; q9 B/ u# w X1 J; X; P 9 e6 D; l& H& T1 r8 H
* W# c: t7 d8 C' q9 Q7 e5 [5 l# [
9 x7 Y7 w" e2 p$ Z2 R3 l
7 ]9 @9 a7 i; o* r0 D! F7 I3 S
与单片机的通讯接口程序:
7 a' c- u% ^! _, b) ^' J//***************************************
- w$ L5 c$ B+ Z" k/ f// HMC5883 51串口测试程序
5 L0 q1 R+ N8 N: w: n// 使用单片机STC89C51 4 j& R" V0 b9 e5 i. J
// 晶振:11.0592M
7 y; t5 F/ ~, I: V' q4 i// 显示:PC串口1 J5 |8 [4 E8 |
// 编译环境 Keil uVision2
% {; f# D4 O8 q// 参考宏晶网站24c04通信程序5 ^* [9 O5 U7 C" O; e0 t
// 时间:2011年3月1日
4 y# ?- M; a; S3 \$ L- C//****************************************1 Y2 d6 K' b# h& y
#include <REG51.H> 7 p5 Q2 Y8 `; g" @: b
#include <math.h> //Keil library
0 e& x1 U: |( a; r8 H8 ]+ |#include <stdio.h> //Keil library
- k: l9 [' P/ P5 f#include <INTRINS.H>. l2 a4 {0 k3 r' q# W1 t2 b X
#define uchar unsigned char
* J3 v3 n0 C# U) x' ]8 O+ Z#define uint unsigned int
7 y9 ]3 W4 J$ T//使用的端口,请按照以下接线
: ]/ a- O. q5 ]& M#define DataPort P0 //LCD1602数据端口
" R, H& k* \. I4 R5 Msbit SCL=P1^0; //IIC时钟引脚定义2 ~! F7 W/ \# w. N4 P, k! K9 _
sbit SDA=P1^1; //IIC数据引脚定义! }! R0 T- I Y0 c* u4 f
4 g, c8 h i9 t, I4 s/ }
& T* S1 Q2 @( Y: q/ U7 T5 [( o) \& Y" o
1 ?7 J: ^( T4 r3 a
#define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址/ q0 t$ [ }2 @. g' _; R4 R5 K6 @
typedef unsigned char BYTE;
) }% l) a2 L$ Z- Otypedef unsigned short WORD;# |% i, {3 M. b7 D
. H4 W& h8 p* l* }, w! t- _2 n- |0 M p! v" v1 p$ l- l4 w# t: o' p
BYTE BUF[8]; //接收数据缓存区 8 _4 J5 P7 t& p8 m$ C
uchar ge,shi,bai,qian,wan; //显示变量
" n/ a" K! e8 _ i3 C" }- j: f Zint dis_data; //变量
: O/ R( @8 I: ?* R//************# D& P$ {1 t# j0 o; H7 B4 v
6 e9 f) A( W+ ]' ]5 Y, Q
+ U6 a. e! Q6 ` t5 f( r% l7 v2 y//************# s; F5 M1 g* M; j
void delay(unsigned int k);0 z$ W) b: z# d- }
void Init_HMC5883(void); //初始化58837 h, H) O8 W% f3 u3 _3 D% |- J
void conversion(uint temp_data);
5 Y$ K7 G5 `4 g! J/ @$ }! a s4 s, I) S. g3 I/ N
: z& y/ @, j5 E; k
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据+ e* p: U: D$ G5 u5 F' _- r: q7 h* b
//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据
1 ?' j! @2 t0 [3 @void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据
2 f4 f2 b' ]- K/ j. A//以下是模拟iic使用函数-------------
9 d' }- X4 ~7 ]& Dvoid Delay5us();6 T) l- G, ?$ e0 z- F$ x6 {
void Delay5ms();
+ z$ ]6 ? Y- z& C) Hvoid HMC5883_Start();
" w( a0 a/ z8 I( O. w5 e) W8 F5 ]3 _( Hvoid HMC5883_Stop();/ Z* p+ m {* t4 k
void HMC5883_SendACK(bit ack);8 a+ x* ~$ e) x* C' e- A0 g
bit HMC5883_RecvACK();8 \ Y% O4 h8 @, b) O' @
void HMC5883_SendByte(BYTE dat);
: z( u# m7 p- u6 i% r) |, {% ~1 KBYTE HMC5883_RecvByte();
. X# S7 N3 h: X6 @4 F3 n' h0 jvoid HMC5883_ReadPage();
. u( N/ P1 B' u, N8 z) h5 I4 Nvoid HMC5883_WritePage();
" T- E. Z9 m- }: f6 |' h9 t6 P//-----------------------------------
6 T, b. N' R6 Q: L4 _ ?8 d! a% q3 V! ?- }+ F8 H7 ^! T4 R
( Q6 y" i8 d/ }2 b! N5 @ n# r7 B: z& ]//*********************************************
( }; n; }8 d5 w, B//串口初始化0 O8 H1 M; [+ l4 B* p) a
//9600 bps @ 11.059 MHz M- `$ l. N; V. I. _0 ?$ ^
void init_uart()1 h4 E9 w+ u9 B& J9 `+ ] ?1 {
{# S" S( w8 v( |4 n7 Q% P
TMOD=0x21; * d, H4 n h4 d: x' w+ F
TH1=0xfd;
& P5 c; {# {; Y$ D: l: K: I TL1=0xfd;
9 @- D4 g7 m; A9 E, r, ~ SCON=0x50;0 y" I4 ]: d) @0 _* I. i" d
PS=1; //串口中断设为高优先级别
/ M1 `' Q' @& V; k8 e TR0=1; //启动定时器 2 _' c0 x7 k6 c, F6 z0 i
TR1=1;
4 d+ k- X0 N z) v9 I S2 { ET0=1; //打开定时器0中断 % T0 D7 N2 m# p1 l. ]5 z! X; b
ES=1;
S4 K- ^& L# j4 l5 @+ \}
! Y5 k& y" u1 f/ p: E" b3 v# N7 ~9 I4 t, A
8 b2 I9 k* k" m7 Y3 B K
//*********串口数据发送******************
# y) H! M8 o1 P% @. k' t/ D" yvoid SeriPushSend(uchar send_data)6 w$ W$ |+ y8 g4 u- Z/ E+ Y5 B
{
. M5 L4 M8 n* {. o# P5 S SBUF=send_data;
! O" Y" s2 _, p( g2 o* Z) \! U while(!TI);TI=0; - m2 O6 G) K/ c2 a7 ~
}
! o* D7 I+ r7 g7 ^//*********************************************************
! j: d9 q8 J2 q4 h$ jvoid conversion(uint temp_data)
: @& N( `3 P3 r7 z5 O, y{
2 o6 U& o. v( K& z" N& U# d1 [# a wan=temp_data/10000+0x30 ;- H/ r# M" j; \5 J2 r4 _. q5 F' X% v
temp_data=temp_data%10000; //取余运算
7 F9 V/ {1 |( Y0 _; f qian=temp_data/1000+0x30 ;
/ a. ?& c1 h+ m temp_data=temp_data%1000; //取余运算
, ^1 y5 Q1 f( a( ~7 b bai=temp_data/100+0x30 ;
: a, I0 Y/ Q+ i0 A% k9 k temp_data=temp_data%100; //取余运算
9 U" S, ^' f7 A shi=temp_data/10+0x30 ;
2 A7 g9 {. w. ]3 o, V5 I temp_data=temp_data%10; //取余运算$ f# x& L% T7 [! c) L3 Z2 A
ge=temp_data+0x30; 9 F8 u7 M, y" t, G
}+ O Q9 r& H d6 A! j
6 Y8 F1 N4 [- `% B/ z- G( E; x7 p. }8 U& k
/*******************************/* Y' ]; Q" B1 h8 e
void delay(unsigned int k) , u. @% L- F1 ~3 N# `! U
{ % ^. K1 s8 v+ N+ |4 i) `2 y
unsigned int i,j;
- I7 B7 Q4 J2 m# X( L! bfor(i=0;i<k;i++)/ W1 l) w+ [. [! U) e( U! M7 t, A
{ 4 X( l, P$ L/ _* _+ e
for(j=0;j<121;j++)
0 K) t0 [. f- Z) Y) n5 }) r4 b{;}} 4 {. }4 v1 l9 o! t: c. H9 k
}& }, C5 J' C5 m* {
. g* p# x7 b. w) e) Q8 j+ a, ^2 ]- ^3 t' j3 ?
9 ?3 Y) X) x; V# s3 m/**************************************
4 F/ Y; q* ?# h7 c延时5微秒(STC90C52RC@12M)
2 a* p9 w" ?" Q! S/ c& B不同的工作环境,需要调整此函数,注意时钟过快时需要修改# c2 x8 a+ [+ a2 g' i. y
当改用1T的mcu时,请调整此延时函数3 F5 X8 W9 s8 K5 s
**************************************/- o* Z: \9 |% k# {/ `) l9 Q
void Delay5us()
( t$ x" Z2 C+ J+ y9 x" l{& N0 B6 ]) }" f* d/ k, a3 n1 A
_nop_();_nop_();_nop_();_nop_();5 s1 P, m, A9 [5 h, Q& I! c9 F* I
_nop_();_nop_();_nop_();_nop_();5 N$ Z, g; N e3 X! t
_nop_();_nop_();_nop_();_nop_();* O. V9 ?2 P7 D: Z4 D! M' L' o
_nop_();_nop_();_nop_();_nop_();0 Q7 Z7 P7 X0 y7 f
_nop_();_nop_();_nop_();_nop_();7 z3 U, C. Z3 I3 t
}
" i. J. q9 u0 F8 ?. v3 W% I# k# [0 A7 D" r+ _6 r
' X9 K7 J. j% @+ e: N
/**************************************
% J: ?; D# _% Y, W延时5毫秒(STC90C52RC@12M)
5 d, h5 S9 p% e) h不同的工作环境,需要调整此函数
& d: I, T' ?% D- B) I当改用1T的MCU时,请调整此延时函数
1 u y `7 O& `3 l9 d/ M o**************************************/
8 T2 p" y2 j9 S6 @void Delay5ms()3 j5 J6 O3 a9 u! r2 ^+ I
{
6 B. R, P' F$ K1 U WORD n = 560;: \8 ^; K, H! ~" C
, n% F' e; Q; v4 u. U& ?# c
* S. l7 d# y/ @4 Q5 e! J! A Y
while (n--);
- c3 y3 b. i# y8 {( a* m}
" I) y( {2 I, [7 c$ G( L# ]& q" p2 j0 C; X
% w' u0 d. v2 n6 \1 a3 k S/**************************************+ M& |0 B$ ^" k5 `! l! J8 x) n9 w
起始信号
. c0 g7 E2 _0 f**************************************/
8 @& x$ y; d/ i5 j* x- n# uvoid HMC5883_Start()- ~$ j, w; k4 F& T% @2 R- n
{
( N2 x% f9 A% P SDA = 1; //拉高数据线: ?. ^% c$ D& t6 ?5 G8 k2 T
SCL = 1; //拉高时钟线
& n+ f8 N- E: X* U4 r. j$ e" { Delay5us(); //延时: E3 _+ G" A* [" a c8 {6 g
SDA = 0; //产生下降沿8 q1 q# ~( q) j# w! _/ f
Delay5us(); //延时
8 M! ?4 H2 i D$ C' A! L SCL = 0; //拉低时钟线
/ ?* N# D* g' Z}
1 \% w8 r5 C( d9 }# i9 z( X1 J! S) q
: y; X. _# F `* u
, J2 H$ V6 |. K8 z$ F/**************************************
$ T% i5 S/ x" o9 Y/ Q) L) D停止信号: B9 }* w; I7 Q7 k, A+ `4 g3 c# N
**************************************/
8 d2 k j; z. pvoid HMC5883_Stop()7 q0 e8 B$ w# c/ B9 e
{- f0 y* _4 `; i- k; C2 \
SDA = 0; //拉低数据线
) k% ~* W' p" l& Y$ S2 F8 L8 j SCL = 1; //拉高时钟线
- L2 v* ^! ]2 S6 C# _$ g4 c5 W; q Delay5us(); //延时* C4 P0 F* ?' H
SDA = 1; //产生上升沿
* O' r% p4 A c- j, `- U$ r Delay5us(); //延时" d+ N, F* ^* y5 t. u
}
0 n& t }2 A: C4 \) P
, }4 L2 \& z% _# ^' t6 _9 ?% e4 I2 a- M9 i7 Q' D5 n9 _8 O
/**************************************5 a: c7 L* ]! N* I! @ K. F
发送应答信号$ n1 R, p; z* J" T+ M2 Y
入口参数:ack (0:ACK 1:NAK)- K- Q3 A+ x5 m! v2 j9 f! s1 d9 O
**************************************/. |+ v$ Q k. O" ^) n F5 U# N6 f
void HMC5883_SendACK(bit ack)
; R( |& _( z2 Z t1 a, C* t{! t0 w# |6 y8 n9 c( t
SDA = ack; //写应答信号
! i( J3 a0 c2 p: i SCL = 1; //拉高时钟线
! _7 {" D4 U, V) S Delay5us(); //延时
/ `3 q6 ?7 S+ j4 Q9 c3 f4 O% W SCL = 0; //拉低时钟线
9 `4 s9 N; `' r: Y Delay5us(); //延时
$ i h. `& G; a1 p& l}1 F& S, g" v, p8 T0 w, ?
+ J, B( q3 [1 M& H/ Z' T. u" n6 J3 R. e1 Z- }9 d) j S4 O
/**************************************
* y& Y) h4 A3 ?+ y接收应答信号/ K! \1 K; X& \& F& o
**************************************/5 g N" o; F$ Z* V
bit HMC5883_RecvACK()
$ ~5 [" X& F/ A: `# a: l5 z{5 H# X; K( N2 N" G( [# W* h
SCL = 1; //拉高时钟线
. F3 ^3 s b* r" k) D5 s8 ?5 w' a Delay5us(); //延时
# x1 N: p: ?8 n5 {, t& W: \8 ?" { n- I CY = SDA; //读应答信号
9 z% J' U2 E" k! |$ X SCL = 0; //拉低时钟线) C8 ~$ P5 [% ]+ S/ T( a
Delay5us(); //延时
. b3 S5 F4 d- B+ t- [/ _; o; R6 p$ K6 A- \2 |/ ~! r% F3 K, U
6 _- Y; j! Y! @, L8 V( E return CY;
- A5 [# P5 e$ [8 Q8 T$ a; p}
) b: s$ J( J: b# H U0 J+ H0 U& \
& {& S$ W; o) y& W# H
/**************************************3 t9 H( U- K* L0 _6 G2 u8 P- O9 |
向IIC总线发送一个字节数据& F i! i' s% D1 ^9 M' }& S9 U/ h
**************************************/& |$ S% x* X" d1 w8 g" E6 d
void HMC5883_SendByte(BYTE dat)$ A" p/ X7 z" q& a" s( X
{- v h& U% R+ `' ^, y. c2 I0 t0 X
BYTE i;# T* I+ ~+ L5 n* C0 H. d
- n( w+ h9 L* X
1 j' \1 G" Q0 O# k! u( ` for (i=0; i<8; i++) //8位计数器* T/ W( W2 |, X. r% t% [4 O
{, \, O- }/ N" V$ M4 m) e/ U
dat <<= 1; //移出数据的最高位: e; l) {4 e: |( Q
SDA = CY; //送数据口
/ l, F/ f2 o3 T R6 X2 k7 d" j SCL = 1; //拉高时钟线
0 h/ |) }# J$ Y: Y6 G1 _+ j! N2 O: d5 R Delay5us(); //延时$ V* b$ m' m2 l$ w+ }
SCL = 0; //拉低时钟线
5 n( g6 `3 }, w- ?! {) ? Delay5us(); //延时
; Z0 S; p- X' U0 T1 v }
6 r, W- K8 L& W+ P HMC5883_RecvACK();8 e+ D; }: {7 L
}6 V6 ?* @' e/ _! J2 ^8 ~
/ N& `4 C3 Z6 g) M* }$ k u9 O Y, h
2 ]( V- ] Q; o2 w( B/**************************************
3 G% Y9 R4 n% G; f- n1 v7 N从IIC总线接收一个字节数据
) U/ R, M/ n# z3 [; @8 D9 E. t9 K**************************************/
4 _$ C" q f, L2 W# A9 B- {, BBYTE HMC5883_RecvByte() }( f6 A) U" I$ X6 G
{3 c2 I# k0 ^) w
BYTE i;. [* n) y7 h5 d# V$ d8 a
BYTE dat = 0;) k* H# s6 e; t0 B; T
$ V* G: y' z, L p0 p
- n# A- M+ h* u& G( o2 Q SDA = 1; //使能内部上拉,准备读取数据,8 ^" f. B* n5 P8 F
for (i=0; i<8; i++) //8位计数器! c5 k/ i$ d: n/ e S
{0 N6 a5 R4 i1 Y3 E7 z4 i
dat <<= 1;) [2 q8 g9 i X; b% {: Y, d+ B/ M
SCL = 1; //拉高时钟线
+ U' L; d% }9 E k. E Delay5us(); //延时
: G$ V7 K ]% v' d0 r& E dat |= SDA; //读数据
8 _; \8 K5 s4 c4 Q1 c; r SCL = 0; //拉低时钟线
9 u* {7 b; U- \5 m* O Delay5us(); //延时
3 Y$ V$ }! \ N# c }8 c8 g9 i% @+ \7 e8 Y% I
return dat;
* F% X# }+ v; v( w}- G; n, r; y+ A, _/ M$ |
0 G# g7 v+ {& \! ]6 A9 u
0 `3 X: y N# o2 l) K3 @* N# Z, o' i
//***************************************************0 H% J4 l$ ]; p5 G1 F" h! y
1 m$ v; K1 L' U' \6 p M7 c7 a# s
f) `, q2 V9 l; k$ E
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
$ N4 ?. _4 a/ g' R: v$ c{
6 U2 t# e c/ c: X% \. `
7 R) B5 X: E' {: o, D ~2 n% |- E$ W( R9 D
0 Z1 p b$ ~# W n% z8 H4 l9 E+ ]7 O0 c5 d5 x, H6 I/ G4 E+ a3 ]7 i2 ~
…………限于本文篇幅 余下代码请下载附件…………
7 `$ W0 _" u7 u, `3 a' n6 w
4 q) d5 R1 e4 x2 q
4 L: F/ A( Y/ ~! b$ L* y9 s8 T6 w/ L* ?) E7 b
: b3 v0 f9 v) T- w& Q1 j: ]
0 N" u% v5 y* v, w' h8 B/ t
( _% y' M2 S# A2 C( e2 V+ _9 q- C+ s9 ~; S% n) I( [
1 d3 h" x. c% F) X: j, H+ V+ y
$ z! h" @3 A* S) A& E9 D
4 b+ m) z9 m8 q; M/ Q1 w) j% z8 r
4 F' x$ M0 Y; R/ Y: I" {' }
|
|