光照传感器在对环境的光线情况的检测中起着重要的作用,这里所采用的是数字式光照传感器BH1750,它具有集成度高和检测精度高的特点。
该传感器以I2C接口的方式工作,其引脚的连接关系为:
SCL------PA0
SDA------PA1
为此,对所用引脚的配置函数为:
void BH1750_Init(void)
{
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
}
为模拟I2C方式数据的需要,对输出高低电平的语句定义为:
#define SCL_Set() GPIOA_SetBits(GPIO_Pin_0)
#define SCL_Clr() GPIOA_ResetBits(GPIO_Pin_0)
#define SDA_Set() GPIOA_SetBits(GPIO_Pin_1)
#define SDA_Clr() GPIOA_ResetBits(GPIO_Pin_1)
其数据引脚读取输入信号的语句为:
#define IIC_SDA_IN GPIOA_ReadPortPin(GPIO_Pin_1)
与显示器件不同,传感器这类器件不仅是输出数据,还要读取数据,因此其在工作过程中是要不断切换工作模式的。
将数据引脚设置为输入模式的函数为:
void IIC_INPUT_MODE_SET()
{
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeIN_PU);
}
而将数据引脚设置为输出模式的函数则为:
void IIC_OUTPUT_MODE_SET()
{
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
}
在模拟方式下,其发送字节数据的函数为:
void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE_SET();
SCL_Clr();
DelayUs(2);
for (i=0;i<8;i++)
{
if(data&0x80)
{
SDA_Set();
}
else
{
SDA_Clr();
}
data <<= 1;
SCL_Set();
DelayUs(2);
SCL_Clr();
DelayUs(2);
}
}
相应的字节数据接收函数为:
char BH1750_RecvByte()
{
char i;
char data = 0;
IIC_INPUT_MODE_SET();
for (i=0;i<8;i++)
{
SCL_Clr();
DelayUs(2);
SCL_Set();
data <<= 1;
SCL_Set();
if(IIC_SDA_IN) data|=0x01;
DelayUs(2);
}
SCL_Clr();
return data;
}
有了以上函数的支持,实现光照强度采集的函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
DelayMs(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;
PRINT("%d lx \r\n", sd);
}
在未添加显示器件的情况下,是通过串口来输出光照强度检测值。
其测试光照强度检测的主程序为:
int main()
{
uint8_t i = 0;
HSECFG_Capacitance(HSECap_18p);
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
GPIOA_SetBits(GPIO_Pin_14);
GPIOPinRemap(ENABLE, RB_PIN_UART0);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
UART0_DefInit();
PRINT("BH1750 test:\r\n");
BH1750_Init();
while(1)
{
Get_Sunlight_Value();
DelayMs(500);
}
}
经程序的编译和下载,其检测情况如图2所示,说明其工作正常且有效。

图1 传感器连接

图2 检测结果