STM32外设驱动篇——DHT11温湿度传感器

发布者:电子思维最新更新时间:2021-11-04 来源: eefocus关键字:STM32  外设驱动  DHT11  温湿度传感器 手机看文章 扫描二维码
随时随地手机看文章

已在STM32上进行过测试。本例使用PC0引脚连接DHT11的data引脚。


main函数中调用下面代码中的DTH11_test函数即可。


//数据定义:

    //----以下变量均为全局变量--------

    //----温度高8位== U8T_data_H------

    //----温度低8位== U8T_data_L------

    //----湿度高8位== U8RH_data_H-----

    //----湿度低8位== U8RH_data_L-----

    //----校验 8位 == U8checkdata-----

u8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

u8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

 

#define BOOL unsigned char

 

#ifndef TRUE

#define TRUE 1

#endif

 

#ifndef FALSE

#define FALSE 0

#endif

 

static void DHT11_DataPin_Configure_Output(void)

{

     GPIO_InitTypeDef  GPIO_InitStructure;

    

    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);     //使能PC端口时钟

                

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                 //PC.0 端口配置

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

static void DHT11_DataPin_Configure_Input(void)

{

       GPIO_InitTypeDef  DataPin;     

    

     DataPin.GPIO_Pin = GPIO_Pin_0;                

     DataPin.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //悬空     

     DataPin.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &DataPin);

}

BOOL DHT11_get_databit(void)

{

    uint8_t val;

    

     val = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0);

    if(val == Bit_RESET){

        return FALSE;

    }else{

        return TRUE;

    }

}

 

void DHT11_set_databit(BOOL level)

{

    if(level == TRUE){

        GPIO_SetBits(GPIOC, GPIO_Pin_0);

    }else{

        GPIO_ResetBits(GPIOC, GPIO_Pin_0);

    }

}

 

void mdelay(u16 ms)  

{

    if(ms != 0){

        delay_ms(ms);

    }

}

 

void udelay(u16 us)  

{

    if(us != 0){

        delay_us(us);

    }

}

static uint8_t DHT11_read_byte(void)

{     

    uint8_t i;  

    uint8_t data = 0;    

                       

    for(i = 0; i < 8; i++)       

    {    

        data <<= 1;        

           while((!DHT11_get_databit()));

        udelay(10);

        udelay(10);

        udelay(10);

 

        if(DHT11_get_databit())    {

            data |= 0x1;

            while(DHT11_get_databit());

        } else{

        

        } 

 

     }

                         

     return data;

}

  

static uint8_t DHT11_start_sampling(void)

{

    DHT11_DataPin_Configure_Output();

      //主机拉低18ms   

    DHT11_set_databit(FALSE);

    mdelay(18);

    DHT11_set_databit(TRUE);

     //总线上拉电阻拉高 主机延时20us

    udelay(10);

    udelay(10);

//    udelay(10);

//    udelay(10);

     //主机设为输入 判断从机响应信号 

    DHT11_set_databit(TRUE);

 

    DHT11_DataPin_Configure_Input();

 

     //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      

    if(!DHT11_get_databit())         //T !      

    {

     //判断从机是否发出 80us 的低电平响应信号是否结束     

       while((!DHT11_get_databit()));

      // printf("DHT11 answers.rn");

     //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

       while((DHT11_get_databit()));

       return 1;

    }

 

    return 0;               

}

 

void DHT11_get_data(void)

{      

    u8 temp;

    if(DHT11_start_sampling()){

        //printf("DHT11 is ready to transmit datarn");

        //数据接收状态         

        U8RH_data_H_temp = DHT11_read_byte();

        U8RH_data_L_temp = DHT11_read_byte();

        U8T_data_H_temp     = DHT11_read_byte();

        U8T_data_L_temp     = DHT11_read_byte();

        U8checkdata_temp = DHT11_read_byte();

 

        /* Data transmission finishes, pull the bus high */

        DHT11_DataPin_Configure_Output();   

        DHT11_set_databit(TRUE);

        //数据校验 

 

        temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

        if(temp==U8checkdata_temp)

        {

            U8RH_data_H=U8RH_data_H_temp;

            U8RH_data_L=U8RH_data_L_temp;

            U8T_data_H=U8T_data_H_temp;

            U8T_data_L=U8T_data_L_temp;

            U8checkdata=U8checkdata_temp;

 

            printf("DHT11 tempature %d.%d  humidity %d.%d rn", 

                U8T_data_H,

                U8T_data_L,

                U8RH_data_H,

                U8T_data_L);

 

       }else{

            printf("checksum failure rn");

       } 

    }else{

        printf("DHT11 didn't answer. Sampling failed. rn");

    }

}

 

