標(biāo)題: 基于單片機(jī)GY-39光照度計(jì)程序設(shè)計(jì)(oled顯示) [打印本頁]

作者: 點(diǎn)點(diǎn)天地心    時(shí)間: 2018-12-19 16:36
標(biāo)題: 基于單片機(jī)GY-39光照度計(jì)程序設(shè)計(jì)(oled顯示)
在只有一個(gè)51單片機(jī)、一個(gè)光照感度計(jì)GY-39和一個(gè)OLED以及一個(gè)蜂鳴器的條件下我們接成一個(gè)簡(jiǎn)單的組成模塊。構(gòu)成我們所需材料,我們的目的就是想讓這個(gè)光照感度計(jì)在我們的設(shè)計(jì)之下可以根據(jù)光照顯示一些數(shù)值,在一定的光照下能通過蜂鳴器發(fā)出報(bào)警的聲音,則說明這時(shí)候光照已經(jīng)達(dá)到了某一個(gè)值。設(shè)計(jì)圖如下所示:  


單片機(jī)源程序如下:
  1. #include  <REG51.H>        
  2. #include  <math.h>     
  3. #include  <stdio.h>         
  4. #include  <INTRINS.H>
  5. #define   uchar unsigned char
  6. #define   uint unsigned int        
  7. #include "oled.h"

  8. sbit          SCL=P0^0;      //IIC時(shí)鐘引腳定義
  9. sbit          SDA=P0^1;      //IIC數(shù)據(jù)引腳定義
  10. sbit SPK=P2^1;
  11. unsigned char frq;
  12. void DUs2x(unsigned char t);
  13. void DMs(unsigned char t);
  14. #define          SlaveAddress   0x46
  15.                               
  16. typedef   unsigned char BYTE;
  17. typedef   unsigned short WORD;

  18. BYTE    BUF[8];                                    
  19. unsigned char   ge,shi,bai,qian,wan;            
  20. int     dis_data;                       

  21. void delay_nms(unsigned int k);
  22. void Init_BH1750(void);

  23. void WriteDataLCM(uchar dataW);
  24. void WriteCommandLCM(uchar CMD,uchar Attribc);
  25. void conversion(uint temp_data);

  26. void  Single_Write_BH1750(uchar REG_Address);              
  27. uchar Single_Read_BH1750(uchar REG_Address);              
  28. void  Multiple_Read_BH1750();                              
  29. //------------------------------------
  30. void Delay5us();
  31. void Delay5ms();
  32. void BH1750_Start();                    //起始信號(hào)
  33. void BH1750_Stop();                     //停止信號(hào)
  34. void BH1750_SendACK(bit ack);           //應(yīng)答ACK
  35. bit  BH1750_RecvACK();                  //讀ack
  36. void BH1750_SendByte(BYTE dat);         //IIC單個(gè)字節(jié)寫
  37. BYTE BH1750_RecvByte();                 //IIC單個(gè)字節(jié)讀
  38. unsigned char i;
  39. //-----------------------------------
  40. void Init_Timer0(void)
  41. {
  42. TMOD |= 0x01;          //使用模式1,16位定時(shí)器   
  43. EA=1;            //總中斷打開
  44. ET0=1;           //定時(shí)器中斷打開
  45. TR0=1;           //定時(shí)器開關(guān)打開
  46. }
  47. //*********************************************************
  48. void conversion(uint temp_data)  //  數(shù)據(jù)轉(zhuǎn)換出 個(gè),十,百,千,萬
  49. {  
  50.     wan=temp_data/10000+0x30 ;
  51.     temp_data=temp_data%10000;
  52.         qian=temp_data/1000+0x30 ;
  53.     temp_data=temp_data%1000;   
  54.     bai=temp_data/100+0x30   ;
  55.     temp_data=temp_data%100;     
  56.     shi=temp_data/10+0x30    ;
  57.     temp_data=temp_data%10;  
  58.     ge=temp_data+0x30;         
  59. }

  60. //毫秒延時(shí)**************************
  61. void delay_nms(unsigned int k)        
  62. {                                                
  63. unsigned int i,j;                                
  64. for(i=0;i<k;i++)
  65. {                        
  66. for(j=0;j<121;j++)                        
  67. {;}}                                                
  68. }

  69. /**************************************/
  70. void Delay5us()
  71. {
  72.     _nop_();_nop_();_nop_();_nop_();
  73.     _nop_();_nop_();_nop_();_nop_();
  74.         _nop_();_nop_();_nop_();_nop_();
  75.         _nop_();_nop_();_nop_();_nop_();
  76. }

  77. /**************************************
  78. 延時(shí)5毫秒
  79. **************************************/
  80. void Delay5ms()
  81. {
  82.     WORD n = 560;

  83.     while (n--);
  84. }
  85. /**************************************
  86. 延時(shí)m毫秒
  87. **************************************/
  88. void Delayms(uchar m)
  89. {
  90.     WORD n = 110;
  91.         for(m;m>0;m--)
  92.         {
  93.                 for(n;n>0;n--);
  94.         }
  95. }

  96. /**************************************
  97. 起始信號(hào)
  98. **************************************/
  99. void BH1750_Start()
  100. {
  101.     SDA = 1;                  
  102.     SCL = 1;                  
  103.     Delay5us();                 
  104.     SDA = 0;                  
  105.     Delay5us();                 
  106.     SCL = 0;                 
  107. }

  108. /**************************************
  109. 停止信號(hào)
  110. **************************************/
  111. void BH1750_Stop()
  112. {
  113.     SDA = 0;                    
  114.     SCL = 1;                  
  115.     Delay5us();               
  116.     SDA = 1;                    
  117.     Delay5us();              
  118. }

  119. /**************************************
  120. 發(fā)送應(yīng)答信號(hào)
  121. 入口參數(shù):ack (0:ACK 1:NAK)
  122. **************************************/
  123. void BH1750_SendACK(bit ack)
  124. {
  125.     SDA = ack;                  
  126.     SCL = 1;                  
  127.     Delay5us();               
  128.     SCL = 0;               
  129.     Delay5us();              
  130. }

  131. /**************************************
  132. 接收應(yīng)答信號(hào)
  133. **************************************/
  134. bit BH1750_RecvACK()
  135. {
  136.     SCL = 1;                  
  137.     Delay5us();            
  138.     CY = SDA;                 
  139.     SCL = 0;                    
  140.     Delay5us();               
  141.     return CY;
  142. }

  143. /**************************************
  144. 向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  145. **************************************/
  146. void BH1750_SendByte(BYTE dat)
  147. {
  148.     BYTE i;

  149.     for (i=0; i<8; i++)        
  150.     {
  151.         dat <<= 1;            
  152.         SDA = CY;              
  153.         SCL = 1;               
  154.         Delay5us();            
  155.         SCL = 0;               
  156.         Delay5us();           
  157.     }
  158.     BH1750_RecvACK();
  159. }

  160. /**************************************
  161. 從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
  162. **************************************/
  163. BYTE BH1750_RecvByte()
  164. {
  165.     BYTE i;
  166.     BYTE dat = 0;

  167.     SDA = 1;                    
  168.     for (i=0; i<8; i++)         
  169.     {
  170.         dat <<= 1;
  171.         SCL = 1;               
  172.         Delay5us();            
  173.         dat |= SDA;                        
  174.         SCL = 0;               
  175.         Delay5us();            
  176.     }
  177.     return dat;
  178. }

  179. //*********************************

  180. void Single_Write_BH1750(uchar REG_Address)
  181. {
  182.     BH1750_Start();                  
  183.     BH1750_SendByte(SlaveAddress);   
  184.     BH1750_SendByte(REG_Address);   
  185.       
  186.     BH1750_Stop();                 
  187. }


  188. /*********************************************************
  189. 連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
  190. *********************************************************/
  191. void Multiple_read_BH1750(void)
  192. {   uchar i;        
  193.     BH1750_Start();                          
  194.     BH1750_SendByte(SlaveAddress+1);         
  195.         
  196.          for (i=0; i<3; i++)                     
  197.     {
  198.         BUF[ i] = BH1750_RecvByte();        
  199.         if (i == 3)
  200.         {

  201.            BH1750_SendACK(1);               
  202.         }
  203.         else
  204.         {               
  205.           BH1750_SendACK(0);               
  206.        }
  207.    }

  208.     BH1750_Stop();                        
  209.     Delay5ms();
  210. }


  211. //初始化BH1750,
  212. void Init_BH1750()
  213. {
  214.    Single_Write_BH1750(0x01);  

  215. }

  216. //*********************************************************
  217. //主程序
  218. //*********************************************************
  219. float temp;
  220. void main()
  221. {  
  222.    delay_nms(100);              
  223.    Init_Timer0();         
  224.    Init_BH1750();       //初始化BH1750
  225.    OLED_Init(); //oled 初始化
  226.   while(1)            
  227.   {
  228.     Single_Write_BH1750(0x01);   // power on
  229.     Single_Write_BH1750(0x10);   // H- resolution mode

  230.      delay_nms(180);              //延時(shí)180ms

  231.     Multiple_Read_BH1750();       //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中

  232.     dis_data=BUF[0];
  233.     dis_data=(dis_data<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)

  234.     temp=(float)dis_data/1.2;

  235.     conversion(temp);         //計(jì)算數(shù)據(jù)和顯示

  236.         OLED_ShowString(0,1,"the power is:");
  237.         OLED_ShowNum(20,4,temp,8,17);
  238.         OLED_ShowString(90,4,"lx");

  239. ……………………

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

所有資料51hei提供下載:
見2樓



作者: 點(diǎn)點(diǎn)天地心    時(shí)間: 2018-12-19 16:38
基于單片機(jī)光照度計(jì)(oled顯示),忘記上傳了

基于單片機(jī)光照度計(jì)(oled顯示).zip

69.85 KB, 下載次數(shù): 153, 下載積分: 黑幣 -5

代碼


作者: 大雨    時(shí)間: 2018-12-29 15:26
好好學(xué)習(xí)
作者: 13888569    時(shí)間: 2019-3-1 11:13
點(diǎn)點(diǎn)天地心 發(fā)表于 2018-12-19 16:38
基于單片機(jī)光照度計(jì)(oled顯示),忘記上傳了

版主,有實(shí)物連接圖嘛
作者: 603540290    時(shí)間: 2019-3-6 11:27
你好,我們?cè)O(shè)計(jì)跟您基本一樣,現(xiàn)在就是無法將GY39的數(shù)據(jù)通過單片機(jī)顯示到OLED,能詢問您一些問題嗎
作者: 點(diǎn)點(diǎn)天地心    時(shí)間: 2019-3-6 19:23
13888569 發(fā)表于 2019-3-1 11:13
版主,有實(shí)物連接圖嘛

好久以前的了,物理連接的實(shí)物都沒有了,抱歉了
作者: 點(diǎn)點(diǎn)天地心    時(shí)間: 2019-3-6 19:25
603540290 發(fā)表于 2019-3-6 11:27
你好,我們?cè)O(shè)計(jì)跟您基本一樣,現(xiàn)在就是無法將GY39的數(shù)據(jù)通過單片機(jī)顯示到OLED,能詢問您一些問題嗎

我當(dāng)時(shí)只顯示到OLED,然后OLED的數(shù)據(jù)不能實(shí)時(shí)刷新,只能手動(dòng)復(fù)位
作者: liuliuliub    時(shí)間: 2019-4-3 17:10
您好,我打開GY 39的軟件只有接收計(jì)數(shù)在漲,其他光照等數(shù)值都是零,能請(qǐng)問下這是什么問題么
作者: xiexie0908    時(shí)間: 2020-9-17 11:03
可不可以直接將GY-39返回的HEX內(nèi)容直接輸出成text文本




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1