DHT11温湿度传感器stm32测试程序

发布者:科技狂人最新更新时间:2021-10-18 来源: eefocus关键字:DHT11  温湿度传感器  stm32  测试程序 手机看文章 扫描二维码
随时随地手机看文章

//dht11.h

#ifndef __DHT_H__

#define __DHT_H__

#include "stm32f10x.h"

#include "systick.h"

#include "led.h"

#include "stdio.h"

#include "Usart1.h"



#define DHT11_GPIO_TYPE  GPIOA

#define DHT11_GPIO_PIN   GPIO_Pin_8

#define DHT11_RCC        RCC_APB2Periph_GPIOA




#define DHT11_OUT_H GPIO_SetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)

#define DHT11_OUT_L GPIO_ResetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)

#define DHT11_IN    GPIO_ReadInputDataBit(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)


void dht11_gpio_input(void);

void dht11_gpio_output(void);

u16 dht11_scan(void);

u16 dht11_read_bit(void);

u16 dht11_read_byte(void);

u16 dht11_read_data(u8 buffer[4]);


#endif


//dht11.c

#include "dht.h"

 

void dht11_gpio_input(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    

    RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);

    

    GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

    

    GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);

}

 

void dht11_gpio_output(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    

    RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);

    

    GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

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

 

    GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);

}

 

void dht11_reset(void)

{

    dht11_gpio_output();//配置IO口输出模式

    DHT11_OUT_L;//拉低IO口

    Delay_us(19000);//延时18ms-30ms之间

    DHT11_OUT_H;//拉高IO口

    Delay_us(30);//延时30us,等待接收

    dht11_gpio_input();//配置为输入模式

}

 

u16 dht11_scan(void)

{

    return DHT11_IN;

}

 

u16 dht11_read_bit(void)

{

    while (DHT11_IN == RESET);//等待低电平结束

    Delay_us(40);//延时40us,如果是信号0,高电平信号在26-28us之间,如果是信号1,高电平信号在70us

    if (DHT11_IN == SET)//如果还是高电平就是信号1

    {

        while (DHT11_IN == SET);//等待此信号结束

        return 1;

    }

    else

    {

        return 0;

    }

}

 

u16 dht11_read_byte(void)

{

    u16 i;

    u16 data = 0;

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

    {

        data <<= 1;

        data |= dht11_read_bit();

    }

    return data;

}

 

u16 dht11_read_data(u8 buffer[5])

{

    u16 i = 0;

    u8 checksum;

    dht11_reset();//发送起始信号

    if (dht11_scan() == RESET)

    {

        //等待响应信号结束

        while (dht11_scan() == RESET);

        while (dht11_scan() == SET);

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

        {

            buffer[i] = dht11_read_byte();

        }

        

        while (dht11_scan() == RESET);//接收结束,拉高片选

        dht11_gpio_output();

        DHT11_OUT_H;


         checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校验数据

        if (checksum != buffer[4])

        {

            // checksum error

            return 1;

        }

    }

    

    return 0;

}


//main.c测试

if(dht11_read_data(buf)==0){

            hum = buf[0] + buf[1] / 10.0;

            temp = buf[2] + buf[3] / 10.0;

}

printf("湿度 == %.2f%%RHrn",hum);

printf("温度 == %.2f℃rn",temp);

Delay_ms(2000);

关键字:DHT11  温湿度传感器  stm32  测试程序 引用地址:DHT11温湿度传感器stm32测试程序

上一篇:STM32入门篇之DHT11温湿度传感器
下一篇:STM32外设驱动篇——DHT11温湿度传感器

推荐阅读最新更新时间:2024-11-09 11:09

STM32进行程序下载的方式介绍
串口下载 串口下载是通过串口连接开发板和PC,将程序下载到开发板的一种方式。这种方式的原理是通过串口通信,将程序数据按照一定的协议传输到开发板中进行存储。 串口下载的连接方式是通过开发板上的串口接口连接到 PC 上的串口口,需要注意的是串口接口的波特率要与程序下载工具设置的波特率保持一致。 SWD下载 SWD 下载是通过 SWD 接口连接开发板和调试器,将程序下载到开发板的一种方式。SWD 接口是 STM32 特有的一种调试接口,它可以通过两根线(SWDIO 和 SWCLK)完成下载和调试。SWD 接口通过 JTAG/SWD 仿真器或者开发板自带的调试器来实现。 SWD 下载的连接方式是将仿真器或调试器的 SWDIO、SWCL
[单片机]
<font color='red'>STM32</font>进行程序下载的方式介绍
STM32硬件错误的调试技巧
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。 这说明STM32出现了硬件错误。 硬件错误中断 STM32出现硬件错误可能有以下原因: 数组越界操作; 内存溢出,访问越界; 堆栈溢出,程序跑飞; 中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。 示例 1.2 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。 如果R
[单片机]
<font color='red'>STM32</font>硬件错误的调试技巧
IAR环境下ucosii在STM32上的移植
Ucosii移植到STM32上 1.使用的开发环境是IAR 5.4 STM32芯片为STM32F103ZET6 使用ST官方提供的标准固件库,建立工程, 我下载的苦艰苦的版本为STM32F10x_StdPeriph_Lib_V3.5.0,里面的文件分布为: 其中,Libraries文件夹里面放的是标准库文件,Project文件夹里面放的是STM32的各个外设的使用范例和一个工程模板,Utilities文件夹里面放的是ST公司的评估板例子,剩下的文件就是教我们怎样使用标准库,而我们主要使用的就是Libraries和Project里面的文件。 1.1首先新建stm32这个文件夹,在里面再新建3个文件夹include,proj
[单片机]
STM32 I2C总线通信与SPI总线通信专题讲解
总线介绍: I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线(单双工),用于连接微控制器及其外围设备,在这两根线上可以挂很多设备,同一时刻只能有一个节点处于主机模式,其他节点处于从机模式,总线上数据的传送都由主机发起。I2C总线没有片选信号线,所以需要通过协议来找到对应操作的芯片。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。 总线特征: 1.两条总线线路:一条串行数据SDA,一条串行时钟线SCL(主从设备使用同一时钟,属于同步通信)来完成数据的传输及外围器件的
[单片机]
<font color='red'>STM32</font> I2C总线通信与SPI总线通信专题讲解
在Keil环境编程中发现STM32内存管理存在的问题
非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。 图1 代码1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable c was set but never used linkin
[单片机]
在Keil环境编程中发现<font color='red'>STM32</font>内存管理存在的问题
如何理解STM32系统时钟和分频
  首先来手册里的一段话。   三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)   · HSI振荡器时钟   · HSE振荡器时钟   · PLL时钟   一般用的是PLL时钟,后面有证据。   我们可以通过库函数获取各时钟值   void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)   在我的系统里,把时钟值打印信息如下:   SYSCLK:0x44aa200 //72000000, 72MHz   HCLK:0x44aa200 //72000000, 72MHz   PCLK1:0x2255100 //36000000, 36MHz   PCLK2:0x44aa20
