u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 12-14us 开始 { retry++; delay_us(1); }
时间: 2024-03-30 20:34:04 浏览: 118
这个函数用来读取DHT11传感器的一个数据位。在正常情况下,DHT11会在数据传输过程中将每个数据位(共40位)分别以50us的高电平和26-28us的低电平表示。这个函数会等待DQ引脚变为低电平,即等待12-14us的时间(因为在这段时间内,DHT11会发送低电平信号表示0)。如果在等待时间内成功读取到低电平信号,函数会等待26-28us的时间,然后再次读取DQ引脚的状态,如果DQ引脚仍为低电平,说明数据位为0,函数返回0;如果DQ引脚已经变为高电平,说明数据位为1,函数返回1。如果在等待或读取的过程中出现异常,函数会返回1。
相关问题
u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//µÈ´ý±äΪµÍµçƽ { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//µÈ´ý±ä¸ßµçƽ { retry++; delay_us(1); } delay_us(40);//µÈ´ý40us if(DHT11_DQ_IN)return 1; else return 0; }
这段代码是DHT11读取单个位的函数。它通过使用单总线通信协议来读取DHT11传感器的数据。下面是代码的解释:
```c
u8 DHT11_Read_Bit(void)
{
u8 retry = 0;
while (DHT11_DQ_IN && retry < 100) // 等待DHT11拉低数据线,最多等待100us
{
retry++;
delay_us(1);
}
retry = 0;
while (!DHT11_DQ_IN && retry < 100) // 等待DHT11拉高数据线,最多等待100us
{
retry++;
delay_us(1);
}
delay_us(40); // 等待40us,DHT11数据开始传输
if (DHT11_DQ_IN) // 如果数据线为高电平,表示传输的数据为1
return 1;
else // 如果数据线为低电平,表示传输的数据为0
return 0;
}
```
该函数的返回值为读取到的数据,为0或1。其中,`DHT11_DQ_IN`是DHT11数据线的输入引脚,`delay_us()`为延时函数。注意,该函数只能读取单个位,要读取完整的温湿度数据需要调用其他函数。
解释以下代码void DHT11_Rst(void) { DHT11_IO_OUT(); DHT11_DQ_OUT=0; delay_ms(20); DHT11_DQ_OUT=1; delay_us(30); } u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN(); while (DHT11_DQ_IN&&retry<100) { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100) { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100) { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100) { retry++; delay_us(1); } delay_us(40); if(DHT11_DQ_IN)return 1; else return 0; } u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); 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; } u8 DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_4); DHT11_Rst(); return DHT11_Check(); }
这段代码实现了 DHT11 温湿度传感器的读取和初始化。其中包括以下几个函数:
1. DHT11_R():复位 DHT11 传感器,通过将 DHT11 的数据线拉低 20ms,再拉高 30us 来实现。
2. DHT11_Check():检查 DHT11 的响应信号,通过将数据线设置为输入模式,等待 DHT11 的响应信号,并计数,如果超过 100 次仍未收到响应信号,则返回错误。
3. DHT11_Read_Bit():读取一个 bit 的数据,通过等待 DHT11 发送数据,并计时,根据时间判断该 bit 的数值。
4. DHT11_Read_Byte():读取一个字节的数据,通过调用 DHT11_Read_Bit() 函数 8 次,将 8 个 bit 组成一个字节的数据。
5. DHT11_Read_Data():读取 DHT11 的温湿度数据,通过调用 DHT11_Rst()、DHT11_Check() 和 DHT11_Read_Byte() 函数,读取 DHT11 的 5 个字节的数据,并计算校验和,如果校验和正确,则将温度和湿度数据存储到指定的变量中。
6. DHT11_Init():初始化 DHT11 传感器,通过设置 GPIO 的输出模式和拉高数据线,调用 DHT11_Rst() 和 DHT11_Check() 函数进行初始化,如果初始化成功,则返回 0。
该代码实现了对 DHT11 温湿度传感器的驱动和数据读取,可以通过调用 DHT11_Init() 和 DHT11_Read_Data() 函数来实现对 DHT11 的温湿度数据读取。
阅读全文