简介:
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工六种模式分为连续型和一次型,连续型又分为高精度1、2和低精度模式,单次型同样分为高精度1、2和低精度模式。单次型与连续型的区别在于单次型读完一次数据就会自动转为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); //设置高精度为模式2delay_ms(180); //设置完成后要有一段延迟,手册上说最大180ms就可以了while(1){datalx =bh_data_read()/1.2; //根据手册读取的数据除以1.2就得到单位位lx的光强度检测值。printf ("%f",datalx);delay_ms(500);}
}
串口输出结果:不同光强如图所示。
工程下载:点击打开链接