[单片机]
如何理解<font color='red'>STM32</font>系统时钟和分频
关于STM32网络电路设计方案
如果有同学对SMI,MII和RMII接口不熟悉,建议看一下上面提到的两篇文章,不然可能看不太懂下文。 区域1:我们称为SMI接口,用于配置外部PHY芯片。 区域2:是数据交换接口,也就是上面我们说的MII接口和RMII接口。 利用这些接口可以有多种不同的网络电路设计方案,这里我来总结下。 01MII接口方案 MII接口在文章《STM32网络之MII和RMII》已经详细介绍过了,从中得知,需要一个25MHz的时钟。 对于MII接口,最常用的方案是,STM32外接25MHz的晶振。 内部的PLL配置HCLK,提供给内核和外设等。 外部PHY连接提供了25MHz的MCO脚。 此方案适合STM32F107/2x7/4x7。 02R
[单片机]
关于<font color='red'>STM32</font>网络电路设计方案
STM32的I2C框图详解及通讯过程
STM32 的I2C 特性及架构 如果我们直接控制STM32 的两个GPIO 引脚,分别用作SCL 及SDA,按照上述信号的时序要求,直接像控制LED 灯那样控制引脚的输出(若是接收数据时则读取SDA 电平),就可以实现I2C 通讯。同样,假如我们按照USART 的要求去控制引脚,也能实现USART通讯。所以只要遵守协议,就是标准的通讯,不管您如何实现它,不管是ST 生产的控制器还是ATMEL 生产的存储器, 都能按通讯标准交互。 由于直接控制GPIO 引脚电平产生通讯时序时,需要由CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。 相对地,还有“硬件协议”方式,STM32 的I2C 片上外设专门负责实现I2C 通
[单片机]
<font color='red'>STM32</font>的I2C框图详解及通讯过程

推荐帖子

流驱动函数的参数表是固定不能改变的吗?
RT流驱动函数的参数表是固定不能改变的吗?DWORDGPIO_Write(DWORDdwData,LPCVOIDpBuf,DWORDLen){BYTE*pdatabuf;BYTEgpioNum;BYTEgpioState;pdatabuf=(BYTE*)pBuf;gpioNum=*pdatabuf++;gpioState=*pdatabuf;
whili 嵌入式系统
RS485简介
RS485简介RS485简介谢谢,学习一下!Re:RS485简介继续努力Re:RS485简介支持,多发帖,多来看看Re:RS485简介
feifei 工控电子
怎样完整评估一个OP AMP的性能?
公司现在选型一个新的运放,那么应该怎样写这个评估报告?大家有没有现成的模板。我现在的应用的处理压力传感器的差分信号,低频的。谢谢!怎样完整评估一个OPAMP的性能?
jingzhi1221 ADI参考电路
【2023 DigiKey大赛参与奖】开箱帖:ESP32 BASIC COER
【2023DigiKey大赛参与奖】开箱帖:ESP32BASICCOER这个ESP32都哪些外设?据说做这板子的公司被乐鑫收购了?
许大锤 DigiKey得捷技术专区
EVC界面设计!
用EVC开发的软件界面,因为都是用其自带的控件,感觉不美观,请问是不是有什么工具或者软件来美化其界面?EVC界面设计!自绘的,不用控件类派生的,因为在PB里面自绘和行为是分开的,所以从CWnd派生自绘比较好,想做什么就做什么贴图片http://m2.tech.topzj.com/thread-6414-1-1.htmlhttp://m2.tech.topzj.com/thread-6414-1-1.html
532250972 嵌入式系统
嵌入式mcu型号
问题1:请问现在公司里面在开发嵌入式的时候,linux使用的是什么版本的?还是红帽吗(视频上是这个),内核是多少的?问题2:MCU的型号是什么?只回答一个问题是不给分的啊,哈哈,谢谢指点嵌入式mcu型号1、我们开发环境都还都是红帽的。至于版本:Linux2.6.152、MCU?具体IC型号很很多,目前以ARM9、ARM11,以及一些PPCARM9:以三星的2410和2440为主流。ARM11:MARVELL的PXA3XX,以及三星的6410PPC:主要是飞思卡尔的MPC8
yiran 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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