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
#endif
IO操作函数
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数据手册或者留言,将不定期更新常用模块或者芯片驱动代码。