久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9530|回復: 14
收起左側

STM32 BH1750光線感應源程序

  [復制鏈接]
ID:345364 發表于 2018-6-5 13:46 | 顯示全部樓層 |閱讀模式
基于BH1750模塊實現的光強度檢測,使用的是STM32F103C8T6

單片機源程序如下:
  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時鐘
  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單次寫命令****/
  19. void Single_Write_bh1750(unsigned char Reg_Address)
  20. {
  21.         bh1750_iic_start();
  22.         bh1750_send_byte(0x46);  //發送器件地址0100 0110   最后一位0,表示寫
  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("光照強度:%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);  //發送器件地址0100 0110   最后一位0,表示寫
  101.         bh1750_recv_ack();
  102.         bh1750_send_byte(0x20);   //發送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();        //主機應答
  111.         //temp1=temp<<8;
  112.         BUF[1]=bh1750_recv_byte(0);
  113.         //IIC_NAck();        //主機不應答        
  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連續讀Lux****/
  125. /****
  126. 模式選擇:H-Resolution Mode,分辨率1lux
  127. 連續讀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);  //發送器件地址0100 0110   最后一位0,表示寫
  135.         bh1750_recv_ack();
  136.         bh1750_send_byte(0x10);  //發送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. 起始信號
  165. **************************************/
  166. void bh1750_iic_start(void)
  167. {
  168.                 BH1750_SDA_OUT()       //設置SDA線為輸出
  169.         //在開始數據傳輸前,先讓SDA和SCL都拉高
  170.                 BH1750_IIC_SDA=1;    //發送起始條件的數據信號,釋放總線
  171.           delay_us(2);
  172.                 BH1750_IIC_SCL=1;   

  173.                 delay_us(5);   //Tsu;STA:起始條件的建立時間大于4.7us。
  174.         
  175.                 BH1750_IIC_SDA=0;    //SDA由高變為低表示開始信號
  176.                 delay_us(4);   //起始條件的保持時間大于4us
  177.                 BH1750_IIC_SCL=0;    //鉗住IIC總線,準備發送或者接收數據
  178.                 delay_us(2);
  179. }

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

  196. /**************************************
  197. 發送應答信號
  198. 入口參數: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;   //主器件應答
  205.         delay_us(2);
  206.         BH1750_IIC_SCL=1;
  207.         delay_us(4);        //SCL高電平周期大于4us
  208.         BH1750_IIC_SCL=0;         //清時鐘線,鉗住IIC總線以便繼續接收
  209.         delay_us(2);

  210. }

  211. /**************************************
  212. 接收應答信號
  213. **************************************/
  214. char bh1750_recv_ack(void)
  215. {
  216.         u8 ucErrorTime=0;
  217.         BH1750_SDA_IN();     //SDA設置成輸入
  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總線發送一個字節數據
  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;   //判斷發送位
  244.                 else BH1750_IIC_SDA=0;

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

  262. /**************************************
  263. 從IIC總線接收一個字節數據
  264. 用來接收從器件傳來的數據,ack為1時,發送Ack(產生應答);ack為0時,發送NAck(不產生應答)
  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為低,準備接收數據位
  273.                 delay_us(5);  //時鐘低電平周期大于4.7us
  274.                 BH1750_IIC_SCL=1;   //置SCL為高,使SDA上數據有效
  275.                 delay_us(2);
  276.                 receive=receive<<1;
  277.                 if(BH1750_READ_SDA) receive=receive+1;    //讀取SDA,把接收的數據位放入receve中,若此處寫成IIC_SDA==1,會失敗,思考原因?        
  278.                 delay_us(2);
  279.   }
  280.         if(!ack)
  281. ……………………

  282. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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

評分

參與人數 2黑幣 +51 收起 理由
pdd708 + 1 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:95072 發表于 2018-7-26 17:21 | 顯示全部樓層
非常感謝
回復

使用道具 舉報

ID:382687 發表于 2018-8-3 20:29 | 顯示全部樓層
下載來學習學習,感謝樓主
回復

使用道具 舉報

ID:219315 發表于 2018-11-17 14:31 | 顯示全部樓層
感謝樓主,
非常感謝
回復

使用道具 舉報

ID:489605 發表于 2019-3-12 23:23 | 顯示全部樓層
jach09 發表于 2018-11-17 14:31
感謝樓主,
非常感謝

非常感謝,很好
回復

使用道具 舉報

ID:489675 發表于 2019-3-13 09:20 | 顯示全部樓層
非常感謝,太好了
回復

使用道具 舉報

ID:275634 發表于 2019-3-30 20:46 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:306124 發表于 2019-4-1 15:02 | 顯示全部樓層
非常感謝
回復

使用道具 舉報

ID:579624 發表于 2019-10-26 10:31 | 顯示全部樓層
編譯的時候出現問題,說無法打開.\core_cm3.o 這是什么問題呀,煩請樓主解答一下
回復

使用道具 舉報

ID:648623 發表于 2019-12-29 01:17 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:391164 發表于 2020-3-16 19:46 | 顯示全部樓層
我測試了一下不行,數據一致不更新
回復

使用道具 舉報

ID:543372 發表于 2020-6-6 12:33 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:425175 發表于 2020-7-11 23:40 | 顯示全部樓層
測試通過,謝謝樓主!
回復

使用道具 舉報

ID:1068392 發表于 2023-3-27 21:30 | 顯示全部樓層
有大佬能根據樓主的資料畫個仿真圖嗎?
回復

使用道具 舉報

ID:982617 發表于 2023-4-18 13:31 | 顯示全部樓層
求問 實物怎么連接
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看一区二区 | 亚洲天堂二区 | 一区二区三区精品在线视频 | 久久久高清| 精品国产乱码久久久久久影片 | 国产欧美在线播放 | 狠狠涩 | 九九国产在线观看 | av第一页 | 国产精品射 | 欧产日产国产精品99 | 欧美成人猛片aaaaaaa | 国产精品1区 | 亚洲综合无码一区二区 | 超碰97干| 日一日操一操 | 欧美99| av中文天堂 | 一级做a| 国产福利小视频 | 九九九久久国产免费 | 久久亚洲精品国产精品紫薇 | 欧美a在线看| av网站免费 | 国产一区精品 | 毛片.com| 免费看a | www.久久久.com | 91久久久久久久久久久久久 | 夜夜摸天天操 | 亚洲精品在线看 | 亚洲91精品 | 久草在线 | av网站在线免费观看 | 四虎影院在线观看av | 免费观看a级毛片在线播放 黄网站免费入口 | 精品久久久久久久久久久久 | 精品国产一区二区国模嫣然 | 欧美一区二区免费视频 | 日韩中文字幕免费在线 | 久久久久久91 |