查看: 1093|回复: 0
打印 上一主题 下一主题

MSP430 Launchpad BH1750光照传感器

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-30 10:15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表