本帖最后由 eltonchang2001 于 2022-11-9 11:32 编辑
BH1750是一种用于光照强度检测的传感器,并以I2C接口的方式来工作,为了便于程序移植这里是以GPIO口模拟I2C的方式来驱动该传感器。 显示效果 传感器与开发板的连接关系为: OLED屏: SCL---PA2 SDA---PA3 BH1750: SCL---PA6 SDA---PA7 输入输出模式设置函数: - void IIC_INPUT_MODE_SET()
- {
- AFIO_GPxConfig(GPIO_PA, AFIO_PIN_7, AFIO_FUN_GPIO);
- GPIO_PullResistorConfig(HT_GPIOA, AFIO_PIN_7,GPIO_PR_DOWN);
- GPIO_DirectionConfig(HT_GPIOA,AFIO_PIN_7, GPIO_DIR_IN);
- GPIO_InputConfig(HT_GPIOA, GPIO_PIN_7, ENABLE);
- }
- void IIC_OUTPUT_MODE_SET()
- {
- AFIO_GPxConfig(GPIO_PA, AFIO_PIN_7, AFIO_FUN_GPIO);
- GPIO_PullResistorConfig(HT_GPIOA, AFIO_PIN_7,GPIO_PR_DOWN );
- GPIO_DirectionConfig(HT_GPIOA, AFIO_PIN_7, GPIO_DIR_OUT);
- GPIO_InputConfig(HT_GPIOA, AFIO_PIN_7, ENABLE);
- }
BH1750初始化函数: - void BH1750_Init(void)
- {
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
- CKCUClock.Bit.AFIO = 1;
- CKCUClock.Bit.PA = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- }
- {
- AFIO_GPxConfig(GPIO_PA, AFIO_PIN_6|AFIO_PIN_7, AFIO_FUN_GPIO);
- GPIO_PullResistorConfig(HT_GPIOA, AFIO_PIN_6|AFIO_PIN_7, GPIO_PR_DOWN);
- GPIO_DirectionConfig(HT_GPIOA, AFIO_PIN_6|AFIO_PIN_7, GPIO_DIR_OUT);
- GPIO_InputConfig(HT_GPIOA, AFIO_PIN_6|AFIO_PIN_7, ENABLE);
- }
- GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_6, SET);
- GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_7, SET);
- }
BH1750字节数据发送函数: - void BH1750_SendByte(char data)
- {
- char i;
- IIC_OUTPUT_MODE_SET();
- SCL_Clr();
- __Delay(2);
- for (i=0;i<8;i++)
- {
- if(data&0x80) SDA_Set();
- else SDA_Clr();
- data <<= 1;
- SCL_Set();
- __Delay(2);
- SCL_Clr();
- __Delay(2);
- }
- }
光强检测与显示函数: - void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- __Delay(180000);
- Multiple_Read_BH1750();
- 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);
- }
主程序: - void main(void)
- {
- NVIC_Configuration();
- CKCU_Configuration();
- GPIO_Configuration();
- RETARGET_Configuration();
- HT32F_DVB_LEDInit(HT_LED1);
- T1_GPIO_Configuration();
- T2_GPIO_Configuration();
- BH1750_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"HT32F52352",16);
- OLED_ShowString(20,2,"OLED & BH1750",16);
- OLED_ShowString(20,4,"Sunlight:",16);
- OLED_ShowString(68,6,"(lx)",16); while(1)
- {
- Get_Sunlight_Value();
- HT32F_DVB_LEDToggle(HT_LED1);
- __Delay(1000000);
- }
- }
|