工程實現了在stm32f103zet6開發板上利用雙iic通信定時采集bh1750的光照信息(勒克斯),并將數據展示在0.96寸oled屏幕上,實現實時定量定性觀測環境光照強度大小。keil工程如下:
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "bh1750.h"
- #include "oled.h"
- /*
-
- BH1750
-
- SCL PB10
- SDA PB11
- VCC 3.3V
- GND GND
- ADDR keyibujie.
-
- 0.96OLED IIC
-
- SCL PG12
- SDA PD5
- VCC 3.3V
- GND GND
- */
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- delay_init(); //延時函數初始化
- Light_Init();
- bh_data_send(BHPowOn);
- bh_data_send(BHReset);
- bh_data_send(BHModeH1); //選擇的是分辨率是4lx,測量時間是16ms的
- delay_ms(100);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- OLED_Clear();
- OLED_Init();
- OLED_ShowChinese(12,0,0,24,1);
- OLED_ShowChinese(36,0,1,24,1);
- OLED_ShowChinese(60,0,2,24,1);
- OLED_ShowChinese(84,0,3,24,1);
- while(1)
- {
- printf("%d \n",bh_data_read());
- OLED_SHOW_BH1750(); //OLED動態顯示BH1750光照數值
- OLED_Refresh();
- delay_ms(100);
- }
- }
復制代碼- #include "delay.h"
- #include "bh1750.h"
- #include "oled.h"
- typedef unsigned char BYTE;
- //BYTE BUF[8]; //接收數據緩存區
- //iic接口初始化
- void Single_Write_BH1750(uchar REG_Address)
- {
- IIC_Start(); //起始信號
- IIC_Send_Byte(BHAddWrite); //發送設備地址+寫信號
- IIC_Send_Byte(REG_Address); //內部寄存器地址,
- // BH1750_SendByte(REG_data); //內部寄存器數據,
- IIC_Stop(); //發送停止信號
- }
- void Light_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能A端口時鐘
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB10,11
- GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
- Single_Write_BH1750(0x01);
- }
- /*************************************************************************************/
- void bh_data_send(u8 command)
- {
- do{
- IIC_Start(); //iic起始信號
- IIC_Send_Byte(BHAddWrite); //發送器件地址
- }while(IIC_Wait_Ack()); //等待從機應答
- IIC_Send_Byte(command); //發送指令
- IIC_Wait_Ack(); //等待從機應答
- IIC_Stop(); //iic停止信號
- }
- u16 bh_data_read(void)
- {
- u16 buf;
- IIC_Start(); //iic起始信號
- IIC_Send_Byte(BHAddRead); //發送器件地址+讀標志位
- IIC_Wait_Ack(); //等待從機應答
- buf=IIC_Read_Byte(1); //讀取數據
- buf=buf<<8; //讀取并保存高八位數據
- buf+=0x00ff&IIC_Read_Byte(0); //讀取并保存第八位數據
- IIC_Stop(); //發送停止信號
- return buf;
- }
- void OLED_SHOW_BH1750(void)
- {
- OLED_ShowChar(40,26,'L',16,1);
- OLED_ShowChar(48,26,'U',16,1);
- OLED_ShowChar(58,26,'X',16,1);
-
- if(bh_data_read() > 65200)
- {
- OLED_ShowChar(32,0,'E',16,0);
- OLED_ShowChar(40,0,'R',16,0);
- OLED_ShowChar(48,0,'R',16,0);
- OLED_ShowChar(56,0,'O',16,0);
- OLED_ShowChar(64,0,'R',16,0);
- delay_ms(500);
- OLED_Clear();
- }
- else if(bh_data_read() > 10000 && bh_data_read() < 65200)
- { OLED_ShowChinese(70,38,7,24,1);
- OLED_ShowChinese(94,38,7,24,1);
- OLED_ShowNum(0,26,bh_data_read() % 100000 / 10000,1,16,1);
- OLED_ShowNum(8,26,bh_data_read() % 10000 / 1000 ,1,16,1);
- OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
- OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
- OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
- OLED_ShowChinese(70,38,4,24,1);
- OLED_ShowChinese(94,38,2,24,1);
- }
-
- else if(bh_data_read() > 1000 && bh_data_read() < 10000)
- { OLED_ShowChinese(70,38,7,24,1);
- OLED_ShowChinese(94,38,7,24,1);
- OLED_ShowChar(0,26,' ',16,1);
- OLED_ShowNum(8,26,bh_data_read() % 10000 / 1000 ,1,16,1);
- OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
- OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
- OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
- OLED_ShowChinese(70,38,2,24,1);
-
- }
- else if(bh_data_read() > 100 && bh_data_read() < 1000)
- { OLED_ShowChinese(70,38,7,24,1);
- OLED_ShowChinese(94,38,7,24,1);
- OLED_ShowChar(0,26,' ',16,1);
- OLED_ShowChar(8,26,' ',16,1);
- OLED_ShowNum(16,26,bh_data_read() % 1000 / 100 ,1,16,1);
- OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
- OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
- OLED_ShowChinese(70,38,5,24,1);
- OLED_ShowChinese(94,38,8,24,1);
- }
- else if(bh_data_read() > 10 && bh_data_read() < 100)
- { OLED_ShowChinese(70,38,7,24,1);
- OLED_ShowChinese(94,38,7,24,1);
- OLED_ShowChar(0,26,' ',16,1);
- OLED_ShowChar(8,26,' ',16,1);
- OLED_ShowChar(16,26,' ',16,1);
- OLED_ShowNum(24,26,bh_data_read() % 100 / 10 ,1,16,1);
- OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
- OLED_ShowChinese(70,38,6,24,1);
- }
- else if(bh_data_read() < 10)
- { OLED_ShowChinese(70,38,7,24,1);
- OLED_ShowChinese(94,38,7,24,1);
- OLED_ShowChar(0,26,' ',16,1);
- OLED_ShowChar(8,26,' ',16,1);
- OLED_ShowChar(16,26,' ',16,1);
- OLED_ShowChar(24,26,' ',16,1);
- OLED_ShowNum(32,26,bh_data_read() % 10 ,1,16,1);
- OLED_ShowChinese(70,38,4,24,1);
- OLED_ShowChinese(94,38,6,24,1);
- }
- // else break;
-
- delay_ms(100);
- }
復制代碼
原理圖:無
仿真:無
代碼:
程序.7z
(201.55 KB, 下載次數: 40)
2023-8-9 16:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|