一、芯片介绍
DHT11数字温湿度传感器,是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
每个DHT11传感器都在极为精确的湿度校验室中进行校准,校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数.单线制串行接口,使系统集成变得简易快捷、超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
二、接口说明
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
三、程序说明
由于DHT11是单总线芯片,所以采用单总线数据格式,一次通讯时间4ms左右,所以它与STM32单片机连接时,只需用到三根线,分别是VCC、GND以及DATA,DATA用于单片机与DHT11之间的通讯和同步。
编程步骤如下:
第一步:时钟设置
void RCC_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOA
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE); //GPIOF
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); //GPIOC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //USART1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //TIM3
}
第二步:端口设置
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Connect GPIOs to USART1 RX&TX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); //Tx
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); //Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //USART1_TX | USART1_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*Config GPIO_Pin_8|9 As LED*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType =GPIO_OType_PP ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/**********DHT11 Bus OutputConfig********/
void DHT11_OutputConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType =GPIO_OType_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
/**********DHT11 Bus InputConfig********/
void DHT11_InputConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
第三步:串口配置
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1,ENABLE);
}
第四步:DHT11时序。
/***************DHT11 Start**************/
uint8_t StartDHT11(void)
{
DHT11_OutputConfig();
DHT11_Low;
DelayMs(18);
DHT11_High;
Delay10Us(3);
DHT11_InputConfig();
if(DHT11_IN == 0)
{
while(DHT11_IN == 0);
while(DHT11_IN == 1);
return 1;
}
return 0;
}
/*****************Read a bit data*******************/
uint8_t DHT11_Read_Bit(void)
{
uint8_t i=0;
while(DHT11_IN == 0);
while(DHT11_IN == 1)
{
Delay10Us(1); //30us > 26-28us
i++;
}
if(i>3)
return 1;
else
return 0;
}
/*****************Read a byte data*******************/
uint8_t DHT11_Read_Byte(void)
{
uint8_t i,data;
data=0;
for(i=0;i<8;i++)
{
data<<=1; //left a bit
data|=DHT11_Read_Bit();
}
return data;
}
/************Read temperature and humidity***************/
uint8_t DHT11_Read_Data(void)
{
uint8_t i; // circle variable
if(StartDHT11()==1)
{
for(i=0;i<5;i++)
buf[i] = DHT11_Read_Byte();
if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4])
return 0;
}
else
return 1;
return 0;
}
最后一步当然是主函数的编写了,具体如下:
int main(void)
{
uint8_t time=0; // read time
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
TIM_Confguration();
DHT11_OutputConfig();
DHT11_InputConfig();
while(1)
{
if(time%30==0) // read data 1s per
{
printf("The Down shows temperature and humidity:\n");
buf[0]=buf[0]+0x30;
buf[2]=buf[2]+0x30;
if( !DHT11_Read_Data()) // read temperature and humidity
{
printf("the humidity is %dRH\n",buf[0]);
printf("the temperature is %dC\n",buf[2]);
}
}
DelayMs(200);
time++;
if(time==30)
{
time=0;
GPIOC->ODR ^= GPIO_Pin_8;
GPIOC->ODR ^= GPIO_Pin_9;
}
}
}