提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、BH1750是什么?
二、如何使用BH1750
2.1 BH1750的通信方式
2.2 BH1750的指令集
2.3 BH1750的时序图
三、 BH1750代码详解
3.1 硬件IIC配置
3.2 BH1750的读和写
3.3 主函数
四、演示
工程:
前言
写这篇文章的原因是自己写毕设的时候用到了这个模块,故分享一下BH1750的使用经验,记录一下自己的代码,这里是萌新一枚,还请各位大佬多多包涵。
一、BH1750是什么?
一个光照传感器,使用IIC进行通信的数字传感器,主要功能为测量光照强度;
二、如何使用BH1750
使用任何陌生的元器件,第一步都应该是掏出他的数据手册。
图一 BH1750数据手册
看到这个数据手册,有的同学可能会说,“极光啊,我的英语是一窍不通啊”。没关系,我也是我英语老学渣了,大学英语全都是60分飘过,全靠老师饶我一条狗命。我都能弄懂数据手册,你们也一定可以。
首先在看数据手册时,我们需要认识到一点,我们是要去了解关键信息去的,我们是要了解怎么让他动起来,而不是去做阅读理解。什么是关键信息?一、通信方式,二、指令集,三、时序图。如果你要搞硬件,你可能还需要看它的电气特性和封装之类的,如果你只是买个模块来玩,这看这三个就足够了。
2.1 BH1750的通信方式
这在数据手册上的第一句话就已经说明了:
图二 BH1750的通信方式
这是通过I2C来进行通信,I2C我就不过多介绍了,CSDN上很多人都有讲,我个人是通过火哥的视频来学的,在这里附上火哥的B站视频链接。
特别注意,I2C非常重要,想往单片机嵌入式方面发展的,要好好学。
【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili
2.2 BH1750的指令集
指令集这种东西通常来说是以表格的形式存在于数据手册之中,而且伴随着二进制和十六进制的数值。BH1750的指令集如下所示:
图3 BH1750指令集
第一列为功能,第二列为具体的数值,第三列为功能的补充说明。举例:第四行写的是自动测量高分辨率模式,想要实现这个功能,你需要往传感器中发送0x10。这样,每大约120ms,传感器会得到一个数据,这个数据的精度为1lx,你通过IIC读取这个数据即可。
2.3 BH1750的时序图
图4 BH1750时序图
其实学过I2C的人能够很轻易的看出这是啥了,这其实就是一个IIC。
序号1:是往BH1750中写入,首先发送一个起始信号,通过IIC的总线发送BH1750的地址,同时在地址的后面表明我们是要写入BH1750,具体做法就是在7位的地址后面凑一个0,如果你要声明自己是要读出就往后面凑个1,然后等待一个应答信号。再然后,发送指令0x10,就是我们上面提到过的连续采集高分辨率模式,等待一个应答信号,收到应答后,再发送一个结束信号。完成BH1750的写入工作。
序号2:等待最多180ms,这段时间,BH1750正在采集数据,并将数据存入到寄存器之中。
序号3:将寄存器中的数据取出。同样发送一个起始信号,通过IIC的总线发送BH1750的地址,同时在地址的后面表明我们是要读BH1750,在7位的地址后面凑一个1,等待一个应答信号,接收数据的高八位,再发送一个应答信号,表示我们还没有接收完,再接收高八位,发送非应答,同时发送结束信号,完成接收。这样我们就得到了传感器发送来的数据了。
三、 BH1750代码详解
下面就是代码部分,我自认是写注释比较勤快的,这部分就不做过多的赘述了,如果还是看不懂的可以私信问或者评论区里留言。
3.1 硬件IIC配置
我个人偏好硬件IIC,可以不用写时序。不会硬件的可以往上翻一翻,我有发一个视频链接里面有讲硬件IIC,火哥讲的课还是很不错的。
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
BH1750_I2C_APBxClock_FUN ( BH1750_I2C_CLK, ENABLE );
BH1750_I2C_GPIO_APBxClock_FUN ( BH1750_I2C_GPIO_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(BH1750_I2C_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(BH1750_I2C_SDA_PORT, &GPIO_InitStructure);
}
static void I2C_Mode_Configu(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
I2C_Init(BH1750_I2Cx, &I2C_InitStructure);
I2C_Cmd(BH1750_I2Cx, ENABLE);
}
void BH1750_I2C_Init(void)
{
I2C_GPIO_Config();
I2C_Mode_Configu();
}
3.2 BH1750的读和写
void IIC_BH1750_Write(uint8_t command)
{
while(I2C_GetFlagStatus(BH1750_I2Cx, I2C_FLAG_BUSY));
I2C_GenerateSTART(BH1750_I2Cx, ENABLE);
while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(BH1750_I2Cx, BH1750_ADDRESS, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(BH1750_I2Cx, command);
while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(BH1750_I2Cx, ENABLE);
}
uint32_t IIC_BH1750_Read(void)
{
uint32_t Data=0;
while(I2C_GetFlagStatus(BH1750_I2Cx, I2C_FLAG_BUSY));
I2C_GenerateSTART(BH1750_I2Cx, ENABLE);
while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(BH1750_I2Cx, BH1750_ADDRESS, I2C_Direction_Receiver);
while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0);
Data=I2C_ReceiveData(BH1750_I2Cx);
Data=Data<<8;
I2C_AcknowledgeConfig(BH1750_I2Cx, DISABLE);
I2C_GenerateSTOP(BH1750_I2Cx, ENABLE);
while(I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0);
Data|=I2C_ReceiveData(BH1750_I2Cx);
I2C_AcknowledgeConfig(BH1750_I2Cx, ENABLE);
return Data;
}
3.3 主函数
#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include "bsp_i2c_bh1750.h"
#include
void delayms(uint16_t time)
{
uint16_t i;
while(time--)
{
i=12000;
while(i--);
}
}
uint16_t BH1750_Read(void)
{
uint16_t temp;
temp=IIC_BH1750_Read();
temp=(uint32_t)(temp/1.2);
return temp;
}
int main(void)
{
uint16_t Data;
LED_GPIO_Config();
LED_BLUE;
USART_Config();
printf("rn 这是一个BH1750测试例程 rn");
BH1750_I2C_Init();
printf("rn 作者:极光 rn");
IIC_BH1750_Write(0x01);
IIC_BH1750_Write(0x10);
while (1)
{
Data=BH1750_Read();
printf("rn 光照强度为 %d lx rn",Data);
delayms(2000);
}
}
四、演示
#include "stm32f10x.h" #include "./led/bsp_led.h" #include "./usart/bsp_usart.h" #include "./i2c/bsp_i2c_ee.h" #include "bsp_i2c_bh1750.h" #includevoid delayms(uint16_t time) { uint16_t i; while(time--) { i=12000; while(i--); } } uint16_t BH1750_Read(void) { uint16_t temp; temp=IIC_BH1750_Read(); temp=(uint32_t)(temp/1.2); return temp; } int main(void) { uint16_t Data; LED_GPIO_Config(); LED_BLUE; USART_Config(); printf("rn 这是一个BH1750测试例程 rn"); BH1750_I2C_Init(); printf("rn 作者:极光 rn"); IIC_BH1750_Write(0x01); IIC_BH1750_Write(0x10); while (1) { Data=BH1750_Read(); printf("rn 光照强度为 %d lx rn",Data); delayms(2000); } }
四、演示
图五 效果演示
工程:
链接:https://pan.baidu.com/s/1MlDgRXKAwiJ23hmZAYvrzA?pwd=1111
提取码:1111



