找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32单片机GY-30 bh1750光照传感器源程序 串口打印

[复制链接]
跳转到指定楼层
楼主
ID:651755 发表于 2022-3-27 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include  "bh1750.h"
  2. #include "delay.h"
  3. #include "timer.h"

  4. u8 BUF[8];
  5. u16 temp2=0;
  6. float lux=0;

  7. /**************************************

  8. 阴天/无阳光直射(5000-15000Lux),3小时
  9. 晴朗/适合户外运动(15000-100000 Lux),3小时
  10. 阳光直射(10W Lux),1小时

  11. **************************************/
  12. void bh1750_iic_init(void)
  13. {
  14.         GPIO_InitTypeDef GPIO_InitStructure;
  15.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
  16.           
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  21.         GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6);         //PB5,PB6 输出高

  22. }

  23. /****向BH1750单次写命令****/
  24. void Single_Write_bh1750(unsigned char Reg_Address)
  25. {
  26.         bh1750_iic_start();
  27.         bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写
  28.         //IIC_Wait_Ack();
  29.         bh1750_send_byte(Reg_Address);  
  30.         //IIC_Wait_Ack();
  31.         bh1750_iic_stop();
  32. }

  33. /****BH1750初始化****/
  34. void bh1750_Init(void)
  35. {
  36.         char dir=0;
  37.         unsigned char value=0;
  38.         TIM3_PWM_Init(899,0);
  39.         bh1750_iic_init();
  40.         TIM_SetCompare3(TIM3,0);
  41.        
  42.         while(1)
  43.         {       
  44.                 Single_Write_bh1750(0x01);
  45.                 Single_Write_bh1750(0x10);
  46.                 delay_ms(200);
  47.                 bh1750_ReadContinuous1();
  48.                 temp2=BUF[0];
  49.                 temp2=(temp2<<8)+BUF[1];
  50.                 lux=(float)temp2/1.2;    //lux是float型       
  51.                 if((lux>0)&&(lux<50))
  52.                         value=10;
  53.                 else if(lux<75)
  54.                         value=20;
  55.                 else if(lux<100)
  56.                         value=40;
  57.                 else if(lux<125)
  58.                         value=50;
  59.                 else if(lux<150)
  60.                         value=60;
  61.                 else if(lux<175)
  62.                         value=70;
  63.                 else if(lux<200)
  64.                         value=80;
  65.                 else if(lux<250)
  66.                         value=90;
  67.                 else if(lux<280)
  68.                         value=110;
  69.                 else if(lux<300)
  70.                         value=120;
  71.                 else if(lux<320)
  72.                         value=130;
  73.                 else if(lux<340)
  74.                         value=140;
  75.                 else if(lux<360)
  76.                         value=150;
  77.                 else if(lux<380)
  78.                         value=160;
  79.                 else if(lux<400)
  80.                         value=170;
  81.                 else if(lux<410)
  82.                         value=180;
  83.                 else if(lux<450)
  84.                         value=190;       
  85.                 else if(lux<800)
  86.                         value=240;
  87.                 printf("光照强度:%f   value:%d\r\n",lux,value);
  88.                 TIM_SetCompare3(TIM3,value);
  89.                
  90.                 //delay_ms(1000);
  91.         }
  92.        
  93.        
  94. }

  95. /****从BH1750单次读Lux****/
  96. /****
  97. 模式选择:H-Resolution Mode,分辨率1lux
  98. 单次读Opecode:0010 0000 ,即0x20
  99. 器件地址:0100011,ADDR接GND
  100. ****/
  101. void bh1750_ReadOneTime(void)
  102. {
  103.        

  104.         bh1750_iic_start();
  105.         bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写
  106.         bh1750_recv_ack();
  107.         bh1750_send_byte(0x20);   //发送One time H-Resolution Mode的Opecode 0010 0000,分辨率为1lux
  108.         bh1750_recv_ack();
  109.         bh1750_iic_stop();
  110.         delay_ms(200);
  111.         bh1750_iic_start();
  112.         bh1750_send_byte(0x47);  //
  113.         bh1750_recv_ack();
  114.         BUF[0]=bh1750_recv_byte(1);
  115.         //IIC_Ack();        //主机应答
  116.         //temp1=temp<<8;
  117.         BUF[1]=bh1750_recv_byte(0);
  118.         //IIC_NAck();        //主机不应答       
  119.         bh1750_iic_stop();
  120.        
  121.        
  122. //         temp2=BUF[0];
  123. //         temp2=(temp2<<8)+BUF[1];
  124. //         lux=(float)temp2/1.2;    //lux是float型
  125.        
  126.         //return lux;
  127.         //delay_ms(200);
  128. }

  129. /****从BH1750连续读Lux****/
  130. /****
  131. 模式选择:H-Resolution Mode,分辨率1lux
  132. 连续读Opecode:0001 0000
  133. 器件地址:0100011,ADDR接GND
  134. ****/
  135. void  bh1750_ReadContinuous1(void)
  136. {
  137. //        u16 temp=0,temp1=0;
  138.         bh1750_iic_start();
  139.   bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写
  140.         bh1750_recv_ack();
  141.         bh1750_send_byte(0x10);  //发送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率为1lux
  142.         bh1750_recv_ack();
  143.         bh1750_iic_stop();
  144.         delay_ms(200);
  145.         bh1750_iic_start();
  146.   bh1750_send_byte(0x47);  
  147.         bh1750_recv_ack();
  148.        
  149.        
  150.         BUF[0]=bh1750_recv_byte(1);
  151.         BUF[1]=bh1750_recv_byte(0);       
  152.        
  153.        
  154.         //temp=bh1750_recv_byte(1);
  155.         //temp1=bh1750_recv_byte(0);


  156.         bh1750_iic_stop();
  157.        
  158.         //temp2=temp1+(temp<<8);
  159.         //lux=(float)temp2/1.2;    //lux是float型


  160. }

  161. void Conversion(void)
  162. {
  163.         temp2=BUF[0];
  164.         temp2=(temp2<<8)+BUF[1];
  165.         lux=(float)temp2/1.2;    //lux是float型
  166.        
  167. }






  168. /**************************************
  169. 起始信号
  170. **************************************/
  171. void bh1750_iic_start(void)
  172. {
  173.                 BH1750_SDA_OUT()       //设置SDA线为输出
  174.         //在开始数据传输前,先让SDA和SCL都拉高
  175.                 BH1750_IIC_SDA=1;    //发送起始条件的数据信号,释放总线
  176.           delay_us(2);
  177.                 BH1750_IIC_SCL=1;   

  178.                 delay_us(5);   //Tsu;STA:起始条件的建立时间大于4.7us。
  179.        
  180.                 BH1750_IIC_SDA=0;    //SDA由高变为低表示开始信号
  181.                 delay_us(4);   //起始条件的保持时间大于4us
  182.                 BH1750_IIC_SCL=0;    //钳住IIC总线,准备发送或者接收数据
  183.                 delay_us(2);
  184. }

  185. /**************************************
  186. 停止信号
  187. **************************************/
  188. void bh1750_iic_stop(void)
  189. {
  190.         BH1750_SDA_OUT()       //设置SDA线为输出
  191.        
  192.         //IIC_SCL=0;    //此句是调试BH1750时加,2018.03.03
  193.        
  194.         BH1750_IIC_SDA=0;   //发送停止信号的数据信号
  195.         delay_us(2);
  196.         BH1750_IIC_SCL=1;   //发送停止信号的时钟信号
  197.         delay_us(5);  //停止信号的建立时间大于4us
  198.         BH1750_IIC_SDA=1;   //发送停止信号
  199.         delay_us(4);    //;
  200. }

  201. /**************************************
  202. 发送应答信号
  203. 入口参数:ack (0:ACK 1:NAK)
  204. **************************************/
  205. void bh1750_send_ack(char ack)
  206. {
  207.         BH1750_IIC_SCL=0;
  208.         BH1750_SDA_OUT();
  209.         BH1750_IIC_SDA=ack;   //主器件应答
  210.         delay_us(2);
  211.         BH1750_IIC_SCL=1;
  212.         delay_us(4);        //SCL高电平周期大于4us
  213.         BH1750_IIC_SCL=0;         //清时钟线,钳住IIC总线以便继续接收
  214.         delay_us(2);

  215. }

  216. /**************************************
  217. 接收应答信号
  218. **************************************/
  219. char bh1750_recv_ack(void)
  220. {
  221.         u8 ucErrorTime=0;
  222.         BH1750_SDA_IN();     //SDA设置成输入
  223.         BH1750_IIC_SDA=1;
  224.         delay_us(2);
  225.         BH1750_IIC_SCL=1;
  226.         delay_us(2);
  227.         while(BH1750_READ_SDA)
  228.         {
  229.                 ucErrorTime++;
  230.                 if(ucErrorTime>=250)
  231.                 {
  232.                         bh1750_iic_stop();
  233.                         return 1;               
  234.                 }
  235.         }
  236.         BH1750_IIC_SCL=0;
  237.         return 0;
  238. }

  239. /**************************************
  240. 向IIC总线发送一个字节数据
  241. **************************************/
  242. void bh1750_send_byte(char dat)
  243. {
  244.         u8 i;
  245.         BH1750_SDA_OUT();  

  246.         for(i=0;i<8;i++)
  247.         {
  248.                 if((dat<<i)&0x80)  BH1750_IIC_SDA=1;   //判断发送位
  249.                 else BH1750_IIC_SDA=0;

  250.                 delay_us(2);
  251.                 BH1750_IIC_SCL=1;     //拉高SCL,通知被控器开始接收数据位
  252.                 delay_us(4);   //保证SCL高电平周期大于4us
  253.                 BH1750_IIC_SCL=0;    //拉低SCL,允许SDA传输下一位数据。因为只有在SCL=0时才允许SDA的状态发生变化
  254.           delay_us(2);
  255.    }
  256.          //以下四句是调试BH1750时添加的,2018.03.03
  257.          //特别注意;用方法三时,以下四句不可去掉,去掉后得到的数有问题
  258.          //用方法二时,以下四句需注释掉,否则也会有问题,至于原因暂时还不清楚。
  259. //          IIC_SDA=0;
  260. //          delay_us(2);
  261. //          IIC_SCL=1;
  262. //          delay_us(2);
  263.          
  264.          BH1750_IIC_SCL=0;      //拉低SCL,为下次数据传输做好准备
  265.          delay_us(2);
  266. }

  267. /**************************************
  268. 从IIC总线接收一个字节数据
  269. 用来接收从器件传来的数据,ack为1时,发送Ack(产生应答);ack为0时,发送NAck(不产生应答)
  270. **************************************/
  271. char bh1750_recv_byte(unsigned char ack)
  272. {
  273.         unsigned char i,receive=0;
  274.         BH1750_SDA_IN();   
  275.         for(i=0;i<8;i++)
  276.         {
  277.                 BH1750_IIC_SCL=0;    //置SCL为低,准备接收数据位
  278.                 delay_us(5);  //时钟低电平周期大于4.7us
  279.                 BH1750_IIC_SCL=1;   //置SCL为高,使SDA上数据有效
  280.                 delay_us(2);
  281.                 receive=receive<<1;
  282.                 if(BH1750_READ_SDA) receive=receive+1;    //读取SDA,把接收的数据位放入receve中,若此处写成IIC_SDA==1,会失败,思考原因?       
  283.                 delay_us(2);
  284.   }
  285.         if(!ack)
  286.                 bh1750_send_ack(1);   //发送NAck
  287.         else
  288.                 bh1750_send_ack(0);    //发送Ack
  289.         //IIC_SCL=0;      //在此处有何用处???(猜测:为下次数据传输做好准备, //钳住IIC总线,准备发送或者接收数据)
  290.         //delay_us(2);
  291.         return receive;
  292. }
复制代码

Keil代码下载: STM32_GY-30 bh1750光照传感器 串口打印.7z (183.52 KB, 下载次数: 59)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:696872 发表于 2022-4-30 10:09 | 只看该作者
大佬,在32f1上通用吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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