- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DHT11编程全解读
DHT11 编程全解读
一、DHT11 数据格式(40bit)
数据格式: 8bit 湿度整数数据+8bit 湿度小数数据
+8bi 温度整数数据+8bit 温度小数数据
+8bit 校验和
说明:1)、其中温度湿度小数部分带扩展,目前读出数据为0;2 )、校验和数据等于“8bit
湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据”所得结果的末8 位。
二、时序编程
微处理器与DHT11 之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms 左右。
DHT11 的单总线编程相对于DS18B20 的单总线编程简单很多,本文分析的DHT11 编程所
需要的条件是一个精度在+_5% 的50us 延时函数。
1、起始信号部分编程
1)、起始部分时序图如下
2 )、时序说明:①、控制器首先至少拉低18ms,然后拉高20-40us 后等待DHT11 的应答
②、当DHT11 检测到信号后,首先将总线拉低约80us 然后在拉高80us 作
为应答信号。
3 )、程序代码:
DHT11_DATA=0; //拉低至少18ms
Hal_WaitUs (28000);
DHT11_DATA=1; //拉高20us-40us
Hal_WaitUs (50);
if (!DHT11_DATA) //判断从机是否低电平应答
{
while (!DHT11_DATA);
while (DHT11_DATA);
a=Read_Byte ();
b=Read_Byte ();
c=Read_Byte ();
d=Read_Byte ();
}
4 )、代码说明:
首先主机拉低总线,这里拉低了28ms ,然后拉高总线50us,由时序图可以知道若拉高
50us 后有从机应答,那么当主机释放总先后应该被 DHT11 拉低,if 判断语句判断是否有
DHT11 应答,若有应答向下执行读取数据。
2 、数据读取部分编程
1)、数据读取部分时序图如下
DHT11 通信时序
DHT11 0 信号时序图
DHT11 1 信号时序图
2 )、时序说明:①、DHT11 以低电平应答主机,然后拉高总线准备输出。输出0 信号和 1
信号都是以低电平开始高电平结束。
②、DHT11 输出0、1 信号的低电平时间相同,而高电平的时间不同,输出
0 信号时高电平约26-28us,而当输出1 信号时高电平约为70us 。
3 )、程序代码(读取8bit):
uchar Read_Byte (void)
{
uchar i,in_data,k;
for(i=0;i8;i++) //读取8bit
{
while (!DHT11_DATA);// “渡过”数据起始位低电平
//延时50ms 后检测电平
Hal_WaitUs (50);
k=DHT11_DATA; //读数据
if (k==1) //读到的数据是1
{
in_data=in_data|0x01;
while (DHT11_DATA);
}
else
{
in_data=in_data|0x00;
}
in_data=in_data1; //循环左移1 位
}
return in_data;
}
4 )、代码说明:
首先主机拉低总线,这里拉低了28ms ,然后拉高总线50us,由时序图可以知道若拉高
50us 后有从机应答,那么当主机释放总先后应该被DHT11 拉低,if 判断语句判断是否有
DHT11 应答,若有应答向下执行读取数据。其中下面两句代码w
文档评论(0)