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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機GY-39光照度計程序設計(oled顯示)

  [復制鏈接]
跳轉到指定樓層
樓主
在只有一個51單片機、一個光照感度計GY-39和一個OLED以及一個蜂鳴器的條件下我們接成一個簡單的組成模塊。構成我們所需材料,我們的目的就是想讓這個光照感度計在我們的設計之下可以根據光照顯示一些數值,在一定的光照下能通過蜂鳴器發出報警的聲音,則說明這時候光照已經達到了某一個值。設計圖如下所示:  


單片機源程序如下:
  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時鐘引腳定義
  9. sbit          SDA=P0^1;      //IIC數據引腳定義
  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();                    //起始信號
  33. void BH1750_Stop();                     //停止信號
  34. void BH1750_SendACK(bit ack);           //應答ACK
  35. bit  BH1750_RecvACK();                  //讀ack
  36. void BH1750_SendByte(BYTE dat);         //IIC單個字節寫
  37. BYTE BH1750_RecvByte();                 //IIC單個字節讀
  38. unsigned char i;
  39. //-----------------------------------
  40. void Init_Timer0(void)
  41. {
  42. TMOD |= 0x01;          //使用模式1,16位定時器   
  43. EA=1;            //總中斷打開
  44. ET0=1;           //定時器中斷打開
  45. TR0=1;           //定時器開關打開
  46. }
  47. //*********************************************************
  48. void conversion(uint temp_data)  //  數據轉換出 個,十,百,千,萬
  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. //毫秒延時**************************
  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. 延時5毫秒
  79. **************************************/
  80. void Delay5ms()
  81. {
  82.     WORD n = 560;

  83.     while (n--);
  84. }
  85. /**************************************
  86. 延時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. 起始信號
  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. 停止信號
  110. **************************************/
  111. void BH1750_Stop()
  112. {
  113.     SDA = 0;                    
  114.     SCL = 1;                  
  115.     Delay5us();               
  116.     SDA = 1;                    
  117.     Delay5us();              
  118. }

  119. /**************************************
  120. 發送應答信號
  121. 入口參數: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. 接收應答信號
  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總線發送一個字節數據
  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總線接收一個字節數據
  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. 連續讀出BH1750內部數據
  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);              //延時180ms

  231.     Multiple_Read_BH1750();       //連續讀出數據,存儲在BUF中

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

  234.     temp=(float)dis_data/1.2;

  235.     conversion(temp);         //計算數據和顯示

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

  239. ……………………

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

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:347534 發表于 2018-12-19 16:38 | 只看該作者
基于單片機光照度計(oled顯示),忘記上傳了

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

69.85 KB, 下載次數: 153, 下載積分: 黑幣 -5

代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:255919 發表于 2018-12-29 15:26 | 只看該作者
好好學習
回復

使用道具 舉報

地板
ID:482233 發表于 2019-3-1 11:13 來自手機 | 只看該作者
點點天地心 發表于 2018-12-19 16:38
基于單片機光照度計(oled顯示),忘記上傳了

版主,有實物連接圖嘛
回復

使用道具 舉報

5#
ID:485442 發表于 2019-3-6 11:27 來自手機 | 只看該作者
你好,我們設計跟您基本一樣,現在就是無法將GY39的數據通過單片機顯示到OLED,能詢問您一些問題嗎
回復

使用道具 舉報

6#
ID:347534 發表于 2019-3-6 19:23 | 只看該作者
13888569 發表于 2019-3-1 11:13
版主,有實物連接圖嘛

好久以前的了,物理連接的實物都沒有了,抱歉了
回復

使用道具 舉報

7#
ID:347534 發表于 2019-3-6 19:25 | 只看該作者
603540290 發表于 2019-3-6 11:27
你好,我們設計跟您基本一樣,現在就是無法將GY39的數據通過單片機顯示到OLED,能詢問您一些問題嗎

我當時只顯示到OLED,然后OLED的數據不能實時刷新,只能手動復位
回復

使用道具 舉報

8#
ID:504247 發表于 2019-4-3 17:10 來自手機 | 只看該作者
您好,我打開GY 39的軟件只有接收計數在漲,其他光照等數值都是零,能請問下這是什么問題么
回復

使用道具 舉報

9#
ID:820082 發表于 2020-9-17 11:03 | 只看該作者
可不可以直接將GY-39返回的HEX內容直接輸出成text文本
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av影音资源 | 国产精品久久久乱弄 | 国产1区2区3区 | 午夜精品一区二区三区三上悠亚 | 中文字幕久久精品 | 五月花丁香婷婷 | 亚洲高清在线观看 | 亚洲综合无码一区二区 | 日本精品久久 | 国产日韩久久久久69影院 | 欧美一级片在线观看 | 91tv在线观看| 亚洲精品欧美一区二区三区 | www.99热| 91xxx在线观看 | 粉嫩粉嫩芽的虎白女18在线视频 | 97精品超碰一区二区三区 | 亚洲三级av| 99re在线视频 | 天天躁日日躁xxxxaaaa | 成人精品啪啪欧美成 | 99reav| 欧美激情精品久久久久久 | 国产高清不卡 | 日韩精品久久久 | 亚洲欧美日韩精品久久亚洲区 | 黄色欧美| 五月天婷婷综合 | 国产精品久久久久久久久久免费 | 欧美αv | 亚洲激情在线 | av大全在线| 成人精品国产一区二区4080 | 免费国产成人av | 成人在线精品 | 先锋资源亚洲 | 久久9999久久 | 欧美精品1区2区 | 免费在线观看一区二区三区 | 精品视频在线免费观看 | 精品久久久久久久久久久久 |