找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7848|回复: 8
收起左侧

基于单片机GY-39光照度计程序设计(oled显示)

  [复制链接]
ID:347534 发表于 2018-12-19 16:36 | 显示全部楼层 |阅读模式
在只有一个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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:347534 发表于 2018-12-19 16:38 | 显示全部楼层
基于单片机光照度计(oled显示),忘记上传了

基于单片机光照度计(oled显示).zip

69.85 KB, 下载次数: 150, 下载积分: 黑币 -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显示),忘记上传了

版主,有实物连接图嘛
回复

使用道具 举报

ID:485442 发表于 2019-3-6 11:27 来自手机 | 显示全部楼层
你好,我们设计跟您基本一样,现在就是无法将GY39的数据通过单片机显示到OLED,能询问您一些问题吗
回复

使用道具 举报

ID:347534 发表于 2019-3-6 19:23 | 显示全部楼层
13888569 发表于 2019-3-1 11:13
版主,有实物连接图嘛

好久以前的了,物理连接的实物都没有了,抱歉了
回复

使用道具 举报

ID:347534 发表于 2019-3-6 19:25 | 显示全部楼层
603540290 发表于 2019-3-6 11:27
你好,我们设计跟您基本一样,现在就是无法将GY39的数据通过单片机显示到OLED,能询问您一些问题吗

我当时只显示到OLED,然后OLED的数据不能实时刷新,只能手动复位
回复

使用道具 举报

ID:504247 发表于 2019-4-3 17:10 来自手机 | 显示全部楼层
您好,我打开GY 39的软件只有接收计数在涨,其他光照等数值都是零,能请问下这是什么问题么
回复

使用道具 举报

ID:820082 发表于 2020-9-17 11:03 | 显示全部楼层
可不可以直接将GY-39返回的HEX内容直接输出成text文本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表