时序图
主机发送起始信号
首先单片机将连接DHT11DATA引脚的GPIO口输出低电平,且低电平保持时间不能小于18ms (t1),然后拉高数据线20~40us (t2),等待读取DHT11的响应信号。
检测从机应答信号
DHT11的DATA引脚检测到外部信号有低电平(t1),并等待外部低电平信号结束(t⑵2),之后DHT11开始输出 80 us (t3)的低电平作为应答信号,紧接着输出 80us (t4)的高电平通知主机准备接收数据。
数据传输
DHT11在传输数据时,一次传输4字节温湿度值数据和1字节数据校验。其数据格式为:
1B湿度整数数据+1B湿度小数数据+1B温度整数数据+1B温度小数数据+1B校验位。
源码
dh11.c
#include<reg52.h>
#include<intrins.h>
#include"dh11.h"
sbit Temp_data=P3^6;
extern unsigned int rec_dat[4];
//DHT11起始信号
void DHT11_start()
{
Temp_data=1;
DHT11_delay_us(2);
Temp_data=0;
DHT11_delay_ms(20);
Temp_data=1;
DHT11_delay_us(13);
}
//接收一个字节
unsigned char DHT11_rec_byte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
while(!Temp_data);
DHT11_delay_us(8);
dat<<=1;
if(Temp_data==1)