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  温湿度传感器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic547566.html

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

推荐阅读

Arduino_Core_STM32---pinMode()实现分析
pinMode()定义Arduino平台的易于使用性主要就体现在屏蔽的大量底层细节的实现,对于该函数来说也不例外。虽然该函数只有两个参数(arduino引脚号和模式),但这两个参数需要多层的映射才能转化为具体适合STM32芯片的配置信息,并调用底层接口完成配置。从下面源码中可以看出主要由两个函数来完成引脚模式配置的:digitalPinToPinName()和pinfunction()。在具体深入下面两个函数之前我们需要一些预备知识—该库对于STM32硬件端口和引脚的封装。void pinMode(uint32_t ulPin, uint32_t ulMode){ PinName p = digitalPinToPinName(ul
发表于 2022-08-11
vscode搭建STM32开发环
需要安装的软件vscode必装插件:C/C++:用于提供高亮显示和代码补全Cortex-Debug:用于提供调试配置makemake工具可以直接下载xPack项目提供的windows-build-tools工具里面带了make工具。Release xPack Windows Build Tools v4.2.1-2 · xpack-dev-tools/windows-build-tools-xpack (github.com)openocdarm-none-eabistm32CubeMX上述软件具体的安装教程网上有很多详细的介绍资料,这里就不详细介绍了。需要注意的是记得将make,openocd,arm-none-eabi等可执行程
发表于 2022-08-11
STM32_USB_CDC学习笔记
USB虚拟串口的接收方式:USB 虚拟串口的接收采用中断方式,芯片在接收到数据后回触发中断调用CDC_Receive_FS()函数来处理接收到的数据.USB虚拟串口一次最多接收64个字节的数据,如果收到的数据大于64个字节则会连续多次调用CDC_Receive_FS()函数来处理接收到的数据.问题:每次下载完成程序后,必须重新插拔USB线,PC才能识别到串口设备?解决方法:在每次USB初始化之前,配置USB的两个引脚拉低几个ms,即可让PC重新枚举该USB设备.函数功能USB发送USBD_CDC_SetTxBuffer()和USBD_CDC_TransmitPacket()函数是启动数据发送过程的一组函数,要成对使用.USBD_CD
发表于 2022-08-11
关于STM32定时器中TI1FP1 与TI1FP2及相关话题
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1与TI1FP2,TI2FP1与TI2FP2,TI3FP3与TI3FP4,TI4FP3与TI4FP4,即每个输入通道可以生产1对信号。这里以STM32F103系列为例聊聊T这个TImFPn,。在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来。这四对信号可以统一写为:TImFPn,其中m代表滤波和边沿检测器前的输入通道号,n代表经过滤波和边沿检测器后将要接入或
发表于 2022-08-11
关于<font color='red'>STM32</font>定时器中TI1FP1 与TI1FP2及相关话题
STM32编码器模式详解(一)---理论
一、编码器接口模式选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1
发表于 2022-08-11
<font color='red'>STM32</font>编码器模式详解(一)---理论
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。一、基本工作原理(1)给TRIG引脚至少10us的高电平信号触发测距。(2)模块自动发送8个40KHz的方波,自动检测是否有信号返回(3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。(4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。二、接线三、模块时序图四、驱动程序在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需要接收并记录高电平的持续时间,大致有3种实现的思路
发表于 2022-08-11
<font color='red'>STM32</font><font color='red'>驱动</font>超声波模块测距

推荐帖子

stm32f103调试can时碰到诡异的问题,寻求帮助
在调试汽车can的时候碰到2个奇怪的问题, 问题1,主要我的控制器接入汽车can网络,并且stm32f103设置为normal模式,那么会导致整个车载can网络瘫痪,导致任何操作功能,比如玻璃窗全部升降失效 我把stm32f103的can模式调整为CAN_Mode_Silent就可以正常通讯 问题2,接收车载can数据的时候,大部分id的数据都可以正常接收,比如id为0x381车门控制信息可以正常接收,但是id为0x391的信息却只有1%的接受率,用淘宝买的usb-can的话,可以正常
smiletigerpp stm32/stm8
中国芯期待新突破
中国芯遭遇尴尬,期待新突破2006-6-22  曾几何时,中国IC设计公司似乎取得“‘中国芯’群聚性突破”。但是,随着汉芯造假以及目前方舟接受检查,“中国芯”陷入尴尬境界。业内人士指出,中国要务实推进“中国芯”,切忌科技“大跃进”。  “中国芯”不能“大跃进”  2003年开始,中国半导体产业似乎跨越式地进入了国产CPU“群聚性突破”的年代,连续地出现了龙芯、方舟、众志、汉芯等核心处理器,一度曾有“七芯耀中华”之称。然而时至今日,中国CPU产业造假、接受检查等事件给产业界带来巨大阴影,
ehk PCB设计
问一下,最新的电机控制DSP芯片型号是什么
本人是个学生,刚接触DSP,准确的说是今天才开始学这个的,我们老师留题目问最新的DSP型号是啥,我在百度搜了半天,搜出了很多,可不知道哪个是最新的,麻烦哪位高人告诉下,还有,它的内部结构是什么?问一下,最新的电机控制DSP芯片型号是什么
haosiyuan DSP 与 ARM 处理器
急!!LCD显示屏总是白屏!!?
用HT1621B来驱动LCD显示屏,一旦设备有输出高电压时,就会造成HT1621B供应电压不稳定,使HT1621B卡死,想用软件复位的方法,让HT1621B重启,但是效果达不到,还会看到有闪动,这该如何是好!!??? 急!!LCD显示屏总是白屏!!?
片翼_天使 单片机
PN结耗尽区研究
结两边过剩的少数载流子有2个效应。第一个,载流子建立了一个电场。N型硅中过剩的空穴使它带正电,P型硅中过剩的电子则使它带负电。这样就沿着PN结建立了一个N区高电位,P区低电位的电场。当载流子沿着结扩散时,同时产生了同等数量的离子化的杂质原子。这些原子都固定在晶体结构中,不能移动。在结的P区都是离子化后带负电的acceptors。在结的N区都是离子化后带正电的donors。这样就又建立了一个N区高电位,P区低电位的电场。这个电场会和由载流子建立的电场叠加起来。载流子在电场里有漂移的
fighting 模拟电子
迪文串口屏详细资料下载
本帖最后由chenzhufly于2014-12-1514:10编辑 http://pan.baidu.com/s/1jGDnYGu 百度云上的,挺全,可以看看迪文串口屏详细资料下载
chenzhufly 单片机
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved