找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2445|回复: 3
打印 上一主题 下一主题
收起左侧

stm32f103zet6单片机BH1750光照传感器程序 0.96OLED显示

[复制链接]
跳转到指定楼层
楼主
ID:1088465 发表于 2023-8-9 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
工程实现了在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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1138353 发表于 2024-12-21 20:55 | 只看该作者
不能用
回复

使用道具 举报

板凳
ID:1145583 发表于 2025-3-17 08:23 来自手机 | 只看该作者
谢谢分享,我也正在自己学习编程,学习了!
回复

使用道具 举报

地板
ID:66862 发表于 2025-4-8 23:14 | 只看该作者
有网友验证过以上程序能用吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表