本帖最后由 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夜晚灯光照度
|