void DTH11_test()

{

    while(1)

    {

        DHT11_get_data();

        delay_ms(1000);    

    }

}

关键字:STM32  外设驱动  DHT11  温湿度传感器 引用地址:STM32外设驱动篇——DHT11温湿度传感器

上一篇:DHT11温湿度传感器stm32测试程序
下一篇:基于STM32单片机采集数据&数据上云

推荐帖子

怎样在wince5或模拟器上安装msxml3.dll
如题,我现在用的是模拟器,使用了xml解析器(msxml3)单步发现调用函数CoCreateInstance失败,提示没有注册类别,我判断是没有安装msxml3造成的,从msdn上下载了msxml3.msi,但无法安装,请问该怎样安装呢,需要手动改注册表吗(我的是wince5.0,模拟器是pocketpc2003seEmulator-vs2005自带的)怎样在wince5或模拟器上安装msxml3.dll顶肯定有知道的,再顶5.0不支持xml吗?那就自己写一个吧,网上例子不少不
whl0808 WindowsCE
嵌入式字库
现在要在一嵌入式(数码像框)里加入字库,怎么加?要不要什么字库标准的,字库的方式?嵌入式字库
糖醋鲤鱼 嵌入式系统
哪位大神有mini_pci_e的封装呢?
准备用板子做毕业设计,但是一看没有接口,只好得自己开一个板了--金手指谁有可以给我一个吗?不然画这个封装还是很麻烦的,测间距,开窗哪位大神有mini_pci_e的封装呢?我这边没有唉。不行的话你找找看这种封装的尺寸要求,然后画一个吧。PCB还是要多练多画的。这个试试看行不行。 谢谢你 谢谢大佬谢谢大哥正需要~ 论坛及时雨
小强电子爱好者 stm32/stm8
【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A 蓝牙BLE通信
本篇文章使用Bleak库驱动开发板蓝牙BLE,实现开发板BLE主机和蓝牙板BLE从机的双向通信。一.硬件部分确认蓝牙主从机型号,确认是否可以实现BLE通信。1.蓝牙主机通过查找规格书,得知开发板使用的是搭载瑞昱RTL8723DS的BT4.2蓝牙模组。经过Linux桌面简单的连接测试,确定其是支持BLE协议的。2.蓝牙从机使用一款单模BLE5.0蓝牙模组,支持主从一体。同时我为项目设计一块蓝牙报警板,蓝牙模块与STM32单片机通过U
六尘不改 玄铁RISC-V活动专区
TCP SERVER如何建立两个连接?
请教各位一个问题:我在开发一个项目,基于STM32F107平台,加载FREERTOS及LWIP协议栈,目前实现了TCPSERVER功能,代码如下:voidTCPServer(void*arg){intoptval=1;u32_tlen;structsockaddr_inServer_Local_addr,Client_Remote_addr;fd_setfdsr;structtimevaltv;uint8_ti;tv.tv_sec
Qiuhf stm32/stm8
还是关于wince下2440的COM2.COM3驱动的问题
我在网上查找了很多关于这个问题的解答,但是,都不理想。厂家的人员说:目前国内还没有解决2440多串口驱动的问题,请问,有哪位高手比较理想地解决了这个问题,能不能详细介绍一下或给发个例子吧,都快急死人了。还是关于wince下2440的COM2.COM3驱动的问题唉,哀应该和2410差不多吧分太少了
bailicai WindowsCE
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved