本帖最后由 jinglixixi 于 2021-1-27 21:07 编辑
BH1750是一种数字式光强度传感器,它以I2C接口的方式来工作,因此它需占用2个I/O口,其检测效果如下图所示。 OLED 屏与MCU的连接关系为: SCL---PB10 SDA---PB11 检测效果图
该引脚输入及高低电平输出的语句定义如下: #defineSCL_Set() GPIOB->BSRE =GPIO_Pins_10 #defineSCL_Clr() GPIOB->BRE =GPIO_Pins_10
#defineSDA_Set() GPIOB->BSRE =GPIO_Pins_11 #defineSDA_Clr() GPIOB->BRE =GPIO_Pins_11
将该引脚配置为输出功能的函数为: void IIC_INPUT_MODE_SET()
{
GPIO_InitType GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_PU;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
BH1750发送字节数据的函数: void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE_SET();
SCL_Clr();
Delay_us(2);
for (i=0;i<8;i++)
{
if(data&0x80) SDA_Set();
else SDA_Clr();
data <<= 1;
SCL_Set();
Delay_us(2);
SCL_Clr();
Delay_us(2);
}
}
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();
Delay_ms(5);
}
实现光强检测的主程序为: int main(void)
{
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT-START-F407",16);
OLED_ShowString(0,2,"OLED & BH1750",16);
BH1750_Init();
Delay_ms(1000u);
OLED_Clear();
OLED_ShowString(0,0,"Sunlight=",16);
OLED_ShowString(48,2,"lx",16);
while(1)
{
Get_Sunlight_Value();
Delay_ms(500 );
}
}
|