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取模軟件)
DHT11.jpg (15.6 KB, 下載次數: 85)
下載附件
2021-10-25 19:50 上傳
原理圖.png (165.85 KB, 下載次數: 54)
下載附件
原理圖
2021-10-25 19:50 上傳
BH1750.jpg (9.43 KB, 下載次數: 71)
下載附件
2021-10-25 19:50 上傳
頂層.png (158.04 KB, 下載次數: 61)
下載附件
頂層
2021-10-25 19:50 上傳
底層.png (132.82 KB, 下載次數: 66)
下載附件
2021-10-25 19:50 上傳
單片機源程序如下:
- // 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);
- }
- }
-
復制代碼
51hei.png (6.21 KB, 下載次數: 60)
下載附件
2021-10-26 20:28 上傳
程序和傳感器PDF下載:
程序.7z
(2.72 MB, 下載次數: 156)
2021-10-26 20:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|