|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程
+ Z- Q8 ]* h I3 ]& T9 n- jGY-271模块教程分享,这是HMC5883L电子指南针罗盘模块 三轴磁场传感器 的相关教程,带stc单片机。avr单片机和Arduino平台的源码。有需要的同学可以看看& ~. w4 c* w6 c+ T" T1 L
& X+ G% k# S$ mGY-271 HMC5883L模块外观图:
% q8 I5 y6 `$ }4 c$ V% O7 u. ^ 0 x9 q0 r; C% S% C- e& B
9 Z- m& ~( C& O8 C( d# HGY-271 HMC5883L模块原理图: X1 t; L9 a2 n. e# t
; {2 | I% r1 \
: @, o/ [/ z7 q ?6 @0 ]6 B0 pGY-271 HMC5883L模块尺寸图:/ p' w) j0 g) o2 d2 \0 f% v
, O0 v, G8 W4 c7 D! H" i4 a" Y) G
' D( ^+ g0 S1 \, o5 C% O7 d9 g+ \& P; b0 s+ g
. y w9 n' ^. r( }与单片机的通讯接口程序:% O5 O4 V$ ~% ]" h# {, k+ k$ u+ x
//***************************************" f- k" n) u: f Y
// HMC5883 51串口测试程序
. w: B' Y4 ~7 W0 O$ s) J, m// 使用单片机STC89C51 " C) Y7 O% [( {9 u
// 晶振:11.0592M
4 @$ ^4 h4 P8 d1 q4 J+ f// 显示:PC串口: l) [7 ^+ z: ~
// 编译环境 Keil uVision21 r7 s4 k5 ]8 j" k M! S
// 参考宏晶网站24c04通信程序
2 A8 e: S x1 L* g' D& \4 E// 时间:2011年3月1日
, E6 c8 o3 @. y//****************************************; A% p: @% g, @) P- K9 d% p& ]
#include <REG51.H>
! n5 x) t7 U& u. d$ ~#include <math.h> //Keil library 8 t; W; c5 H2 l
#include <stdio.h> //Keil library 3 Z" \. m, _: R" j2 J- E) M
#include <INTRINS.H>8 G/ m d8 E4 u/ ?) H# X
#define uchar unsigned char7 `* g8 c: S$ U' ~5 @! @+ U. u6 ~
#define uint unsigned int * U2 X+ O& [$ T
//使用的端口,请按照以下接线
* C7 B: ^0 ~; t' }1 T#define DataPort P0 //LCD1602数据端口# ~( _: W; o7 V& ~
sbit SCL=P1^0; //IIC时钟引脚定义# w. U! s- y% S% W+ S
sbit SDA=P1^1; //IIC数据引脚定义; I0 x+ p( ?% [0 Y8 @+ c& c' _
7 v' n6 |9 x' g* H; K" n# h; S6 u
7 t, t2 M! }& K4 o! k2 A( x2 u5 P% R% i+ P- `, N) l3 T
#define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址) ]# v* Q( y% W# @- G2 e: O+ W
typedef unsigned char BYTE;
) h& ], v1 b* b4 a: ^. ?' jtypedef unsigned short WORD;
5 _! V, Y$ N4 E/ [% n5 Y3 T
! N5 k9 V4 S4 O1 _3 @* n5 g* p
, v9 }' S& D) [$ E8 xBYTE BUF[8]; //接收数据缓存区 + {% @8 e" F( D
uchar ge,shi,bai,qian,wan; //显示变量
& @: M: G, q) m/ _4 `$ M" {int dis_data; //变量 ` F" E) Z) W9 U4 R( T. u
//************; R. H1 g) z4 q* S0 G
" S6 @. a" H' S" N, i9 Z& D. V. S: P. [! Q
//************
5 l, h$ z* ~; G# lvoid delay(unsigned int k);) K+ O# \5 w5 l, w( H
void Init_HMC5883(void); //初始化5883/ q% v6 I' k% ^$ q
void conversion(uint temp_data);% u3 U* _( H- X S2 Y
; o& z8 B: T/ V
' A m5 l1 G: R& Y7 g6 A7 Z Lvoid Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据7 K& j; N9 ]+ C4 s' e
//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据& ]% [# Q: s$ Z; x3 c5 @9 t- `; m2 n" s
void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据
9 V$ H1 Z; F& i//以下是模拟iic使用函数-------------1 u7 X" E" H6 a, t# M* K' `9 T
void Delay5us();
$ T! f/ c: r, r. T" j7 yvoid Delay5ms();- r' p C' O. T- f
void HMC5883_Start();" w8 a" Q% \7 L' R0 ]* r& p
void HMC5883_Stop();
$ x& N- Q5 C8 N% |1 k- Ovoid HMC5883_SendACK(bit ack);
7 L% M6 ^; p Z& [' |: [. Fbit HMC5883_RecvACK();$ v( m9 h7 H4 q* j
void HMC5883_SendByte(BYTE dat);
1 y) P4 E; h- l) t0 P' r- Q$ y) gBYTE HMC5883_RecvByte();
! E q8 s8 } p" u) xvoid HMC5883_ReadPage();+ r+ R* x& i2 ` l& T
void HMC5883_WritePage();
+ ^7 ?8 Z+ z. Z0 u//-----------------------------------
; t2 n2 w m3 ~; H, X2 r8 k1 |) e" y# F; c; b8 l+ a6 Z) d( f& Q
& z8 g. |6 t/ |6 w. D6 {//*********************************************
. E+ E. L6 J: Y( |//串口初始化- T8 f8 |& \5 c5 ~6 Y& i
//9600 bps @ 11.059 MHz
, O$ ]# D8 g( ], _' F# yvoid init_uart()
8 n: F0 F8 ~) G/ b& y8 R{
4 r+ |: V7 v1 E. u/ y TMOD=0x21; * t$ \9 k. b& B D
TH1=0xfd;
' Y& c1 R0 w& v0 E7 d) x TL1=0xfd;
9 o* ]& J3 h3 u; x) A5 d2 s" q SCON=0x50;
9 v8 B$ q, d3 J1 r PS=1; //串口中断设为高优先级别
! `# I# B7 s0 C) Z* B3 u TR0=1; //启动定时器 8 x( L: Q! l4 k: }. T% C& y
TR1=1;
9 E9 d; I" p( W9 i$ K# b" p ET0=1; //打开定时器0中断 ! l; m7 k, R) s2 I* G5 d
ES=1; * S+ H/ L& ]9 l5 m D
}& D! P/ K* H; I" U7 z
' v ~( t1 I+ H7 G( F! P
7 |0 a! {( w6 f* `//*********串口数据发送******************
, X5 w K; b+ W" _void SeriPushSend(uchar send_data)! v' n1 V# ^& g' X
{( b6 r u x {
SBUF=send_data;
2 u1 d5 F8 B- O while(!TI);TI=0; 4 Y; b) J) y. }* m
}
2 ~* b: Y$ k& ^& x6 U9 U//*********************************************************1 E2 S9 |. b+ J% }. T0 r1 E
void conversion(uint temp_data) 9 I- p1 w3 @1 P+ t7 n1 G
{ ' c- a& [2 @+ j+ D" o0 c
wan=temp_data/10000+0x30 ;
5 q2 R. l8 S" f9 \5 ` temp_data=temp_data%10000; //取余运算
' Q, V3 p! h& D4 s9 c& P1 }* t: e4 i qian=temp_data/1000+0x30 ;
1 F0 b& @/ e* `) H. t temp_data=temp_data%1000; //取余运算
/ g3 _& h# a/ W* x# g- b bai=temp_data/100+0x30 ;7 @$ c2 M }9 w' P% j# L% `& t
temp_data=temp_data%100; //取余运算
3 V# o) O3 v5 Z/ N3 a1 K( ]( j' { shi=temp_data/10+0x30 ;
" {6 [2 e: h8 V2 G$ i9 F+ Y temp_data=temp_data%10; //取余运算
/ U; _) R" s" X( v0 n: q ge=temp_data+0x30; $ r4 [: c3 c( v5 A& S0 e% Y! f
}0 [" {' i$ z# h7 ^, {
( G. A8 F: p4 X1 [7 e7 S4 ]4 { D( A' e% P/ f, P3 h
/*******************************/$ ^" u, ^2 Z; ?
void delay(unsigned int k) ' V! G$ _7 e( Q2 \
{ 9 X3 P7 f- b. Y0 v" }9 t/ z
unsigned int i,j; 2 z8 m4 |2 M8 P, z
for(i=0;i<k;i++)
4 T4 K6 H1 ~9 v" P" d{ % P) i$ `! Q/ Q5 t8 N# W: U/ D0 l
for(j=0;j<121;j++)
4 H6 X" N: J" B. _# f3 i{;}} 0 y0 [5 V' W0 N, c: N" ?
}
) f( p- t; k) x- E) t/ R 1 r/ V- ]8 S% m4 v3 f
M1 S2 r0 g' ~7 C+ J7 o
1 C& B4 A: [. `' d/**************************************2 @1 `' s$ E/ ]" F9 [
延时5微秒(STC90C52RC@12M)
9 y# H/ S/ ~( o( y不同的工作环境,需要调整此函数,注意时钟过快时需要修改
4 O/ z, b: \ A7 K ^当改用1T的mcu时,请调整此延时函数
6 r- a+ v% r' q& O**************************************/7 Z5 d9 N1 g# H! _: G2 C# j
void Delay5us()
2 k4 y8 A5 X3 Y. p{
* x0 z- Q r/ I0 A* g3 `; u2 d _nop_();_nop_();_nop_();_nop_();
& ]' D3 S( I* m7 B1 A _nop_();_nop_();_nop_();_nop_();
t+ y3 k2 r, Q) Q _nop_();_nop_();_nop_();_nop_();
4 Z* |# N% h2 ] _nop_();_nop_();_nop_();_nop_(); c$ R, n5 ~) Z* ~7 L
_nop_();_nop_();_nop_();_nop_();' g! I) Q2 @" J, l8 r* s' f
}- p4 d Z5 a. r% x0 Z/ \3 r" l$ [
% `8 d% H) C& V) S
) D' g) f+ l0 m0 P
/**************************************
* E( I4 c: K. q延时5毫秒(STC90C52RC@12M)
- F% a* h2 h6 \* X: r: X# g不同的工作环境,需要调整此函数" p* q$ J0 Y0 Q& Y U
当改用1T的MCU时,请调整此延时函数
+ A' n7 U$ |; g! P# y**************************************/# J% V" o1 J, s- C, T1 F0 z
void Delay5ms()0 Y% T# \* s) W
{/ X( t& r h: \: A# d8 e
WORD n = 560;. M: X1 m5 y0 O! g7 X, D* P
. L, b: A4 I6 x4 K- Z
8 x8 m, F, D( S" ] \5 a9 b while (n--);
6 n0 Y1 B8 Q8 U+ f& q' [}
9 ?7 [3 V" _2 u2 T5 b6 j, ~" B3 A' q
$ A* w% A' t' O1 _! B$ Q- @
/**************************************
3 d) m9 G& E, k8 A8 m9 [: z# [起始信号
! s4 U$ Y1 r- e9 U* \**************************************/
1 ^5 } B0 A, g4 U) ^9 p" [void HMC5883_Start()
- s' \3 m4 H( W; p( _$ m{- V0 Q4 C! b1 @2 ]5 k6 a) f
SDA = 1; //拉高数据线5 m8 |" z- u" v* Q
SCL = 1; //拉高时钟线
- x& s t* r7 a) p: e Delay5us(); //延时
' I, X' M$ `* C) O" P' i SDA = 0; //产生下降沿( S& {- U/ ?4 i) ^3 B3 y( ^/ U, P
Delay5us(); //延时9 x1 H& y* |& ^7 P: s0 [4 }
SCL = 0; //拉低时钟线3 v9 i, \. p! J% h% t2 G2 n
} X4 P* g. a) ^0 [. W9 D
) ] h f: y; F M" y3 z
1 d* Y \4 D+ J. L% U/**************************************( Q( w- z- U. F
停止信号( J2 q8 J. N4 T9 ~* {
**************************************/6 s2 c, X7 n0 S4 g7 j" ^6 p0 v
void HMC5883_Stop()
+ v" {* f! t) r" D; D$ X{. a# Z. n" d1 }& X9 s+ Q6 w
SDA = 0; //拉低数据线
* S& w! S+ T# R; y SCL = 1; //拉高时钟线
% O9 o- o7 q/ ~( h8 x* m Delay5us(); //延时
g$ b. S( Q2 O5 r' G SDA = 1; //产生上升沿3 g) D. b% s- t( h, D
Delay5us(); //延时
$ l6 ^! Z$ Z" D$ ~% u3 F}, X6 {! ?4 Z b( O' z
. A7 |# D6 G, p) H# ]5 i2 i8 o) _4 n* \' f8 } q8 O! n
/**************************************2 t6 a7 {& C4 H1 F
发送应答信号, B) k" W$ R; ?" O3 ~ F
入口参数:ack (0:ACK 1:NAK)
2 \) y& h% } K" C4 `**************************************/
" x/ G5 K% S+ z+ Gvoid HMC5883_SendACK(bit ack)
# g2 l- o/ E! J8 F{: ]+ ?! T% {& `% Z
SDA = ack; //写应答信号# x" [6 h+ S: c7 l |* n( p
SCL = 1; //拉高时钟线9 O# e/ v9 N3 l' |; p$ M
Delay5us(); //延时
f1 g( b1 `1 h SCL = 0; //拉低时钟线
! l. A2 L) @+ @* Z% X Delay5us(); //延时
) X6 Z% ^0 P- [. h8 e; n' o}: Z' A2 O. H* a( n" F3 B9 G) w
! u, N7 Q& K6 X$ g! r n9 H9 c
- e; x8 W L) A: ?7 o z/**************************************3 T1 v0 f8 g. k& z
接收应答信号6 a9 _) J4 h6 U" E; ~
**************************************/# a( E. u& y9 N4 w+ l" ^& F( b
bit HMC5883_RecvACK()* y- f5 y) f4 U" I+ u: ]
{
9 t* u- @; a+ E/ _1 s SCL = 1; //拉高时钟线+ J0 ?3 N4 \5 m* P0 L% S
Delay5us(); //延时
q: \. Y5 o# E+ g5 F) Z CY = SDA; //读应答信号( S. s; }$ L1 d) T, n0 E1 K
SCL = 0; //拉低时钟线! z0 c- P& m1 |' h
Delay5us(); //延时, v% i9 _: a, Z
, x( {4 F. I; b; Z" i; C6 Q
$ q3 ] R/ O* d7 ^5 f0 L7 B* w6 A return CY;
6 Z X: [1 t' q}* K% g9 y4 e/ `2 H9 R& X4 I* [- J
& n9 o$ l8 G$ _8 x; `
) g4 s& Q; ~0 `3 d- c
/**************************************) ` X2 Q: M5 n6 s3 g' Y
向IIC总线发送一个字节数据
2 B, j( L3 w Q4 ]1 V0 k9 ?$ e**************************************/
# D! x( g$ |( q5 M) Y0 i2 _: U: Tvoid HMC5883_SendByte(BYTE dat)
- t! k2 @ |% X3 e" r8 P( ?{7 Y) `# w `* N% m- N3 {
BYTE i;
x" F' \! {$ Y' W; M) {1 G( W: ]) M3 Q& F' ^
& Q, [9 l7 M* S$ h; l
for (i=0; i<8; i++) //8位计数器
( h9 j+ s/ Y- X% }% D3 o {. F/ H% V# w- Q$ w* l8 C
dat <<= 1; //移出数据的最高位
- P+ T& M' l5 w2 z/ U F SDA = CY; //送数据口
% i7 l, {4 x2 X$ N2 o SCL = 1; //拉高时钟线+ X |( e" s+ ^
Delay5us(); //延时
# j2 v1 {, v6 M! h) z SCL = 0; //拉低时钟线
; b! z2 C8 f* ]6 H. |; [7 z. } Delay5us(); //延时
7 U" o; z$ d' M8 e2 x- Y, a }
( A7 S# w0 {2 K/ u0 J6 P HMC5883_RecvACK();# m0 i0 g3 N1 i, @) |4 {1 M
}
+ p4 K. J8 K+ A; A1 O$ C* D& O" N' s
( T% ?& u u! P/************************************** x4 q+ t0 r) ]% Q% C- A# y
从IIC总线接收一个字节数据
8 A. a3 N1 E: A, v9 g' M! o5 T**************************************/
h2 c' G' r: A3 x8 {; T1 K* }0 j0 J JBYTE HMC5883_RecvByte()( L& {( T4 v: m) f
{
! Y% f8 T" h+ D: v, c; x3 Y BYTE i;
8 t p n" y' j! K, o BYTE dat = 0;
/ f6 T6 R$ d5 l$ ?9 [! f/ F# B& P( `/ {/ I# P* K
2 v& p, G' L$ V7 R( P# z SDA = 1; //使能内部上拉,准备读取数据,
) S- c, a0 Y/ n4 X for (i=0; i<8; i++) //8位计数器9 w/ S4 T$ S! @" N1 I( a4 a
{( d$ y0 r8 k- X1 s. U
dat <<= 1;: b4 a+ Z7 Z" j! j5 p0 D
SCL = 1; //拉高时钟线+ @7 ^ ~* r1 \1 a" e3 t9 M& n
Delay5us(); //延时
3 v3 y5 ~. T# H* Y; B7 S2 j dat |= SDA; //读数据
8 b4 I* x( N/ p1 e% X' O SCL = 0; //拉低时钟线& F, b( O4 A# {0 I6 d+ E; X; w/ p
Delay5us(); //延时
/ p4 C/ x! y, `* y2 I( A }1 ^; S( i( s8 {) l
return dat;
6 P2 Y f& O) K* {4 l}# u* M% B) o# q
, ^+ K; c# z6 o
. h& m2 T% x' I1 {, e3 D//***************************************************
2 F4 U) S9 c$ C7 P7 T b) G/ A9 b) D* K l7 ]9 |% a6 `
4 _: I# y5 U9 e' d# u
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)8 E6 m k) k. t! P [
{
$ g2 H/ T- \+ b4 c! f& N, y% e9 r1 `% P/ k' ^/ X/ c- a! P
' u. z: J, R' Y7 T/ {0 w& D
7 e z/ [1 p- d8 m! `. ~7 K( U3 y- n! C' J5 ]! A4 a9 `
…………限于本文篇幅 余下代码请下载附件…………' e0 F; u' J B" ~2 K$ j2 v
: A% m$ x" h; b' ]- _: H+ W, |
. h2 S: r0 K+ |) s6 U
( e! R, X ^$ A2 g, j( `
( [4 I" k# p. N9 g" x0 d
- r4 a1 L" M" m- `$ W2 b7 {) Z8 ?0 e& y
D+ T/ B, Y# O6 m
$ n& k1 c2 E. l$ \" r6 B1 \" |- [
5 n1 m" m+ K! {1 }3 L' [4 j& F
* I! P" N8 q( t" U8 s% @
|
|