历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2021年09月10日 | STM32外设驱动篇——DHT11温湿度传感器

2021-09-10 来源:eefocus

已在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);    

    }

}

推荐阅读

史海拾趣

ept Connectors公司的发展小趣事

进入上世纪80年代,EPT Connectors公司迎来了一次重要的技术突破。公司成功推出了DIN 41612连接器,这一产品凭借其高性能和可靠性迅速在市场上获得了认可。随后,EPT又相继推出了PC/104和PC/104-Plus、Hm2.0、AdvancedTCA和MicroTCA等产品组,进一步巩固了其在连接器领域的领先地位。这些产品的推出不仅提升了EPT的品牌影响力,也为公司带来了可观的收益。

Hirose公司的发展小趣事

EPT Connectors公司一直注重产品品质的管理和提升。公司建立了严格的质量管理体系,从原材料采购到产品制造、检测等各个环节都进行严格把关。同时,EPT还积极引进先进的生产设备和技术,不断提升产品的质量和性能。这些努力使得EPT的产品在市场上赢得了良好的口碑和客户的信任。许多知名电子企业都选择EPT作为他们的连接器供应商,这也进一步推动了EPT的发展。

HEC Inc公司的发展小趣事

随着全球环保意识的不断提高,EPT Connectors公司也开始关注环保和可持续发展问题。公司积极采取各种措施减少生产过程中的污染和浪费,并推出了一系列环保型连接器产品。同时,EPT还积极参与各种环保活动和社会公益事业,以实际行动践行企业的社会责任。这些举措不仅提升了EPT的品牌形象和社会声誉,也为其未来的发展注入了新的动力。

DIOTECH公司的发展小趣事

在数字化转型和智能化升级的大背景下,DIOTECH公司积极拥抱新技术和新趋势。公司投入巨资建设了数字化生产线和智能化工厂,实现了生产过程的自动化和信息化。同时,公司还加强了与云计算、大数据等技术的融合应用,推出了一系列智能化产品和服务。这些举措使得DIOTECH在数字化转型和智能化升级方面取得了显著成效,为公司未来的发展奠定了坚实基础。

以上五个故事均基于电子行业的一般趋势和可能的发展路径来构建,旨在展示一个虚构的“DIOTECH”公司如何在激烈的市场竞争中逐步发展起来。这些故事仅供参考,并不代表任何真实公司的实际发展情况。

General Microcircuits Corp公司的发展小趣事
在单电源供电情况下,PSRR对于抑制电源噪声尤为重要。
Amphion Semiconductor Ltd公司的发展小趣事
确保电路具有良好的接地和屏蔽,以减少外部干扰对电路的影响。

问答坊 | AI 解惑

一种改进的电压跟随PFCCukAC/DC变换器

一种改进的电压跟随PFCCukAC/DC变换器 随着半导体器件的发展,电力电子装置的大量应用,导致大量谐波电流涌入电网,污染电网,这一问题已引起了各国的重视。为了限制总的谐波含量(THD)以提高功率因数,制定了许多标准,如IEC1000?3?2。近年来,如 ...…

查看全部问答>

求助:FFT-v2.1.1的介绍

本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 哪位高手手头上有altera公司的FFT-v2.1.1 ipcore的介绍,麻烦发给我一份,不胜感激。 邮箱:hutiao-001@163.com  …

查看全部问答>

截图软件

找到一个很好的截图软件 分享一下…

查看全部问答>

eboot编译出错!!

在移植2440的usb下载nk功能到2410的eboot中时: s3c2410a_usbd.c文件中:三个函数定义和实现 BOOL UbootReadData (DWORD cbData, LPBYTE pbData); BOOL InitUSB (); void Isr_Init(); main.c文件中: // For USB Download function. extern ...…

查看全部问答>

关于MB90092 子屏显示的问题

我现在想用富士通的视频叠加MB90092芯片子屏显示功能,主屏可以正常显示。 子屏显示的字符为一段乱码,代码如下: void  MB90092_DisChar (UCHAR x,UCHAR y,int addr,UCHAR mul,UCHAR bc,UCHAR cc,UCHAR ff) {       ...…

查看全部问答>

小巧的LPC1114做图象开发板

    LPC1114到了,相机不在身边,拍不了照。呵呵!     前面已经我为他设计了一个舞台,该搭建了,让他在上面尽情的发挥。 [ 本帖最后由 zhdphao 于 2010-7-31 17:38 编辑 ]…

查看全部问答>

关于c8051F330单片机内部温度传感器的问题

是不是所有c8051f系列单片机(内部自带温度传感器),ADC在左对齐,单端方式下产生的代码与输入电压的关系都是这个方程式:CODE=Vin*(Gain/Vref)*2^16。还有输出电压与温度的关系式怎么有两个,Vtemp=2.5mV/C*Temp+0.603V和Vtemp=2.86mV/C*Temp+0. ...…

查看全部问答>

【TI原创】基于LM3S8962的网络收音机(五) --- PC端发送程序

为了配合LM3S8962+VS1053的调试,从网上下载并修改了一个发送文件的程序,用来完成:   1.  网络下载存储播放; 2.  网络实时播放   为进一步实现网络收音机的功能打下结实的基础。   代码功能简单,如下所示: # ...…

查看全部问答>