在只有一个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楼
|