标题: 基于单片机GY-39光照度计程序设计(oled显示) [打印本页]
作者: 点点天地心 时间: 2018-12-19 16:36
标题: 基于单片机GY-39光照度计程序设计(oled显示)
在只有一个51单片机、一个光照感度计GY-39和一个OLED以及一个蜂鸣器的条件下我们接成一个简单的组成模块。构成我们所需材料,我们的目的就是想让这个光照感度计在我们的设计之下可以根据光照显示一些数值,在一定的光照下能通过蜂鸣器发出报警的声音,则说明这时候光照已经达到了某一个值。设计图如下所示:
单片机源程序如下:
- #include <REG51.H>
- #include <math.h>
- #include <stdio.h>
- #include <INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- #include "oled.h"
- sbit SCL=P0^0; //IIC时钟引脚定义
- sbit SDA=P0^1; //IIC数据引脚定义
- sbit SPK=P2^1;
- unsigned char frq;
- void DUs2x(unsigned char t);
- void DMs(unsigned char t);
- #define SlaveAddress 0x46
-
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- BYTE BUF[8];
- unsigned char ge,shi,bai,qian,wan;
- int dis_data;
- void delay_nms(unsigned int k);
- void Init_BH1750(void);
- void WriteDataLCM(uchar dataW);
- void WriteCommandLCM(uchar CMD,uchar Attribc);
- void conversion(uint temp_data);
- void Single_Write_BH1750(uchar REG_Address);
- uchar Single_Read_BH1750(uchar REG_Address);
- void Multiple_Read_BH1750();
- //------------------------------------
- void Delay5us();
- void Delay5ms();
- void BH1750_Start(); //起始信号
- void BH1750_Stop(); //停止信号
- void BH1750_SendACK(bit ack); //应答ACK
- bit BH1750_RecvACK(); //读ack
- void BH1750_SendByte(BYTE dat); //IIC单个字节写
- BYTE BH1750_RecvByte(); //IIC单个字节读
- unsigned char i;
- //-----------------------------------
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- //*********************************************************
- void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
- {
- wan=temp_data/10000+0x30 ;
- temp_data=temp_data%10000;
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000;
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100;
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10;
- ge=temp_data+0x30;
- }
- //毫秒延时**************************
- void delay_nms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}}
- }
- /**************************************/
- void Delay5us()
- {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
- /**************************************
- 延时5毫秒
- **************************************/
- void Delay5ms()
- {
- WORD n = 560;
- while (n--);
- }
- /**************************************
- 延时m毫秒
- **************************************/
- void Delayms(uchar m)
- {
- WORD n = 110;
- for(m;m>0;m--)
- {
- for(n;n>0;n--);
- }
- }
- /**************************************
- 起始信号
- **************************************/
- void BH1750_Start()
- {
- SDA = 1;
- SCL = 1;
- Delay5us();
- SDA = 0;
- Delay5us();
- SCL = 0;
- }
- /**************************************
- 停止信号
- **************************************/
- void BH1750_Stop()
- {
- SDA = 0;
- SCL = 1;
- Delay5us();
- SDA = 1;
- Delay5us();
- }
- /**************************************
- 发送应答信号
- 入口参数:ack (0:ACK 1:NAK)
- **************************************/
- void BH1750_SendACK(bit ack)
- {
- SDA = ack;
- SCL = 1;
- Delay5us();
- SCL = 0;
- Delay5us();
- }
- /**************************************
- 接收应答信号
- **************************************/
- bit BH1750_RecvACK()
- {
- SCL = 1;
- Delay5us();
- CY = SDA;
- SCL = 0;
- Delay5us();
- return CY;
- }
- /**************************************
- 向IIC总线发送一个字节数据
- **************************************/
- void BH1750_SendByte(BYTE dat)
- {
- BYTE i;
- for (i=0; i<8; i++)
- {
- dat <<= 1;
- SDA = CY;
- SCL = 1;
- Delay5us();
- SCL = 0;
- Delay5us();
- }
- BH1750_RecvACK();
- }
- /**************************************
- 从IIC总线接收一个字节数据
- **************************************/
- BYTE BH1750_RecvByte()
- {
- BYTE i;
- BYTE dat = 0;
- SDA = 1;
- for (i=0; i<8; i++)
- {
- dat <<= 1;
- SCL = 1;
- Delay5us();
- dat |= SDA;
- SCL = 0;
- Delay5us();
- }
- return dat;
- }
- //*********************************
- void Single_Write_BH1750(uchar REG_Address)
- {
- BH1750_Start();
- BH1750_SendByte(SlaveAddress);
- BH1750_SendByte(REG_Address);
-
- BH1750_Stop();
- }
- /*********************************************************
- 连续读出BH1750内部数据
- *********************************************************/
- void Multiple_read_BH1750(void)
- { uchar i;
- BH1750_Start();
- BH1750_SendByte(SlaveAddress+1);
-
- for (i=0; i<3; i++)
- {
- BUF[ i] = BH1750_RecvByte();
- if (i == 3)
- {
- BH1750_SendACK(1);
- }
- else
- {
- BH1750_SendACK(0);
- }
- }
- BH1750_Stop();
- Delay5ms();
- }
- //初始化BH1750,
- void Init_BH1750()
- {
- Single_Write_BH1750(0x01);
- }
- //*********************************************************
- //主程序
- //*********************************************************
- float temp;
- void main()
- {
- delay_nms(100);
- Init_Timer0();
- Init_BH1750(); //初始化BH1750
- OLED_Init(); //oled 初始化
- while(1)
- {
- Single_Write_BH1750(0x01); // power on
- Single_Write_BH1750(0x10); // H- resolution mode
- delay_nms(180); //延时180ms
- Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
- temp=(float)dis_data/1.2;
- conversion(temp); //计算数据和显示
- OLED_ShowString(0,1,"the power is:");
- OLED_ShowNum(20,4,temp,8,17);
- OLED_ShowString(90,4,"lx");
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
见2楼
作者: 点点天地心 时间: 2018-12-19 16:38
基于单片机光照度计(oled显示),忘记上传了
-
-
基于单片机光照度计(oled显示).zip
69.85 KB, 下载次数: 153, 下载积分: 黑币 -5
代码
作者: 大雨 时间: 2018-12-29 15:26
好好学习
作者: 13888569 时间: 2019-3-1 11:13
点点天地心 发表于 2018-12-19 16:38
基于单片机光照度计(oled显示),忘记上传了
版主,有实物连接图嘛
作者: 603540290 时间: 2019-3-6 11:27
你好,我们设计跟您基本一样,现在就是无法将GY39的数据通过单片机显示到OLED,能询问您一些问题吗
作者: 点点天地心 时间: 2019-3-6 19:23
好久以前的了,物理连接的实物都没有了,抱歉了
作者: 点点天地心 时间: 2019-3-6 19:25
我当时只显示到OLED,然后OLED的数据不能实时刷新,只能手动复位
作者: liuliuliub 时间: 2019-4-3 17:10
您好,我打开GY 39的软件只有接收计数在涨,其他光照等数值都是零,能请问下这是什么问题么
作者: xiexie0908 时间: 2020-9-17 11:03
可不可以直接将GY-39返回的HEX内容直接输出成text文本
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |