DHT11 温湿度传感器数据读取代码详解

void DHT11_5() //读5个字节数据  两个字节为温度数据  两个字节为湿度数据 最后一个字节为校验
{
  unsigned char i,temp;
  //主机拉低18ms 
  TRH=0;
  Delay_t(180);
  TRH=1;
  //总线由上拉电阻拉高 主机延时20us
  delay_10us();
  delay_10us();
  delay_10us();
  delay_10us();
  //主机设为输入 判断从机响应信号 
  TRH=1;
  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
  if(!TRH)		 //T !	  
  {
    FLAG=2;	   //超时标志位
		  
    while((!TRH)&&FLAG++); //判断从机是否发出 80us 的低电平响应信号是否结束
	  FLAG=2;
    ET0=0;	
    while((TRH)&&FLAG++); //判断从机拉高80us是否结束
	  for(i=0;i<5;i++)//数据接收状态
	  {
		DHT11[i]=write_byte1();	
	  }		 
	  TRH=1;	//释放数据总线  为下一次读取做好准备 
	  
	  temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
	  if(temp==DHT11[4])	//数据校验 	
	  {
	    	  
		RTflag=1;		  
	  }
	  if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
	  {
		  			
		RTflag=0;
		
		  rh1=DHT11[0]/10;
		rh2=DHT11[0]%10;
		
		th1=DHT11[2]/10;
		th2=DHT11[2]%10;
	   ET0=1;
		  
	  }
		
  }

}
	 
	解释一下内容:这段代码是用来读取DHT11温湿度传感器的数据的。具体解释如下:

1. 首先定义了一个函数DHT11_5(),用来读取5个字节的数据。

2. 在函数内部先定义了一些变量,包括i(循环计数器)、temp(用来存放数据校验值)等。

3. 对DHT11进行初始化,将总线拉低18ms,然后再拉高,等待20us。

4. 将TRH引脚设为输入状态,判断DHT11是否有响应信号。如果没有,就将超时标志位FLAG设为2,并跳出函数。如果有响应信号,则继续执行下面的代码。

5. 判断DHT11是否发出了80us的低电平响应信号,如果没有,就一直等待,直到超时。如果响应信号结束了,则将FLAG设为2,并开始判断DHT11是否拉高了80us,也是一直等待,直到超时。

6. 如果DHT11响应和拉高的信号都正常,就开始读取数据。通过循环调用write_byte1()函数,将DHT11发送过来的数据读取到数组DHT11中。

7. 读取完数据后,释放数据总线,并对数据进行校验。将前四个字节的值相加,如果等于第五个字节的值,就说明数据读取正确。

8. 如果数据校验正确,就将RTflag设为1,表示读取到了正确的数据。

9. 最后将读取到的温度和湿度数据分别存储到th1、th2和rh1、rh2变量中,并将ET0设为1,表示允许定时器中断。

代码分析

代码的主要功能是读取DHT11温湿度传感器的数据,并进行校验。

步骤

  1. 初始化DHT11

    • 将总线拉低18ms,然后拉高20us,以启动DHT11。
  2. 读取DHT11响应信号

    • 将TRH引脚设为输入状态,等待DHT11响应信号。
    • 如果DHT11没有发出80us的低电平响应信号,则超时。
    • 如果DHT11发出了80us的低电平响应信号,则继续等待DHT11拉高80us。
  3. 读取数据

    • 如果DHT11的响应信号正常,则开始读取数据。
    • 使用write_byte1()函数读取5个字节的数据,并将数据存储到DHT11数组中。
  4. 校验数据

    • 将前四个字节的值相加,如果等于第五个字节的值,则数据校验正确。
  5. 处理数据

    • 如果数据校验正确,则将读取到的温度和湿度数据分别存储到th1、th2和rh1、rh2变量中。

总结

这段代码实现了DHT11温湿度传感器的读取和数据校验功能,可以用于单片机系统中获取温湿度数据。

DHT11 温湿度传感器数据读取代码详解

原文地址: https://www.cveoy.top/t/topic/nDeY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录