标题: stm32f103zet6单片机BH1750光照传感器程序 0.96OLED显示 [打印本页]

作者: muji    时间: 2023-8-9 15:37
标题: stm32f103zet6单片机BH1750光照传感器程序 0.96OLED显示
工程实现了在stm32f103zet6开发板上利用双iic通信定时采集bh1750的光照信息(勒克斯),并将数据展示在0.96寸oled屏幕上,实现实时定量定性观测环境光照强度大小。keil工程如下:
单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "bh1750.h"
  4. #include "oled.h"
  5. /*

  6. BH1750

  7. SCL     PB10
  8. SDA     PB11
  9. VCC     3.3V
  10. GND     GND
  11. ADDR keyibujie.

  12. 0.96OLED    IIC

  13. SCL      PG12
  14. SDA      PD5
  15. VCC      3.3V
  16. GND      GND
  17. */
  18. int main(void)
  19. {               
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  21.         delay_init();                     //延时函数初始化         
  22.         Light_Init();
  23.         bh_data_send(BHPowOn);   
  24.         bh_data_send(BHReset);
  25.         bh_data_send(BHModeH1); //选择的是分辨率是4lx,测量时间是16ms的
  26.         delay_ms(100);
  27.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  28.                 OLED_Clear();
  29.         OLED_Init();
  30. OLED_ShowChinese(12,0,0,24,1);
  31.          OLED_ShowChinese(36,0,1,24,1);
  32.          OLED_ShowChinese(60,0,2,24,1);
  33.          OLED_ShowChinese(84,0,3,24,1);
  34.   while(1)
  35.         {
  36.                 printf("%d \n",bh_data_read());
  37.                 OLED_SHOW_BH1750();                //OLED动态显示BH1750光照数值
  38.                 OLED_Refresh();
  39.                 delay_ms(100);
  40.         }
  41. }
