本帖最后由 jinglixixi 于 2023-7-19 00:36 编辑
#申请原创#
BH1750是一种用于光照强度检测的传感器,它相较于用光敏器件来检测光照强度具有集成度高,检测值无需自行标度的优点。 该传感器以I2C接口来工作,故十分节省引脚资源,这个装置的电路构成如图1所示。
图1光照强度检测电路
BH1750传感器与开发板的连接关系为: SCL---PA1 SDA---PA0
所用引脚输出高低电平的引脚定义为: #defineSDA_Set() GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_HIGH) #defineSDA_Clr() GPIO_SetPinLevel(GPIOA,GPIO_PIN0, GPIO_LEVEL_LOW)
#defineSCL_Set() GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_HIGH) #defineSCL_Clr() GPIO_SetPinLevel(GPIOA,GPIO_PIN1, GPIO_LEVEL_LOW)
数据语句读取引脚状态的语句定义为: #defineIIC_SDA_IN GPIO_GetPinLevel(GPIOA,GPIO_PIN0)
配置所用引脚的函数为: - void BH1750_Init(void)
- {
- GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
- GPIO_SetFunc(GPIOA, GPIO_PIN1, GPIO_FUN0);
- GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
- GPIO_SetDir(GPIOA, GPIO_PIN1, GPIO_OUT);
- }
由于在检测过程中要进行数据的收发,故对引脚的工作模式要进行动态的切换,因此对于了设置输入、输出工作模式的函数,其内容如下: - void IIC_INPUT_MODE_SET()
- {
- GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
- GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_IN);
- }
- void IIC_OUTPUT_MODE_SET()
- {
- GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN0);
- GPIO_SetPullup(GPIOA, GPIO_PIN0, ENABLE);
- GPIO_SetDir(GPIOA, GPIO_PIN0, GPIO_OUT);
- }
BH1750发送字节数据的函数为: - void BH1750_SendByte(char data)
- {
- char i;
- IIC_OUTPUT_MODE_SET();
- SCL_Clr();
- udelay(1);
- for (i=0;i<8;i++)
- {
- if(data&0x80) SDA_Set();
- else SDA_Clr();
- data <<= 1;
- SCL_Set();
- udelay(1);
- SCL_Clr();
- udelay(1);
- }
- }
BH1750接收字节数据的函数为: - char BH1750_RecvByte()
- {
- char i;
- char data = 0;
- IIC_INPUT_MODE_SET();
- for (i=0;i<8;i++)
- {
- SCL_Clr();
- udelay(1);
- SCL_Set();
- data <<= 1;
- SCL_Set();
- if(IIC_SDA_IN) data|=0x01;
- udelay(1);
- }
- SCL_Clr();
- return data;
- }
BH1750向指定寄存器写入数据的函数为: - void Single_Write_BH1750(char REG_Address)
- {
- BH1750_Start();
- BH1750_SendByte(SlaveAddress);
- BH1750_RecvACK();
- BH1750_SendByte(REG_Address);
- BH1750_RecvACK();
- BH1750_Stop();
- }
BH1750由寄存器读取数据的函数为: - void Multiple_Read_BH1750()
- {
- BH1750_Start();
- BH1750_SendByte(SlaveAddress+1);
- BH1750_RecvACK();
- BUF[0] = BH1750_RecvByte();
- BH1750_SendACK(0);
- BUF[1] = BH1750_RecvByte();
- BH1750_SendACK(1);
- BH1750_Stop();
- mdelay(5);
- }
获取光照强度检测值的函数为: - void Get_Sunlight_Value(void)
- {
- int dis_data=0;
- float temp;
- char i=0;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- mdelay(180);
- Multiple_Read_BH1750();
- for(i=0;i<3;i++) dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float)dis_data/1.2;
- sd=temp;
- OLED_ShowNum(20,6,sd,5,16);
- }
检测光照强度并加以显示的主程序为: - int main(void)
- {
- InitDelay();
- InitDebug();
- GPIO_LedInit();
- TIMER_PrdInit();
- GPIO_OLEDInit();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(10,0,"AC7802x Test",16);
- OLED_ShowString(10,2,"BH1750",16);
- OLED_ShowString(10,4,"Light: lx",16);
- BH1750_Init();
- mdelay(100);
- while (1)
- {
- Get_Sunlight_Value();
- mdelay(500);
经程序的编译和下载,其检测效果如图2所示。
图2夜晚灯光照度
|