MCU:MSP430 Launchpad MSP430G2452
分为:BH1750.c BH1750.h iic.c iic.h main.c 工程见附件
//******************************************************************************
//MCU : MSP430G2452 (MSP430 Launchpad)
//Function : Ambient Light Sensor IC:BH1750FVI(罗姆) C Code driver
//Sub-Function: BH1750.c
//Platform : IAR FOR MSP430 V5.50.2
//Autor : BY ding
//Versio : Demo V1.0
//Date : 2014-09-14
//Note : GY-30 Light module www.taobao.com
//******************************************************************************
//----------------BH1750 I/O Define -------------------/
//SCL-->P2.1 define I2C Clock Pin
//SDA-->P2.0 define I2C Data Pin
//3.3V supply voltage
#include "msp430g2452.h" //MSP430 Library
#include "BH1750.h" //Light Sensor
#include "iic.h" //I2C bus Protocol
#define uint unsigned int
//宏定义
unsigned char BUF[2];//接收数据缓存区
float light; //光照强度
//--------------------------------------------------------------------------
//I2C总线上的从地址,根据ADDR引脚接法不同而修改
//接GND时为0x46(写操作),0x47(读操作)
//接VCC时为0xB8(写操作),0xB9(读操作)
//本测试 ADDR接GND
//--------------------------------------------------------------------------
#define W_DEVICE_ADR 0x46 //BH1750的写地址 A0 A1 A2 均为0
#define R_DEVICE_ADR 0x47 //BH1750的读地址 A0 A1 A2 均为0
//**********************************************************************************
//延时 ms:延时的毫秒数
//**********************************************************************************
void DelayaMs(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<115;j++)
{;}
}
}
//**********************************************************************************
//向BH1750中写多个字节
//psrc_data:指向要写入数据数组的指针
//adr:BH1750中要写入数据的首地址
//nbyte:写入的字节数
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char WriteBH1750(unsigned char adr,unsigned char nbyte)
{
for(;nbyte!=0;nbyte--)
{
Start(); //启动I2C总线
Write8Bit(W_DEVICE_ADR); //写芯片地址以及确定下面执行写操作
if(CheckAck()==1) //检验应答
return 1; //若应答错误,则退出函数,返回错误
Write8Bit(adr); //写地址
if(CheckAck()==1)
return 1;
adr++; //地址加1
Stop(); //停止IIC总线
DelayaMs(50); //写入延时
}
return 0;
}
//**********************************************************************************
//从BH1750中读一个字节
//pdin_data:指向要保存读出数据的变量的指针
//adr:BH1750中要读出数据的地址
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char ReadBH1750(unsigned char *pdin_data,unsigned char adr)
{
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写芯片地址以及确定下面执行写操作
if(CheckAck()==1)
return 1;
Write8Bit(adr); //写对芯片操作的地址
if(CheckAck()==1)
return 1;
Start(); //再次启动IIC总线
Write8Bit(R_DEVICE_ADR); //写芯片地址以及确定下面执行读操作
if(CheckAck()==1)
return 1;
*pdin_data=Read8Bit(); //读数据,存入pdin_data所指的存储器中
NoAck(); //IIC无应答操作
Stop(); //停止IIC总线
return 0;
}
//**********************************************************************************
//从BH1750读多个字节
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char ReadBH1750Seq()
{
Start(); //启动IIC总线
Write8Bit(R_DEVICE_ADR); //写芯片地址以及确定下面执行读操作
if(CheckAck()==1)
return 1;
for(int i=0;i<2;i++)
{
BUF=Read8Bit();
if(i==2)
{
NoAck();
}
else
{
Ack();
}
}
Stop();
return 0;
}
//**********************************************************************************
//数据合成,换算
//**********************************************************************************
void Calc_BH1750()
{
unsigned int dis_data;
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1]; //把数据高、低8位数据拼在一起,即光照数据
light=(float)dis_data/1.2; //1.2是计算照度时的固定系数
}
//**********************************************************************************
//测量光照
//**********************************************************************************
void Light_BH1750()
{
InitI2C(); //初始化I2C总线
WriteBH1750(0x01,1);//Power on
WriteBH1750(0x10,1);//Continuously H-resolution mode
DelayaMs(250);
ReadBH1750Seq();
Calc_BH1750();
}
复制代码
//******************************************************************************
//MCU : MSP430G2452 (MSP430 Launchpad)
//Function : Ambient Light Sensor IC:BH1750FVI(罗姆) C Code driver
//Sub-Function: BH1750.h
//Platform : IAR FOR MSP430 V5.50.2
//Autor : BY ding
//Versio : Demo V1.0
//Date : 2014-09-14
//Note : GY-30 Light module www.taobao.com
//******************************************************************************
#ifndef __BH1750
#define __BH1750
//**********************************************************************************
//延时 ms:延时的毫秒数
//**********************************************************************************
void DelayaMs(unsigned int ms);
//**********************************************************************************
//向BH1750中写多个字节
//psrc_data:指向要写入数据数组的指针
//adr:BH1750中要写入数据的首地址
//nbyte:写入的字节数
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char WriteBH1750(unsigned char adr,unsigned char nbyte);
//**********************************************************************************
//从BH1750中读一个字节
//pdin_data:指向要保存读出数据的变量的指针
//adr:BH1750中要读出数据的地址
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char ReadBH1750(unsigned char *pdin_data,unsigned char adr);
//**********************************************************************************
//从BH1750读多个字节
//返回值: 0:执行完毕;1:执行出现错误
//**********************************************************************************
unsigned char ReadBH1750Seq();
//**********************************************************************************
//数据合成,换算
//**********************************************************************************
void Calc_BH1750();
//**********************************************************************************
//测量光照
//**********************************************************************************
void Light_BH1750();
#endif
|