DHT11 DHT11的供电电压为 3-5.5V。传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。 DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和 数据传送正确时校验和数据等于“ 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据” 所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 0.96 寸 OLED 模块
IIC 接口模块
模块接口定义:
1. GND 电源地
2. VCC 电源正(3~5.5V)
3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚
4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚 BH1750 BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。 硬件电路见图 (PS:所有资料都放在附件中,需要可自行下载;程还加入了一些其他功能,大家可以根据需求自行修改;附OLED取模软件)
单片机源程序如下:
- // GND 电源地
- // VCC 接5V或3.3v电源
- // D0 P1^0(SCL)
- // D1 P1^1(SDA)
- // RES 接P12
- // DC 接P13
- // CS 接P14
- //******************************************************************************/
- #include "REG52.h"
- #include "oled.h"
- #include "bmp.h"
- #include <math.h>
- #include <stdio.h>
- #include "intrins.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit SCL=P1^3;
- sbit SDA=P1^4;
- sbit LED1=P2^3;
- sbit LED2=P2^4;
- sbit D1=P2^5;
- sbit D2=P2^6;
- #define SlaveAddress 0x46
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- static unsigned int time;
- BYTE BUF[8];
- unsigned char ge,shi,bai,qian,wan;
- int dis_data;
- void delay_nms(unsigned int k);
- void Init_BH1750(void);
- 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);
- bit BH1750_RecvACK();
- void BH1750_SendByte(BYTE dat);
- BYTE BH1750_RecvByte();
- void conversion(uint temp_data)
- {
- 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 delay(uint u)
- {
- while(u--);
- }
- void Delay5us()
- {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
- void Delay5ms()
- {
- WORD n = 560;
- while (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();
- }
- 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;
- }
- 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();
- }
- 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();
- }
- 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();
- }
- void Init_BH1750()
- {
- Single_Write_BH1750(0x01);
- }
- uchar dat_r[4];
- sbit DATA=P2^2;
- void Delay30us() //@11.0592MHz-40
- {
- unsigned char i;
- i = 11;
- while (--i);
- }
- void Delay20ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 36;
- j = 217;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay1s() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- i = 8;
- j = 1;
- k = 243;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void DHT11_start()
- {
- DATA=1;
- _nop_();
- _nop_();
- DATA=0;
- Delay20ms();
- DATA=1;
- Delay30us();
- }
- uchar DHT11_rec_byte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!DATA);
- Delay30us();
- Delay30us();
- dat<<=1;
- if(DATA==1)
- dat+=1;
- while(DATA);
- }
- return dat;
- }
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(DATA==0)
- {
- while(DATA==0);
- Delay30us();
- Delay30us();
- Delay30us();
- R_H=DHT11_rec_byte();
- R_L=DHT11_rec_byte();
- T_H=DHT11_rec_byte();
- T_L=DHT11_rec_byte();
- revise=DHT11_rec_byte();
- Delay30us();
- if((R_H+R_L+T_H+T_L)==revise)
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- dat_r[0]='0'+(RH/10);
- dat_r[1]='0'+(RH%10);
- dat_r[2]='0'+(TH/10);
- dat_r[3]='0'+(TH%10);
- }
- }
- int main(void)
- {
- float temp;
- delay_nms(100);
- Init_BH1750();
- OLED_Init();
- OLED_Clear();
-
-
- OLED_Clear();
- OLED_ShowCHinese1(3,0,0);
- OLED_ShowCHinese1(21,0,1);
- OLED_ShowCHinese1(39,0,2);//温度
- OLED_ShowCHinese2(3,3,0);
- OLED_ShowCHinese2(21,3,1);
- OLED_ShowCHinese2(39,3,2);//湿度
- OLED_ShowCHinese3(3,6,0);
- OLED_ShowCHinese3(21,6,1);
- OLED_ShowCHinese3(39,6,2);//亮度
- while(1)
- {
-
- OLED_DrawBMP(90,0,106,2,BMP1);
- OLED_DrawBMP(90,3,106,5,BMP2);
- DHT11_receive();
- OLED_ShowChar(60,3,dat_r[0],16);
- OLED_ShowChar(70,3,dat_r[1],16);
- OLED_ShowChar(60,0,dat_r[2],16);
- OLED_ShowChar(70,0,dat_r[3],16);
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- delay_nms(180);
- Multiple_Read_BH1750();
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float)dis_data/1.2;
- conversion(temp);
- OLED_ShowNum(60,6,temp,3,16);
- if(temp>70)
- {
- LED1=1;
- LED2=1;
- D1=0;
- D2=0;
- }
- else
- {
- LED1=1;
- LED2=1;
- D1=1;
- D2=1;
- }
- delay_ms(100);
- }
- }
-
复制代码
程序和传感器PDF下载:
程序.7z
(2.72 MB, 下载次数: 135)
|