描述
DHT11是通过单总线与微处理器通讯,只需要一根线,一次传送40位数据,高位先出;本次主要通过模拟单总线时序,实现温湿度读取。
数据格式
40bit数据:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和;
校
验
和
=
湿
度
整
数
+
湿
度
小
数
+
温
度
整
数
+
温
度
小
数
校验和 \ =湿度整数+湿度小数+温度整数+温度小数
校验和 =湿度整数+湿度小数+温度整数+温度小数
通讯过程
具体时序
实现代码
P0DIR |=0X01;//设置为输出口
DATA_PIN=0;//拉低
Delay_us(20000);//延时20ms
DATA_PIN=1;//拉高
P0DIR &=~0X01; //输入口
Delay_us(40);
while(DATA_PIN);//等待DHT响应信号
while(!DATA_PIN);//过渡80uS低信号
while(DATA_PIN);// 过渡80uS高信号
数据0时序
数据1时序
具体代码
#include <iocc2530.h>
#define DATA_PIN P0_0 //DHT11 接口`
u8 RH_data,RL_data,WH_data,WL_data,Checkdata;//温湿度高低,总和
/*
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bit温度整数数据+8bit温度小数数据
+8bit校验和
*/
u8 com()
{
u8 i=0;
u8 temp=0;
for(i=0;i<8;i++)//读取8bit数据
{
while(!DATA_PIN);//过渡50us低电平的开始型号
Delay_us(40);//数据表示为0时间26-28us,1时间70us 延时40us过渡低电平,判断
if(DATA_PIN)
{
temp=temp|0x01;
while(DATA_PIN);//过渡70-40的高电平时间
} else{
temp=temp | 0x00;
}
if(i<7)temp=temp<<1;//
}
return temp;
}
void DHT11()
{
P0DIR |=0X01;//设置为输出口
DATA_PIN=0;//拉低
Delay_us(20000);//延时20ms
DATA_PIN=1;//拉高
P0DIR &=~0X01; //输入口
Delay_us(40);//
while(DATA_PIN);//等待DHT响应信号
while(!DATA_PIN);//过渡80uS低信号
while(DATA_PIN);// 过渡80uS高信号
//开始传输数据
RH_data=com();//读取湿度整数
RL_data=com();//读取湿度小数
WH_data=com();//读取温度整数
WL_data=com();//读取温度小数
Checkdata=com();//读取校验和
//进行校验
if(WH_data+WL_data+RH_data+RL_data==Checkdata)
//校验对,就可以显示出数据了,不具体写,根据自己实际情况选择显示器模块。
}