#include <Wire.h>
#define congji 0x1E //HMC5883地址
#define peiA 0x00 //数据输出速率和测量配置寄存器地址
#define peiB 0x01 //装置增益配置寄存器地址
#define moshi 0x02 //操作模式寄存器地址
#define X_MSB 0x03 //X 的高位数据地址
#define X_LSB 0x04 //X 的低位数据地址
#define Y_MSB 0x07 //Y 的高位数据地址
#define Y_LSB 0x08 //Y 的低位数据地址
#define Z_MSB 0x05 //Z 的高位数据地址
#define Z_LSB 0x06 //Z 的低位数据地址
#define zhuangtai 0x09 //装置状态寄存器地址
#define shibie_A 0x0A //识别寄存器A地址
#define shibie_B 0x0B //识别寄存器B地址
#define shibie_C 0x0C //识别寄存器C地址
int g1;
int g2;
// 写数据
void writeRegister(int deviceAddress, byte address, byte val) //对装置(HMC5883,地址为congji)的对应地址(所有可写的寄存器地址)进行写数据
{
Wire.beginTransmission(deviceAddress); //向HMC5883(地址为congji)申请操作
Wire.write(byte(address)); //向HMC5853发送所要操作的地址
Wire.write(val); //对你所申请的地址进行写数据
Wire.endTransmission(); //解除申请
}
// 读数据
int readRegister(int deviceAddress, byte address)
{int g;
Wire.beginTransmission(deviceAddress); //向HMC5883(地址为congji)申请操作
Wire.write(byte(address)); //向HMC5853发送所要操作的地址
Wire.endTransmission(); //解除申请
Wire.beginTransmission(deviceAddress); //向HMC5883(地址为congji)申请操作
Wire.requestFrom(deviceAddress,1); //向HMC5853申请要操作的数据字节数
while(Wire.available())
{g= Wire.read(); //读你所申请的数据
}
Wire.endTransmission(); //解除申请
return(g); //返回读取的数据
}
void setup()
{
Wire.begin(); // 初始化,加入I2C总线
Serial.begin(9600); // 初始化串口输出
writeRegister(congji,moshi,0x00); //配置工作模式
}
void loop()
{int g;
//读X的值
g1=readRegister(congji,X_MSB); //读X高八位的数值
g2= readRegister(congji,X_LSB); //读X低八位的数值
Serial.print(" X_LSB=");
g=g1<<8|g2; //对高低位数据进行处理,这步处理我是看别人写的,我不会,数据应该要处理吧!
Serial.print(g); //发送X的值
delay(500);
//读Y值
g1= readRegister(congji,Y_MSB);
g2= readRegister(congji,Y_LSB);
Serial.print(" Y_LSB=");
g=g1<<8|g2;
Serial.print(g);
delay(500);
//读Z值
g1= readRegister(congji,Z_MSB);
g2= readRegister(congji,Z_LSB);
Serial.print(" Z_LSB=");
g=g1<<8|g2;
Serial.println(g);
delay(500);
}
|