DHT11.C 代码
#include "dht11.h"
void Dht11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStruct);
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
delay_ms(1000);
}
static void DHT11_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void DHT11_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Mcu_Send_Start_Sign(void)
{
DHT11_Mode_Out_PP();
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
delay_ms(18);
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
DHT11_Mode_IPU();
}
u8 Dht11_Ack(void)
{
u16 i = 0;
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1)
{
i++;
delay_us(1);
if(i>50)
{
return 1;
}
}
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1);
return 0;
}
u8 Read_Dht11_Data(void)
{
u8 i,data = 0;
for(i=0;i<8;i++)
{
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);
delay_us(40);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1)
{
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1);
data|=(uint8_t)(0x01<<(7-i));
}
else{
data&=(uint8_t)~(0x01<<(7-i));
}
}
return data;
}
u8 Mcu_Control_Dht11(u8 *p)
{
u8 ret;
Mcu_Send_Start_Sign();
ret = Dht11_Ack();
if(ret)
{
return 1;
}
p[0] = Read_Dht11_Data();
p[1] = Read_Dht11_Data();
p[2] = Read_Dht11_Data();
p[3] = Read_Dht11_Data();
p[4] = Read_Dht11_Data();
if(p[0]+p[1]+p[2]+p[3] != p[4])
{
return 1;
}
return 0;
}
DHT11.H代码
#ifndef _DHT11_H_
#define _DHT11_H_
#include "stm32f10x.h"
#include "delay.h"
static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
void Dht11_Init(void);
u8 Mcu_Control_Dht11(u8 *p);
#endif
开始信号的延时
void Mcu_Send_Start_Sign(void)
{
DHT11_Mode_Out_PP();
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
delay_ms(18);
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
DHT11_Mode_IPU();
}
可以看到,主机先要拉低最少18ms,再拉高。通过逻辑分析仪采集的信号可以看到。主机拉低了大约18ms.
后又拉高了29um 这里主机拉高后是由从机拉低的。
从机响应信号
响应1
大约82um
响应2
大约89.5um
读取数据信号,信号0与信号1.
因此
这里可以根据上面的数据间隔大约在50um左右,因此延时可以在25um到71um之间。
根据每个设备的不同,所产生的信号延时也会不一样,因此仅供参考。
|