BH1750是一种数字式光照强度传感器,其特点是采用I2C接口工作,故占用的引脚少。此外,由于是数字式传感器故无需对检测值进行标定。 尽管以前曾在其它开发板上进行过测试,但在PIC18F57Q43上还是首次。 为进行检测和显示,其引脚配置如图1所示,相应的引脚命名如图2所示。 图1 引脚配置 图2 引脚命名 其中,BH1750所连接的引脚如下: CLK---RC0 DIN ---RC1 而OLED屏所连接的引脚为: SCL ---RB1 SDA ---RB2 为此,对BH1750所做的语句定义为: #define SCL_Clr() CLK_SetLow() #define SCL_Set() CLK_SetHigh() #define SDA_Clr() DIN_SetLow() #define SDA_Set() DIN_SetHigh() unsigned char BUF[8]; #define IIC_WRITE 0 #define IIC_READ 1 #define SlaveAddress 0x46 #define IIC_SDA_IN DIN_GetValue() 与OLED屏的驱动不同,OLED屏只是使用输出模式,而BH1750的数据引脚既使用输出模式也使用输入模式。 为便于引脚工作模式的切换,使用配置了2个函数来进行切换,其内容如下: - void IIC_INPUT_MODE_SET()
- {
- DIN_SetDigitalInput();
- }
- void IIC_OUTPUT_MODE_SET()
- {
- DIN_SetDigitalOutput();
- }
BH1750的初始化函数为: - void BH1750_Init(void)
- {
- DIN_SetDigitalOutput();
- }
以GPIO口模拟I2C方式字节数据的函数为: - 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);
- }
- }
获取光照强度值的函数为: - void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- char i=0;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- __delay_ms(180);
- Multiple_Read_BH1750();
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float)dis_data/1.2;
- sd=temp;
- OLED_ShowNum(0,6,sd,5,16);
- }
实现图3所示检测效果的主程序为: - int main(void)
- {
- SYSTEM_Initialize();
- KEY_SetDigitalOutput();
- KEY_SetHigh();
- LED_SetHigh();
- BH1750_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"PIC18F57Q43 TEST",16);
- OLED_ShowString(0,2,"OLED & BH1750",16);
- OLED_ShowString(0,4,"Sunlight=",16);
- OLED_ShowString(48,6,"lx",16);
- while(1)
- {
- Get_Sunlight_Value();
- LED0_Toggle();
- __delay_ms(500);
- }
- }
图3 检测效果 需指出的是:无不影响程序的下载,这里是以RA4和RA5输出高电平来为OLED屏和BH1750通过电源支持。
|