复制代码
  1. #include "delay.h"
  2. #include "bh1750.h"
  3. #include "oled.h"


  4. typedef   unsigned char BYTE;
  5. //BYTE    BUF[8];                         //接收数据缓存区   
  6. //iic接口初始化

  7. void Single_Write_BH1750(uchar REG_Address)
  8. {
  9.    IIC_Start();                  //起始信号
  10.    IIC_Send_Byte(BHAddWrite);   //发送设备地址+写信号
  11.    IIC_Send_Byte(REG_Address);    //内部寄存器地址,
  12.   //  BH1750_SendByte(REG_data);       //内部寄存器数据,
  13.    IIC_Stop();                   //发送停止信号
  14. }

  15. void Light_Init(void)
  16. {
  17.         GPIO_InitTypeDef  GPIO_InitStructure;
  18.          

  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能A端口时钟
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;         
  21.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  23.          GPIO_Init(GPIOB, &GPIO_InitStructure);          //初始化GPIOB10,11
  24.          GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);        

  25.         Single_Write_BH1750(0x01);
  26. }


  27. /*************************************************************************************/
  28. void bh_data_send(u8 command)
  29. {
  30.     do{
  31.     IIC_Start();                      //iic起始信号
  32.     IIC_Send_Byte(BHAddWrite);       //发送器件地址
  33.     }while(IIC_Wait_Ack());           //等待从机应答
  34.     IIC_Send_Byte(command);          //发送指令
  35.     IIC_Wait_Ack();                   //等待从机应答
  36.     IIC_Stop();                       //iic停止信号
  37. }

  38. u16 bh_data_read(void)
  39. {
  40.         u16 buf;
  41.         IIC_Start();                       //iic起始信号
  42.         IIC_Send_Byte(BHAddRead);         //发送器件地址+读标志位
  43.         IIC_Wait_Ack();                     //等待从机应答
  44.         buf=IIC_Read_Byte(1);              //读取数据
  45.         buf=buf<<8;                        //读取并保存高八位数据
  46.         buf+=0x00ff&IIC_Read_Byte(0);      //读取并保存第八位数据
  47.         IIC_Stop();                        //发送停止信号
  48.         return buf;
  49. }

  50. void OLED_SHOW_BH1750(void)
  51. {
  52.                 OLED_ShowChar(40,26,'L',16,1);
  53.                 OLED_ShowChar(48,26,'U',16,1);
  54.                 OLED_ShowChar(58,26,'X',16,1);

  55.                
  56.                 if(bh_data_read() > 65200)
  57.                 {        
  58.                         OLED_ShowChar(32,0,'E',16,0);
  59.                         OLED_ShowChar(40,0,'R',16,0);
  60.                         OLED_ShowChar(48,0,'R',16,0);
  61.                         OLED_ShowChar(56,0,'O',16,0);
  62.                         OLED_ShowChar(64,0,'R',16,0);
  63.                         delay_ms(500);
  64.                         OLED_Clear();
  65.                 }
  66.                 else if(bh_data_read() > 10000 && bh_data_read() < 65200)        
  67.                 {                OLED_ShowChinese(70,38,7,24,1);
  68.                         OLED_ShowChinese(94,38,7,24,1);
  69.                         OLED_ShowNum(0,26,bh_data_read() % 100000 / 10000,1,16,1);
  70.                         OLED_ShowNum(8,26,bh_data_read() % 10000  / 1000 ,1,16,1);
  71.                         OLED_ShowNum(16,26,bh_data_read() % 1000   / 100  ,1,16,1);
  72.                         OLED_ShowNum(24,26,bh_data_read() % 100    / 10   ,1,16,1);
  73.                         OLED_ShowNum(32,26,bh_data_read() % 10            ,1,16,1);
  74.                         OLED_ShowChinese(70,38,4,24,1);
  75.                         OLED_ShowChinese(94,38,2,24,1);
  76.                 }
  77.                
  78.                 else if(bh_data_read() > 1000 && bh_data_read() < 10000)        
  79.                 {        OLED_ShowChinese(70,38,7,24,1);
  80.                         OLED_ShowChinese(94,38,7,24,1);
  81.                         OLED_ShowChar(0,26,' ',16,1);
  82.                         OLED_ShowNum(8,26,bh_data_read() % 10000  / 1000 ,1,16,1);
  83.                         OLED_ShowNum(16,26,bh_data_read() % 1000   / 100  ,1,16,1);
  84.                         OLED_ShowNum(24,26,bh_data_read() % 100    / 10   ,1,16,1);
  85.                         OLED_ShowNum(32,26,bh_data_read() % 10            ,1,16,1);
  86.                         OLED_ShowChinese(70,38,2,24,1);
  87.                         
  88.                 }
  89.                 else if(bh_data_read() > 100 && bh_data_read() < 1000)        
  90.                 {                OLED_ShowChinese(70,38,7,24,1);
  91.                         OLED_ShowChinese(94,38,7,24,1);
  92.                         OLED_ShowChar(0,26,' ',16,1);
  93.                         OLED_ShowChar(8,26,' ',16,1);
  94.                         OLED_ShowNum(16,26,bh_data_read() % 1000   / 100  ,1,16,1);
  95.                         OLED_ShowNum(24,26,bh_data_read() % 100    / 10   ,1,16,1);
  96.                         OLED_ShowNum(32,26,bh_data_read() % 10            ,1,16,1);
  97.                         OLED_ShowChinese(70,38,5,24,1);
  98.                         OLED_ShowChinese(94,38,8,24,1);
  99.                 }
  100.                 else if(bh_data_read() > 10 && bh_data_read() < 100)        
  101.                 {                OLED_ShowChinese(70,38,7,24,1);
  102.                         OLED_ShowChinese(94,38,7,24,1);
  103.                         OLED_ShowChar(0,26,' ',16,1);
  104.                         OLED_ShowChar(8,26,' ',16,1);
  105.                         OLED_ShowChar(16,26,' ',16,1);
  106.                         OLED_ShowNum(24,26,bh_data_read() % 100    / 10   ,1,16,1);
  107.                         OLED_ShowNum(32,26,bh_data_read() % 10            ,1,16,1);
  108.                         OLED_ShowChinese(70,38,6,24,1);
  109.                 }
  110.                 else if(bh_data_read()  < 10)        
  111.                 {                OLED_ShowChinese(70,38,7,24,1);
  112.                         OLED_ShowChinese(94,38,7,24,1);
  113.                         OLED_ShowChar(0,26,' ',16,1);
  114.                         OLED_ShowChar(8,26,' ',16,1);
  115.                         OLED_ShowChar(16,26,' ',16,1);
  116.                         OLED_ShowChar(24,26,' ',16,1);
  117.                         OLED_ShowNum(32,26,bh_data_read() % 10            ,1,16,1);
  118.                         OLED_ShowChinese(70,38,4,24,1);
  119.                         OLED_ShowChinese(94,38,6,24,1);
  120.                 }
  121. //                else break;

  122.                
  123.                 delay_ms(100);
  124. }
复制代码

原理图:无
仿真:无
代码: 程序.7z (201.55 KB, 下载次数: 40)

作者: 1900352116    时间: 2024-12-21 20:55
不能用
作者: czh773963064    时间: 2025-3-17 08:23
谢谢分享,我也正在自己学习编程,学习了!
作者: 七彩的梦想    时间: 2025-4-8 23:14
有网友验证过以上程序能用吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1