找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2524|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)GY-30 bh1750光照傳感器源程序 串口打印

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:651755 發(fā)表于 2022-3-27 17:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  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. 陰天/無(wú)陽(yáng)光直射(5000-15000Lux),3小時(shí)
  9. 晴朗/適合戶外運(yùn)動(dòng)(15000-100000 Lux),3小時(shí)
  10. 陽(yáng)光直射(10W Lux),1小時(shí)

  11. **************************************/
  12. void bh1750_iic_init(void)
  13. {
  14.         GPIO_InitTypeDef GPIO_InitStructure;
  15.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB時(shí)鐘
  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);  //發(fā)送器件地址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("光照強(qiáng)度:%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);  //發(fā)送器件地址0100 0110   最后一位0,表示寫
  106.         bh1750_recv_ack();
  107.         bh1750_send_byte(0x20);   //發(fā)送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();        //主機(jī)應(yīng)答
  116.         //temp1=temp<<8;
  117.         BUF[1]=bh1750_recv_byte(0);
  118.         //IIC_NAck();        //主機(jī)不應(yīng)答       
  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連續(xù)讀Lux****/
  130. /****
  131. 模式選擇:H-Resolution Mode,分辨率1lux
  132. 連續(xù)讀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);  //發(fā)送器件地址0100 0110   最后一位0,表示寫
  140.         bh1750_recv_ack();
  141.         bh1750_send_byte(0x10);  //發(fā)送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. 起始信號(hào)
  170. **************************************/
  171. void bh1750_iic_start(void)
  172. {
  173.                 BH1750_SDA_OUT()       //設(shè)置SDA線為輸出
  174.         //在開(kāi)始數(shù)據(jù)傳輸前,先讓SDA和SCL都拉高
  175.                 BH1750_IIC_SDA=1;    //發(fā)送起始條件的數(shù)據(jù)信號(hào),釋放總線
  176.           delay_us(2);
  177.                 BH1750_IIC_SCL=1;   

  178.                 delay_us(5);   //Tsu;STA:起始條件的建立時(shí)間大于4.7us。
  179.        
  180.                 BH1750_IIC_SDA=0;    //SDA由高變?yōu)榈捅硎鹃_(kāi)始信號(hào)
  181.                 delay_us(4);   //起始條件的保持時(shí)間大于4us
  182.                 BH1750_IIC_SCL=0;    //鉗住IIC總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
  183.                 delay_us(2);
  184. }

  185. /**************************************
  186. 停止信號(hào)
  187. **************************************/
  188. void bh1750_iic_stop(void)
  189. {
  190.         BH1750_SDA_OUT()       //設(shè)置SDA線為輸出
  191.        
  192.         //IIC_SCL=0;    //此句是調(diào)試BH1750時(shí)加,2018.03.03
  193.        
  194.         BH1750_IIC_SDA=0;   //發(fā)送停止信號(hào)的數(shù)據(jù)信號(hào)
  195.         delay_us(2);
  196.         BH1750_IIC_SCL=1;   //發(fā)送停止信號(hào)的時(shí)鐘信號(hào)
  197.         delay_us(5);  //停止信號(hào)的建立時(shí)間大于4us
  198.         BH1750_IIC_SDA=1;   //發(fā)送停止信號(hào)
  199.         delay_us(4);    //;
  200. }

  201. /**************************************
  202. 發(fā)送應(yīng)答信號(hào)
  203. 入口參數(shù):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;   //主器件應(yīng)答
  210.         delay_us(2);
  211.         BH1750_IIC_SCL=1;
  212.         delay_us(4);        //SCL高電平周期大于4us
  213.         BH1750_IIC_SCL=0;         //清時(shí)鐘線,鉗住IIC總線以便繼續(xù)接收
  214.         delay_us(2);

  215. }

  216. /**************************************
  217. 接收應(yīng)答信號(hào)
  218. **************************************/
  219. char bh1750_recv_ack(void)
  220. {
  221.         u8 ucErrorTime=0;
  222.         BH1750_SDA_IN();     //SDA設(shè)置成輸入
  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總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  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;   //判斷發(fā)送位
  249.                 else BH1750_IIC_SDA=0;

  250.                 delay_us(2);
  251.                 BH1750_IIC_SCL=1;     //拉高SCL,通知被控器開(kāi)始接收數(shù)據(jù)位
  252.                 delay_us(4);   //保證SCL高電平周期大于4us
  253.                 BH1750_IIC_SCL=0;    //拉低SCL,允許SDA傳輸下一位數(shù)據(jù)。因?yàn)橹挥性赟CL=0時(shí)才允許SDA的狀態(tài)發(fā)生變化
  254.           delay_us(2);
  255.    }
  256.          //以下四句是調(diào)試BH1750時(shí)添加的,2018.03.03
  257.          //特別注意;用方法三時(shí),以下四句不可去掉,去掉后得到的數(shù)有問(wèn)題
  258.          //用方法二時(shí),以下四句需注釋掉,否則也會(huì)有問(wèn)題,至于原因暫時(shí)還不清楚。
  259. //          IIC_SDA=0;
  260. //          delay_us(2);
  261. //          IIC_SCL=1;
  262. //          delay_us(2);
  263.          
  264.          BH1750_IIC_SCL=0;      //拉低SCL,為下次數(shù)據(jù)傳輸做好準(zhǔn)備
  265.          delay_us(2);
  266. }

  267. /**************************************
  268. 從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
  269. 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),ack為1時(shí),發(fā)送Ack(產(chǎn)生應(yīng)答);ack為0時(shí),發(fā)送NAck(不產(chǎn)生應(yīng)答)
  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為低,準(zhǔn)備接收數(shù)據(jù)位
  278.                 delay_us(5);  //時(shí)鐘低電平周期大于4.7us
  279.                 BH1750_IIC_SCL=1;   //置SCL為高,使SDA上數(shù)據(jù)有效
  280.                 delay_us(2);
  281.                 receive=receive<<1;
  282.                 if(BH1750_READ_SDA) receive=receive+1;    //讀取SDA,把接收的數(shù)據(jù)位放入receve中,若此處寫成IIC_SDA==1,會(huì)失敗,思考原因?       
  283.                 delay_us(2);
  284.   }
  285.         if(!ack)
  286.                 bh1750_send_ack(1);   //發(fā)送NAck
  287.         else
  288.                 bh1750_send_ack(0);    //發(fā)送Ack
  289.         //IIC_SCL=0;      //在此處有何用處???(猜測(cè):為下次數(shù)據(jù)傳輸做好準(zhǔn)備, //鉗住IIC總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù))
  290.         //delay_us(2);
  291.         return receive;
  292. }
復(fù)制代碼

Keil代碼下載: STM32_GY-30 bh1750光照傳感器 串口打印.7z (183.52 KB, 下載次數(shù): 59)

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:696872 發(fā)表于 2022-4-30 10:09 | 只看該作者
大佬,在32f1上通用嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表