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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2501|回復: 1
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:651755 發(fā)表于 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);  //發(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("光照強度:%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();        //主機應答
  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連續(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. 起始信號
  170. **************************************/
  171. void bh1750_iic_start(void)
  172. {
  173.                 BH1750_SDA_OUT()       //設置SDA線為輸出
  174.         //在開始數(shù)據傳輸前,先讓SDA和SCL都拉高
  175.                 BH1750_IIC_SDA=1;    //發(fā)送起始條件的數(shù)據信號,釋放總線
  176.           delay_us(2);
  177.                 BH1750_IIC_SCL=1;   

  178.                 delay_us(5);   //Tsu;STA:起始條件的建立時間大于4.7us。
  179.        
  180.                 BH1750_IIC_SDA=0;    //SDA由高變?yōu)榈捅硎鹃_始信號
  181.                 delay_us(4);   //起始條件的保持時間大于4us
  182.                 BH1750_IIC_SCL=0;    //鉗住IIC總線,準備發(fā)送或者接收數(shù)據
  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;   //發(fā)送停止信號的數(shù)據信號
  195.         delay_us(2);
  196.         BH1750_IIC_SCL=1;   //發(fā)送停止信號的時鐘信號
  197.         delay_us(5);  //停止信號的建立時間大于4us
  198.         BH1750_IIC_SDA=1;   //發(fā)送停止信號
  199.         delay_us(4);    //;
  200. }

  201. /**************************************
  202. 發(fā)送應答信號
  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;   //主器件應答
  210.         delay_us(2);
  211.         BH1750_IIC_SCL=1;
  212.         delay_us(4);        //SCL高電平周期大于4us
  213.         BH1750_IIC_SCL=0;         //清時鐘線,鉗住IIC總線以便繼續(xù)接收
  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總線發(fā)送一個字節(jié)數(shù)據
  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,通知被控器開始接收數(shù)據位
  252.                 delay_us(4);   //保證SCL高電平周期大于4us
  253.                 BH1750_IIC_SCL=0;    //拉低SCL,允許SDA傳輸下一位數(shù)據。因為只有在SCL=0時才允許SDA的狀態(tài)發(fā)生變化
  254.           delay_us(2);
  255.    }
  256.          //以下四句是調試BH1750時添加的,2018.03.03
  257.          //特別注意;用方法三時,以下四句不可去掉,去掉后得到的數(shù)有問題
  258.          //用方法二時,以下四句需注釋掉,否則也會有問題,至于原因暫時還不清楚。
  259. //          IIC_SDA=0;
  260. //          delay_us(2);
  261. //          IIC_SCL=1;
  262. //          delay_us(2);
  263.          
  264.          BH1750_IIC_SCL=0;      //拉低SCL,為下次數(shù)據傳輸做好準備
  265.          delay_us(2);
  266. }

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

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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 麻豆精品一区二区三区在线观看 | 久久久www成人免费无遮挡大片 | 日韩在线欧美 | 久久久精品视频免费 | 做a网站 | 荷兰欧美一级毛片 | 欧美a区| 9久久精品 | 特级黄色毛片 | 亚洲色图综合 | 亚洲精品国产成人 | 欧美成人免费在线视频 | 祝你幸福电影在线观看 | 亚洲国产精品久久久 | 精品国产31久久久久久 | 日韩电影在线 | 看片wwwwwwwwwww | 国产精品伦理一区二区三区 | 欧美久久综合 | 久久av一区 | 久草在线在线精品观看 | 久久精品小视频 | 蜜桃视频在线观看www社区 | 91看片免费 | 午夜视频网站 | 亚洲日产精品 | 99视频免费 | 人人做人人澡人人爽欧美 | 亚洲一区国产 | 久久国产精品偷 | 三级免费av| 久久99精品视频 | av在线播放网址 | 久久这里只有精品首页 | 国产成人免费在线 | 亚洲高清在线免费观看 | av在线免费观看网站 | 成人a视频 | 国产精品亚洲一区二区三区在线观看 | 91视频免费在观看 |