一、DHT11简介 DHT11是一款有已校准数字信号输出的温湿度传感器,传感器包括一个电阻式感湿元件和一个NTC测温元件。
pin | 名称 | 注释 | 1 | VDD | 供电 3-5.5V DC | 2 | DATA | 串行数据,单总线 | 3 | NC | 空脚,请悬空 | 4 | GND | 接地,电源负极 |
二、DHT11模块特点 1. 可以检测周围环境的湿度和温度。 2. 湿度测量范围:20% - 95%(0 度-50 度范围)湿度测量误差:+-5%。
3. 温度测量范围:0 度 - 50 度温度测量误差:+/-2 度。
4. 工作电压3.3V - 5V。 5. 输出形式数字输出。
6. 单线制串行接口。
三、DHT11原理图
四、程序 [plain] view plain copy
- #include <reg52.h>
- #include <intrins.h>
-
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable */
- typedef signed char S8; /* defined for signed 8-bits integer variable */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable */
- typedef signed int S16; /* defined for signed 16-bits integer variable */
- typedef unsigned long U32; /* defined for unsigned 32-bits integer variable */
- typedef signed long S32; /* defined for signed 32-bits integer variable */
- typedef float F32; /* single precision floating point variable 32 */
- typedef double F64; /* double precision floating point variable 64 */
-
- #define uchar unsigned char
- #define uint unsigned int
- #define Data_0_time 4
-
- sbit P2_0 = P2^0 ;
-
- U8 U8FLAG,k;
- U8 U8count,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- U8 U8comdata;
- U8 outdata[5];
- U8 indata[5];
- U8 count, count_r = 0;
- U8 str[5]={"RS232"};
- U16 U16temp1,U16temp2;
-
- void SendData(U8 *a)
- {
- outdata[0] = a[0];
- outdata[1] = a[1];
- outdata[2] = a[2];
- outdata[3] = a[3];
- outdata[4] = a[4];
- count = 1;
- SBUF = outdata[0];
- }
-
- void Delay(U16 j)
- {
- U8 i;
- for(; j > 0; j--)
- {
- for(i = 0; i < 27; i++);
- }
- }
-
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
-
- void COM(void)
- {
- U8 i;
- for(i = 0; i < 8; i++)
- {
- U8FLAG = 2;
- while((!P2_0) && U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp = 0;
- if(P2_0)U8temp = 1;
- U8FLAG = 2;
- while((P2_0) && U8FLAG++);
-
- if(U8FLAG == 1)break;
-
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }
- }
-
- void RH(void)
- {
- P2_0 = 0;
- Delay(180);
- P2_0 = 1;
-
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
-
- P2_0 = 1;
-
- if(!P2_0) //T !
- {
- U8FLAG = 2;
-
- while((!P2_0) && U8FLAG++);
- U8FLAG = 2;
-
- while((P2_0) && U8FLAG++);
-
- COM();
- U8RH_data_H_temp = U8comdata;
- COM();
- U8RH_data_L_temp = U8comdata;
- COM();
- U8T_data_H_temp = U8comdata;
- COM();
- U8T_data_L_temp = U8comdata;
- COM();
- U8checkdata_temp = U8comdata;
- P2_0 = 1;
-
- U8temp = (U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp + U8RH_data_L_temp);
- if(U8temp == U8checkdata_temp)
- {
- U8RH_data_H = U8RH_data_H_temp;
- U8RH_data_L = U8RH_data_L_temp;
- U8T_data_H = U8T_data_H_temp;
- U8T_data_L = U8T_data_L_temp;
- U8checkdata = U8checkdata_temp;
- }
- }
- }
-
- void main()
- {
- //uchar str[6]={"RS232"};
-
- TMOD = 0x20;
- TH1 = 253;
- TL1 = 253;
- TR1 = 1;
- SCON = 0x50;
- ES = 1;
- EA = 1;
- TI = 0;
- RI = 0;
- SendData(str);
- Delay(1);
- while(1)
- {
- RH();
-
- str[0] = U8RH_data_H;
- str[1] = U8RH_data_L;
- str[2] = U8T_data_H;
- str[3] = U8T_data_L;
- str[4] = U8checkdata;
- SendData(str);
-
- Delay(20000);
- }
- }
-
- void RSINTR() interrupt 4 using 2
- {
- U8 InPut3;
- if(TI == 1)
- {
- TI = 0;
- if(count != 5)
- {
- SBUF = outdata[count];
- count++;
- }
- }
-
- if(RI == 1)
- {
- InPut3 = SBUF;
- indata[count_r] = InPut3;
- count_r++;
- RI = 0;
- if(count_r == 5)
- {
- count_r = 0;
- str[0] = indata[0];
- str[1] = indata[1];
- str[2] = indata[2];
- str[3] = indata[3];
- str[4] = indata[4];
- P0 = 0;
- }
- }
- }
|