BH1750 STM32 驱动程序

版权声明:欢迎交流,共同进步! https://blog.csdn.net/shenhuaifeng/article/details/54956893

简介:

BH1750FIV是一个采用标准IIC总线接口的环境光强传感器,此传感器适用于获得像键盘LCD和手机背光灯等光强。买的淘宝上贴好的模块,gy30

指令码:

/*************************************************************/

#define BHAddWrite     0x46      //从机地址+最后写方向位
#define BHAddRead      0x47      //从机地址+最后读方向位
#define BHPowDown      0x00      //关闭模块
#define BHPowOn        0x01      //打开模块等待测量指令
#define BHReset        0x07      //重置数据寄存器值在PowerOn模式下有效
#define BHModeH1       0x10      //高分辨率 单位1lx 测量时间120ms
#define BHModeH2       0x11      //高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL        0x13      //低分辨率 单位4lx 测量时间16ms
#define BHSigModeH     0x20      //一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BHSigModeH2    0x21      //同上类似
#define BHSigModeL     0x23      // 上类似
/*************************************************************/

BH1750FIV工六种模式分为连续型和一次型,连续型又分为高精度12和低精度模式,单次型同样分为高精度12和低精度模式。单次型与连续型的区别在于单次型读完一次数据就会自动转为PowerDown模式。

各模式测量所需时间

时序图

Bh1750采用标准的IIC总线结构,驱动程序也简单,从图可以看出设置高精度连续读模式先发送IIC起始信号再发送7位器件地址+1位写标志位也就是0X46,然后从机应答之后在发送模式指令等待ack应答后发送IIC停止信号这样一条模式就设置完毕。代码如下:

void bh_data_send(u8 command)
{
    do{
    iic_start();                      //iic起始信号
    iic_byte_write(BHAddWrite);       //发送器件地址
    }while(iic_wait_ack());           //等待从机应答
    iic_byte_write(command);          //发送指令
    iic_wait_ack();                   //等待从机应答
    iic_stop();                       //iic停止信号
} 

读取数据参照时序图也比较简单,先发送IIC起始信号,在发送7位器件地址+一位读写标志位,等待从机ACK应答,这时主机开始读取IIC数据,再主机读取完8位数据,主机要向从机发送ack应答信号告诉从机接收数据完毕,然后再读取低八位数据,主机发送非应答信号然后结束IIC通信。代码如下:

u16 bh_data_read(void)
{
	u16 buf;
	iic_start();                       //iic起始信号
	iic_byte_write(BHAddRead);         //发送器件地址+读标志位
	iic_wait_ack();                     //等待从机应答
	buf=iic_byte_read(1);              //读取数据
	buf=buf<<8;                        //读取并保存高八位数据
	buf+=0x00ff&iic_byte_read(0);      //读取并保存第八位数据
	iic_stop();                        //发送停止信号 
	return buf; 
}


     这样基本驱动就写完整了下面写一下综合测试代码:

int main(void)
{
	float datalx;                 
	USART1_Config();
	delay_init();
    iic_init();
	
	bh_data_send(BHPowOn);    //发送启动命令
	bh_data_send(BHReset);    //清除寄存器内容
	bh_data_send(BHModeH2);   //设置高精度为模式2
	delay_ms(180);            //设置完成后要有一段延迟,手册上说最大180ms就可以了
	while(1)
	{
		datalx =bh_data_read()/1.2; //根据手册读取的数据除以1.2就得到单位位lx的光强度检测值。
		printf ("%f",datalx);
		delay_ms(500);
	}
}

    串口输出结果:不同光强如图所示。

     工程下载:点击打开链接


展开阅读全文

没有更多推荐了,返回首页