芯源半导体CW32
直播中

jinglixixi

8年用户 1558经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【CW32饭盒派开发板试用体验】DHT11温湿度检测

在饭盒派的开发板上,配有温度传感器DHT11的接口,见图1所示。
image.png

图1 传感器接口

稍感不足的是,该接口与传感器DHT11功能模块的连接并不友好,会因为引脚排列的问题导致传感器模块无法直接进行插接使用,只好通过杜邦线来连接器件和接口,其连接与显示效果如图2所示。

image.png

图2 器件连接及显示效果

有接口电路可知,DHT11的 IO口所连接的引脚为PB1。

配置DHT11所用引脚的函数为:

uint8_t DHT11_GPIO_Config ( void )
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.IT= GPIO_IT_NONE; 
    GPIO_InitStruct.Mode= GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins= GPIO_PIN_1;
    GPIO_InitStruct.Speed= GPIO_SPEED_HIGH;
    GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
}

通过IO口对DHT11输出复位信号的函数为:

void  DHT11_Rst(void) 
{ 
   PB01_DIR_OUTPUT();    //PB12配置成输出
   PB01_SETLOW();            //拉低DQ          
   delay1ms(20);
   PB01_SETHIGH();       //DQ=1           
   delay10us(3);
}

等待DHT11回应的函数为:

uint8_t DHT11_Check(void) 
{           
       uint8_t retry=0;
       PB01_DIR_INPUT();                 //PB12配置成输入
       while(PB01_GETVALUE()&&retry<10)  //DHT11会拉低40~80us
       {
                   retry++;
                   delay10us(1);
       };
       if(retry>=10)return 1;
       else retry=0;
       while(!PB01_GETVALUE()&&retry<10)//DHT11拉低后会再次拉高40~80us
        {
                   retry++;
                   delay10us(1);
         };
         if(retry>=10)return 1;
         return 0;
}

从DHT11读取数据的函数为:

uint8_t DHT11_Read_Data(float *temp,uint8_t *humi) 
{
         char buf[5];
         uint8_t i;
         DHT11_Rst();
         if(DHT11_Check()==0)
         {
                   for(i=0;i<5;i++)//读取40位数据
                   {
                            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;
}

实现图2所示效果的主程序为:

int main()
{   
         RCC_Configuration();           //系统时钟64M
         GPIO_Configuration();           //LED初始化
         BTIM_init();                   //定时器初始化
         Lcd_Init();
         Lcd_Clear(GRAY0);             // 清屏
         Redraw_Mainmenu();
         while(DHT11_GPIO_Config());   //DHT11初始化
         while(1)
         {
                   if(counttime>200)            // 200毫秒采集一次数据并更新屏幕
                   {
                        counttime=0;                             
                        DHT11_Read_Data(&temperature,&humidity);          
// 读取温湿度
                        sprintf(buff_1,"%0.1f",temperature);
                        sprintf(buff_2,"%d",humidity);                                
                     Gui_DrawFont_GBK16(90,25,BLUE,GRAY0,buff_1);           // 更新显示                      
                     Gui_DrawFont_GBK16(90,47,BLUE,GRAY0,buff_2);
                   }
         }
}

这样在开发板上就轻松地实现了温湿度的检测及显示功能,其界面效果还是比较典型的。

更多回帖

发帖
×
20
完善资料,
赚取积分