1.硬件
STC89C52/90C516RD/89C516RD等
晶振:11.0592M
内存配置:
Memory Model为small,选择其他无法正常运行。
2.代码
dht11.h
#ifndef __DHT11_H
#define __DHT11_H
#include "reg52.h" #ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endifIO操作函数
sbit DHT11_DQ_OUT=P1^4; extern uchar idata rec_dat[15];
uchar get_dht11_data(uchar *temp, uchar *humi);
#endif
dht11.c
#include <dht11.h>
#include <intrins.h>
#include "delay.h"uchar idata rec_dat[15] = "";uchar idata humi_data_H = 0;
uchar idata humi_data_L = 0;
uchar idata temp_data_H = 0;
uchar idata temp_data_L = 0;
uchar idata check_data = 0;/***************************************************
* 延时子函数
* 延时10us
****************************************************/static void delay_10us() //@11.0592MHz
{uchar i;i = 2;while (--i);
}static void delay_30us() //@11.0592MHz
{uchar i;i = 11;while (--i);
}/*函数说明:获取dht11一个字节参数:void返回值:获取到的dht11一个字节的数据
*/
static uchar get_dht11_byte(void)
{ uchar i = 0;uchar time_out = 0;uchar temp = 0;uchar dht11_byte_data = 0;for(i=0;i<8;i++) {time_out=0; while((!DHT11_DQ_OUT)&&time_out++ <= 5); /* 每一bit数据开始之前,都有持续大约50us的低电平 */if(time_out == 6) break; /* 超时退出 */delay_30us(); /* 超过30us后还是高电平,表明该bit为1 */temp=0;if(DHT11_DQ_OUT)temp=1;time_out=0;while((DHT11_DQ_OUT)&&time_out++ <= 200);if(time_out==200)break;dht11_byte_data<<=1;dht11_byte_data|=temp; //0}return dht11_byte_data;
}/*函数说明:获取DHT11温湿度数据参数:*temp 温度 *humi 湿度返回值:获取成功返回0 失败返回1
*/
uchar get_dht11_data(uchar *temp, uchar *humi)
{uchar time_out;uchar temp1 = 0;DHT11_DQ_OUT=0;delay_ms(20); /* 主机至少拉低18ms */DHT11_DQ_OUT=1; delay_10us();delay_10us();delay_10us();delay_10us(); /* 主机拉高20-40us */time_out = 0;while(!DHT11_DQ_OUT && time_out++ <= 5); /* 等待DHT11回应 */if(time_out == 6) return 1; /* 超时退出,sht11未响应 */else /* DHT11响应 */{time_out=0; while((!DHT11_DQ_OUT)&&time_out++ <= 5); /* 等待DHT11响应完毕,大约需要延时80us */if(time_out == 6) return 1; /* 超时异常 */time_out=0;while((DHT11_DQ_OUT)&&time_out++ <= 5);if(time_out == 6) return 1; /* 超时异常 */ humi_data_H=get_dht11_byte();humi_data_L=get_dht11_byte();temp_data_H=get_dht11_byte();temp_data_L=get_dht11_byte();check_data =get_dht11_byte();DHT11_DQ_OUT=1;//数据校验 temp1 = (humi_data_H+humi_data_L+temp_data_H+temp_data_L);if(temp1 == check_data){*humi = humi_data_H;*temp = temp_data_H;rec_dat[0] = temp_data_H/10 + '0';rec_dat[1] = temp_data_H%10 + '0';rec_dat[2] = ' ';rec_dat[3] = humi_data_H/10 + '0';rec_dat[4] = humi_data_H%10 + '0';rec_dat[5] = '\0';}}return 0;
}
代码有任何问题请参考DHT11数据手册或者留言,将不定期更新常用模块或者芯片驱动代码。