DHT11 温湿度传感器数据读取代码详解
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温湿度传感器的数据,并进行校验。
步骤
-
初始化DHT11
- 将总线拉低18ms,然后拉高20us,以启动DHT11。
-
读取DHT11响应信号
- 将TRH引脚设为输入状态,等待DHT11响应信号。
- 如果DHT11没有发出80us的低电平响应信号,则超时。
- 如果DHT11发出了80us的低电平响应信号,则继续等待DHT11拉高80us。
-
读取数据
- 如果DHT11的响应信号正常,则开始读取数据。
- 使用write_byte1()函数读取5个字节的数据,并将数据存储到DHT11数组中。
-
校验数据
- 将前四个字节的值相加,如果等于第五个字节的值,则数据校验正确。
-
处理数据
- 如果数据校验正确,则将读取到的温度和湿度数据分别存储到th1、th2和rh1、rh2变量中。
总结
这段代码实现了DHT11温湿度传感器的读取和数据校验功能,可以用于单片机系统中获取温湿度数据。
原文地址: https://www.cveoy.top/t/topic/nDeY 著作权归作者所有。请勿转载和采集!