DHT11是一款集湿度和温度于一体的数字传感器。该传感器包括电阻式湿度测量元件和NTC
测温元件,并连接高性能8位微控制器。通过单片机等微处理器的简单电路连接,可以
实时采集当地的湿度和温度。DHT11可以通过简单的单总线与单片机通信,只需要一条
输入输出端口。传感器内部的40位湿度和温度数据一次性传输到单片机,并对数据进行校验
检查以有效确保数据传输的准确性。DHT11功耗很低,5V电源电压下平均工作最大
0.5毫安电流。
DHT11的技术参数如下:
工作电压范围:3.3V -5.5V
工作电流:平均0.5毫安
输出:单总线数字信号
测量范围:相对湿度20 ~ 90%,温度0~50℃
准确度:湿度5%,温度2℃
分辨率:湿度1%,温度1℃
DHT11有三条有效总线,VCC GND DAT,看起来和DS18B20差不多,但是简单多了,只需要读取数据包,不需要设置命令。
每次读取数据时,总共读取40位,即5个字节,高位在第一个MSB之前
五个字节为:8位湿度整数数据+8位湿度十进制数据+8位温度整数数据+8位温度十进制数据+8位校验和
读写时序如下
首先主机发出启动信号,即(初始状态仍然为高)下拉数据线t1(至少18ms),然后上拉数据线t2(20~40us),(此时需要切换输入/输出模式),然后读取DHT11的响应。正常情况下,DHT11会拉下t3的数据线(40~50us)
也就是说,每次需要复位检查响应,就可以开始读取数据了。数据的格式如下
由此可以看出,每个数据都是以12-14us的起始位开始的,无论是0还是1,都需要我们监控之后的高级时间长度。基本上可以认为高级时长在35us以上,基本上是1。
(注意不能等这个级别超过40us。)因为0的时间是40us,等待太久可能会扔掉下一个数据的起始位(这里可以用等待评论延时计数的方式来判断时间。当级别为0时,等待为1,每次计数1us,最后看高级时长)
驱动程序代码如下
# ifndef _ _ DHT 11 _ h # define _ _ DHT 11 _ h # include " iore map . h " # include " delay . h " # include " UART . h "//IO方向设置# define DHT 11 _ IO _ IN(){ GPIOG-> CRH & amp;= 0XFFFF0FFFGPIOG->;CRH " = 8 & lt;& lt12;} #定义DHT 11 _ IO _ OUT(){ GPIOG->;CRH & amp;= 0XFFFF0FFFGPIOG->;CRH | = 3 & lt;& lt12;} ////IO运算函数# defined ht11 _ dq _ output gout(11)//数据端口PG11 # defined ht11 _ dq _ InP gin(11)//数据端口PG11 u8 Dht 11 init(void);//初始化dht11u8 dht11读取数据(u8 * temp,u8 *米虎);//读取温湿度u8 DHT 11 read byte(void);//读取一个字节u8 DHT 11 read bit(void);//读出一位u8 Dht 11 check(void);//检查是否有DHT 11 void DHT 11 rst(void);//重置DHT 11 void Dht11 show(void);# endif # include " DHT 11 . h "//reset DHT 11 void DHT 11 rst(void){ DHT 11 _ io _ out();//设置输出DHT 11 _ DQ _输出= 0;//拉DQ德莱姆斯(20低(20);//下拉至少18ms DHT 11 _ DQ _ OUT = 1;//DQ = 1 DelayUs(30);//主机上拉20 ~ 40 us。//等待DHT11的响应。//返回1:未检测到DHT11。//Return 0:u8 Dht 11 check(void){ u8 retry = 0;DHT 11 _ IO _ IN();//设置输入时间(DHT11 _ DQ _输入& amp& amp重试<。100)//DHT11降低40 ~ 80us { retry++;delay us(1);};if(重试>;=100)返回1;否则重试= 0;while(!DHT11 _ DQ _ IN & amp;& amp重试<。100)//DHT 11下拉,再拉40 ~ 80us { retry++;delay us(1);};if(重试>;=100)返回1;返回0;}//从DHT 11//读取一位返回值:1/0 u8 dht11读取位(void){ u8 retry = 0;而(DHT11 _ DQ _ IN & amp;& amp重试<。100)//等待低级{ retry++;delay us(1);} retry = 0;while(!DHT11 _ DQ _ IN & amp;& amp重试<。100)//等待高级{ retry++;delay us(1);} Delayus(40);//等待40us if(DHT11_DQ_IN)返回1;否则返回0;}//从DHT 11//读取一个字节返回值:读取数据u8 Dht11ReadByte(void) {u8 i,dat;dat = 0;for(I = 0;i<。8;i++){ dat & lt;& lt=1;dat | = DHT 11 ReadBit();} return dat}//从DHT11//读取一次数据:温度值(范围:0 ~ 50)//米虎:湿度值(范围:20%~90%) //返回值:0,正常;1,读取u8 dht11读取数据失败(u8 * temp,u8 *米虎){ u8 buf[5];u8i;DHT 11 rst();if(Dht 11 check()= = 0){ for(I = 0;i<。5;I++)//读取40位数据{ buf[I]= DHT 11 read byte();} if((buf[0]+buf[1]+buf[2]+buf[3])= = buf[4]){ *米虎= buf[0];* temp = buf[2];} }else返回1;返回0;}//初始化DHT11的IO端口DQ,检测DHT 11//return 1:no//return 0:u8 DHT 11 init(void){ RCC->;APB2ENR|=1<。& lt8;//启用PORTG时钟gpio->:CRH & amp;= 0XFFFF0FFF//PORTG.11推挽输出gpio g->:CRH | = 0x 00003000;GPIOG->;ODR | = 1 & lt;& lt11;//输出1 Dht 11 rst();return Dht11 check();} void Dht11Show(void) { u8 temp,米虎;if(DHT 11 read data(& amp;温度和amp。米虎){ printf("DHT11读取失败 r n ");} else {printf("温度%d湿度%d rn ",temp,米虎);} }
原始链接:
1.《dht11 STM32驱动DHT11温湿度传感器》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《dht11 STM32驱动DHT11温湿度传感器》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1572019.html