通过串口实时显示温湿度值

 一、芯片介绍

DHT11数字温湿度传感器,是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。


       DHT11数字温湿度传感器,包括一个 电阻 式感湿元件和一个NTC测温元件,并与STM32单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

       每个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;
    }
}
}


你可能感兴趣的:(STM32微控制器)