2021-08-29
Posted xiaoyi_zl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-08-29相关的知识,希望对你有一定的参考价值。
1-Wire协议之DHT11温湿度传感器
1.DHT11传感器介绍
1.1 DHT11简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点
1.2 DHT11工作原理
DHT11采用单总线通信。即只有一根数据线来传输数据。单总线通常需要外接一个上拉电阻,这样在总线空闲的时候,状态为高电平。
1.3 DHT11工作时序
1.3.1 数据总时序
主机发送开始信号,主机拉高数据线,等待从机响应主机,然后传输8bit数据。
1.3.2.控制信号以及响应信号时序
主机拉低数据线至少18ms,然后拉高20-40us,然后切换至输入模式,读取DHT11的响应信号。DHT11先拉低数据线80us,然后再拉高80us后,开始传输数据。
在每一bit到来时,都会先有50us的低电平信号,然后才开始传输“0”.“1”数据。
1.3.3 数字“0”表示
高电平持续时间为26us-28us即为数字“0”。
1.3.4 数字“1”表示
高电平持续时间为70us即为数字“1”。
2.DHT11代码实现
2.1 主机发送开始信号
void DHT11_Command()
{
//输出模式
DHT11_OUT();
//主机拉低至少18ms
DHT11_L();
HAL_Delay(20);
//主机拉高20-40us
DHT11_H();
delay_us(30);
}
2.2 主机等待DHT11响应
uint8_t DHT11_Check()//检查DHT11响应信号
{
uint8_t retry=0;
//输入模式
DHT11_IN();
//高电平时期
//等待低电平的到来 如果是高电平,就一直循环,直到低电平退出
while (DHT11_read()&&retry<100)
{
retry++;
delay_us(1);
}
if(retry>=100)
return 1;
else
retry=0;
//低电平时期
//下面是等待高电平到来,低电平时间50us,并且加入了超时判断,防止死循环
while (!DHT11_read()&&retry<100)
{
retry++;
delay_us(1);
}
//
if(retry>=100)
return 1;
//响应正确返回0 并且现在处于高电平时期
return 0;
}
2.3 DHT11数据 bit“0”,“1”读取
uint8_t DHT11_Read_Bit()
{
uint8_t retry=0;
//高电平 等待低电平到来 开始传输数据
while(DHT11_read()&&retry<100)
{
retry++;
delay_us(1);
}
retry=0;
//低电平时期 等待高电平到来
while(!DHT11_read()&&retry<100)
{
retry++;
delay_us(1);
}
//高电平时期 因为“0”持续26us-28us 所以延时 40us读取电平 判断“0”,“1”
delay_us(40);
if(DHT11_read())
return 1;
else
return 0;
}
2.4 DHT11传输一个字节数据
uint8_t DHT11_Read_Byte()
{
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
2.5 DHT11传输温湿度数据
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT11_Command();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
}
//数据校验
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}
else
return 1;
return 0;
}
3.DHT11注意事项
传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。
以上是关于2021-08-29的主要内容,如果未能解决你的问题,请参考以下文章
2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务。 福大大 答(