在只有一個51單片機、一個光照感度計GY-39和一個OLED以及一個蜂鳴器的條件下我們接成一個簡單的組成模塊。構成我們所需材料,我們的目的就是想讓這個光照感度計在我們的設計之下可以根據光照顯示一些數值,在一定的光照下能通過蜂鳴器發出報警的聲音,則說明這時候光照已經達到了某一個值。設計圖如下所示:
123.jpg (166.83 KB, 下載次數: 54)
下載附件
硬件結構
2018-12-19 16:36 上傳
單片機源程序如下:
- #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樓
|