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

QQ登錄

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

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

STM32 BH1750光線感應(yīng)源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:345364 發(fā)表于 2018-6-5 13:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于BH1750模塊實(shí)現(xiàn)的光強(qiáng)度檢測(cè),使用的是STM32F103C8T6

單片機(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. void bh1750_iic_init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB時(shí)鐘
  11.            
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.         GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6);         //PB6,PB7 輸出高

  17. }

  18. /****向BH1750單次寫(xiě)命令****/
  19. void Single_Write_bh1750(unsigned char Reg_Address)
  20. {
  21.         bh1750_iic_start();
  22.         bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫(xiě)
  23.         //IIC_Wait_Ack();
  24.         bh1750_send_byte(Reg_Address);  
  25.         //IIC_Wait_Ack();
  26.         bh1750_iic_stop();
  27. }

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

  90. /****從BH1750單次讀Lux****/
  91. /****
  92. 模式選擇:H-Resolution Mode,分辨率1lux
  93. 單次讀Opecode:0010 0000 ,即0x20
  94. 器件地址:0100011,ADDR接GND
  95. ****/
  96. void bh1750_ReadOneTime(void)
  97. {
  98.         

  99.         bh1750_iic_start();
  100.         bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫(xiě)
  101.         bh1750_recv_ack();
  102.         bh1750_send_byte(0x20);   //發(fā)送One time H-Resolution Mode的Opecode 0010 0000,分辨率為1lux
  103.         bh1750_recv_ack();
  104.         bh1750_iic_stop();
  105.         delay_ms(200);
  106.         bh1750_iic_start();
  107.         bh1750_send_byte(0x47);  //
  108.         bh1750_recv_ack();
  109.         BUF[0]=bh1750_recv_byte(1);
  110.         //IIC_Ack();        //主機(jī)應(yīng)答
  111.         //temp1=temp<<8;
  112.         BUF[1]=bh1750_recv_byte(0);
  113.         //IIC_NAck();        //主機(jī)不應(yīng)答        
  114.         bh1750_iic_stop();
  115.         
  116.         
  117. //         temp2=BUF[0];
  118. //         temp2=(temp2<<8)+BUF[1];
  119. //         lux=(float)temp2/1.2;    //lux是float型
  120.         
  121.         //return lux;
  122.         //delay_ms(200);
  123. }

  124. /****從BH1750連續(xù)讀Lux****/
  125. /****
  126. 模式選擇:H-Resolution Mode,分辨率1lux
  127. 連續(xù)讀Opecode:0001 0000
  128. 器件地址:0100011,ADDR接GND
  129. ****/
  130. void  bh1750_ReadContinuous1(void)
  131. {
  132. //        u16 temp=0,temp1=0;
  133.         bh1750_iic_start();
  134.   bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫(xiě)
  135.         bh1750_recv_ack();
  136.         bh1750_send_byte(0x10);  //發(fā)送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率為1lux
  137.         bh1750_recv_ack();
  138.         bh1750_iic_stop();
  139.         delay_ms(200);
  140.         bh1750_iic_start();
  141.   bh1750_send_byte(0x47);  
  142.         bh1750_recv_ack();
  143.         
  144.         
  145.          BUF[0]=bh1750_recv_byte(1);
  146.         BUF[1]=bh1750_recv_byte(0);        
  147.         
  148.         
  149.         //temp=bh1750_recv_byte(1);
  150.         //temp1=bh1750_recv_byte(0);


  151.         bh1750_iic_stop();
  152.         
  153.         //temp2=temp1+(temp<<8);
  154.         //lux=(float)temp2/1.2;    //lux是float型


  155. }

  156. void Conversion(void)
  157. {
  158.         temp2=BUF[0];
  159.         temp2=(temp2<<8)+BUF[1];
  160.         lux=(float)temp2/1.2;    //lux是float型
  161.         
  162. }






  163. /**************************************
  164. 起始信號(hào)
  165. **************************************/
  166. void bh1750_iic_start(void)
  167. {
  168.                 BH1750_SDA_OUT()       //設(shè)置SDA線為輸出
  169.         //在開(kāi)始數(shù)據(jù)傳輸前,先讓SDA和SCL都拉高
  170.                 BH1750_IIC_SDA=1;    //發(fā)送起始條件的數(shù)據(jù)信號(hào),釋放總線
  171.           delay_us(2);
  172.                 BH1750_IIC_SCL=1;   

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

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

  196. /**************************************
  197. 發(fā)送應(yīng)答信號(hào)
  198. 入口參數(shù):ack (0:ACK 1:NAK)
  199. **************************************/
  200. void bh1750_send_ack(char ack)
  201. {
  202.         BH1750_IIC_SCL=0;
  203.         BH1750_SDA_OUT();
  204.         BH1750_IIC_SDA=ack;   //主器件應(yīng)答
  205.         delay_us(2);
  206.         BH1750_IIC_SCL=1;
  207.         delay_us(4);        //SCL高電平周期大于4us
  208.         BH1750_IIC_SCL=0;         //清時(shí)鐘線,鉗住IIC總線以便繼續(xù)接收
  209.         delay_us(2);

  210. }

  211. /**************************************
  212. 接收應(yīng)答信號(hào)
  213. **************************************/
  214. char bh1750_recv_ack(void)
  215. {
  216.         u8 ucErrorTime=0;
  217.         BH1750_SDA_IN();     //SDA設(shè)置成輸入
  218.         BH1750_IIC_SDA=1;
  219.         delay_us(2);
  220.         BH1750_IIC_SCL=1;
  221.         delay_us(2);
  222.         while(BH1750_READ_SDA)
  223.         {
  224.                 ucErrorTime++;
  225.                 if(ucErrorTime>=250)
  226.                 {
  227.                         bh1750_iic_stop();
  228.                         return 1;               
  229.                 }
  230.         }
  231.         BH1750_IIC_SCL=0;
  232.         return 0;
  233. }

  234. /**************************************
  235. 向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  236. **************************************/
  237. void bh1750_send_byte(char dat)
  238. {
  239.         u8 i;
  240.         BH1750_SDA_OUT();  

  241.         for(i=0;i<8;i++)
  242.         {
  243.                 if((dat<<i)&0x80)  BH1750_IIC_SDA=1;   //判斷發(fā)送位
  244.                 else BH1750_IIC_SDA=0;

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

  262. /**************************************
  263. 從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
  264. 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),ack為1時(shí),發(fā)送Ack(產(chǎn)生應(yīng)答);ack為0時(shí),發(fā)送NAck(不產(chǎn)生應(yīng)答)
  265. **************************************/
  266. char bh1750_recv_byte(unsigned char ack)
  267. {
  268.         unsigned char i,receive=0;
  269.         BH1750_SDA_IN();   
  270.         for(i=0;i<8;i++)
  271.         {
  272.                 BH1750_IIC_SCL=0;    //置SCL為低,準(zhǔn)備接收數(shù)據(jù)位
  273.                 delay_us(5);  //時(shí)鐘低電平周期大于4.7us
  274.                 BH1750_IIC_SCL=1;   //置SCL為高,使SDA上數(shù)據(jù)有效
  275.                 delay_us(2);
  276.                 receive=receive<<1;
  277.                 if(BH1750_READ_SDA) receive=receive+1;    //讀取SDA,把接收的數(shù)據(jù)位放入receve中,若此處寫(xiě)成IIC_SDA==1,會(huì)失敗,思考原因?        
  278.                 delay_us(2);
  279.   }
  280.         if(!ack)
  281. ……………………

  282. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

Keil代碼下載:
bh1750.rar (275.76 KB, 下載次數(shù): 435)

評(píng)分

參與人數(shù) 2黑幣 +51 收起 理由
pdd708 + 1 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:95072 發(fā)表于 2018-7-26 17:21 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:382687 發(fā)表于 2018-8-3 20:29 | 只看該作者
下載來(lái)學(xué)習(xí)學(xué)習(xí),感謝樓主
回復(fù)

使用道具 舉報(bào)

地板
ID:219315 發(fā)表于 2018-11-17 14:31 | 只看該作者
感謝樓主,
非常感謝
回復(fù)

使用道具 舉報(bào)

5#
ID:489605 發(fā)表于 2019-3-12 23:23 | 只看該作者
jach09 發(fā)表于 2018-11-17 14:31
感謝樓主,
非常感謝

非常感謝,很好
回復(fù)

使用道具 舉報(bào)

6#
ID:489675 發(fā)表于 2019-3-13 09:20 | 只看該作者
非常感謝,太好了
回復(fù)

使用道具 舉報(bào)

7#
ID:275634 發(fā)表于 2019-3-30 20:46 | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

8#
ID:306124 發(fā)表于 2019-4-1 15:02 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

9#
ID:579624 發(fā)表于 2019-10-26 10:31 | 只看該作者
編譯的時(shí)候出現(xiàn)問(wèn)題,說(shuō)無(wú)法打開(kāi).\core_cm3.o 這是什么問(wèn)題呀,煩請(qǐng)樓主解答一下
回復(fù)

使用道具 舉報(bào)

10#
ID:648623 發(fā)表于 2019-12-29 01:17 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

11#
ID:391164 發(fā)表于 2020-3-16 19:46 | 只看該作者
我測(cè)試了一下不行,數(shù)據(jù)一致不更新
回復(fù)

使用道具 舉報(bào)

12#
ID:543372 發(fā)表于 2020-6-6 12:33 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

13#
ID:425175 發(fā)表于 2020-7-11 23:40 | 只看該作者
測(cè)試通過(guò),謝謝樓主!
回復(fù)

使用道具 舉報(bào)

14#
ID:1068392 發(fā)表于 2023-3-27 21:30 | 只看該作者
有大佬能根據(jù)樓主的資料畫(huà)個(gè)仿真圖嗎?
回復(fù)

使用道具 舉報(bào)

15#
ID:982617 發(fā)表于 2023-4-18 13:31 | 只看該作者
求問(wèn) 實(shí)物怎么連接
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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