1、开发平台

  • 使用野火STM32H750开发板
  • 无RTOS
  • 使用HAL库进行开发

硬件连接:
SDA---->PA12

2、DHT11介绍


起始信号:

从机响应信号:

传输:

贴上代码:
dht11.h

#ifndef __dht11_h
#define __dht11_h#include "main.h"/*底层接口*/
#define __DHT11_GPIO_INIT()     dht11_gpio_init()
#define __DHT11_MODE(MODE)      DHT11_MODE(MODE)
#define __DHT11_OUT_H()         HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET)
#define __DHT11_OUT_L()         HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET)
#define __DHT11_READ()          HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)
#define __DHT11_DELAY_MS(nms)   delay_ms(nms)
#define __DHT11_DELAY_US(nms)   delay_us(nms)/*硬件接口*/
#define __DHT11_PIN_CLK()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define DHT11_PIN               GPIO_PIN_12
#define DHT11_PORT              GPIOA/*延时函数*/
#define  SYSCLK                             400000000/1000000                   //指明CPU工作频率为(SystemCoreClock/1000000)MHz
#define  A                                  6                                   //一次循环所花的周期数
#define  B                                  3                                   //调用、初始化、返回总共所用的周期数
#define  delay_us(nus)                      wait(((nus)*(SYSCLK)-(B))/(A))
#define  delay_ms(nms)                      delay_us((nms)*1000)
#define  delay_s(ns)                        delay_ms((ns)*1000)/*结构体成员定义*/
typedef struct
{uint8_t  humi_int;     //湿度的整数部分uint8_t  humi_deci;        //湿度的小数部分uint8_t  temp_int;     //温度的整数部分uint8_t  temp_deci;        //温度的小数部分uint8_t  check_sum;        //校验和}DHT11_Data_TypeDef;/*函数声明*/
void  wait(unsigned long n);
void dht11_init(void);
uint8_t ReadByte(void);
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);
void DHT11_PRINTF(void);
#endif

dht11.c

#include "dht11.h"GPIO_InitTypeDef DHT11_GPIO_Init;DHT11_Data_TypeDef DHT11_Data;/****************************************************************
*@function: dht11_gpio_init
*@input   : none
*@output  : none
*@describe: DHT11的GPIO口初始化
*@author  : sola
****************************************************************/
void dht11_gpio_init(void)
{ __DHT11_PIN_CLK();               //开启时钟DHT11_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);
}/****************************************************************
*@function: DHT11_MODE
*@input   : mode    (0/1)
*@output  : none
*@describe: DHT11 GPIO输入输出模式选择
*@author  : sola
****************************************************************/
void DHT11_MODE(uint8_t mode)
{if(mode == 0){DHT11_GPIO_Init.Mode = GPIO_MODE_INPUT;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);}else if(mode == 1){DHT11_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);}
}/*---------------------------应用层----------------------------*//****************************************************************
*@function: dht11_delay
*@input   : n (MHz)
*@output  : none
*@describe: 延时
*@author  : sola
****************************************************************/
void  wait(unsigned long n)
{   do{n--;}while(n);
}/****************************************************************
*@function: dht11_init
*@input   : none
*@output  : none
*@describe: DHT11 起始信号
*@author  : sola
****************************************************************/
void dht11_init(void)
{__DHT11_GPIO_INIT();
}/****************************************************************
*@function: ReadByte
*@input   : none
*@output  : temp
*@describe: 读一个字节
*@author  : sola
****************************************************************/
uint8_t ReadByte(void) {uint8_t i, temp = 0;for(i=0;i<8;i++) {while(__DHT11_READ() == 0);__DHT11_DELAY_US(40);               //40usif(__DHT11_READ() == 1) {while(__DHT11_READ() == 1);temp |= (uint8_t)(0x01<<(7-i));}else {temp &= (uint8_t)~(0x01<<(7-i));}}  return temp;
}/****************************************************************
*@function: Read_DHT11
*@input   : *DHT11_Data
*@output  : temp
*@describe: DHT11 读数据
*@author  : sola
****************************************************************/
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data) {__DHT11_MODE(1);            //配置为输出__DHT11_OUT_L();            //拉低__DHT11_DELAY_MS(18);       //18ms__DHT11_OUT_H();            //拉高__DHT11_DELAY_US(13);       //13us__DHT11_MODE(0);            //配置为输入if(__DHT11_READ() == 0) {while(__DHT11_READ() == 0); while(__DHT11_READ() == 1);DHT11_Data->humi_int= ReadByte();   //读取湿度整数DHT11_Data->humi_deci= ReadByte();  //读取湿度小数DHT11_Data->temp_int= ReadByte();   //读取温度整数DHT11_Data->temp_deci= ReadByte();  //读取温度整数DHT11_Data->check_sum= ReadByte();  //应答读取__DHT11_MODE(1);                    //配置为输出__DHT11_OUT_H();if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci) {return SUCCESS;}else {        return ERROR;   }}return 0;
}/****************************************************************
*@function: DHT11_PRINTF
*@input   : none
*@output  : none
*@describe: DHT11 打印数据
*@author  : sola
****************************************************************/
#if 1
void DHT11_PRINTF(void) {if(Read_DHT11(&DHT11_Data) == SUCCESS) {printf("\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);}
}
#endif

移植也方便,就修改几个地方就好了。

注意:如果移植后通讯不成功,请修改delay_us和delay_ms,也可以调节参数A,这个在不同MCU上需要执行的周期时间是不一样的。

STM32驱动DHT11相关推荐

  1. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  2. STM32单片机DHT11数字温湿度监测

    OLED液晶接口电路图 DHT11传感器接口电路图 STM32单片机DHT11数字温湿度监测程序源代码 #include "sys.h" #define LED_RED PBout ...

  3. STM32项目设计:基于STM32的DHT11、MQ-2、光照强度检测

    一.项目功能概述 1.通过DHT11温湿度模块检测温湿度 2.通过MQ-2烟雾传感器检测烟雾 3.通过光敏电阻模块检测光照强度 4.oled液晶屏显示实时检测到的数据 5.超限蜂鸣器报警 源码下载地址 ...

  4. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  5. stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...

  6. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

    参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...

  7. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  8. STM32驱动LCD实战

    目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...

  9. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

最新文章

  1. 【Linux】Linux简单操作之vi与vim编辑器
  2. 小程序这件事 撸起袖子加油干
  3. 【POJ1321棋盘问题】【poj2251Dungeon Master】【poj3278Catch That Cow】【poj1426Find The Multi】
  4. Winform中设置ZedGraph的颜色填充使用Fill
  5. linux下改变python的版本
  6. ajax 偶尔302,关于Ajax 中response出现302的一点见解
  7. wdatepicker使用指南
  8. Git和Github之间的区别
  9. linux脚本生成数字写入文本,4.2 编写Shell脚本(P80-85)——《Linux就该这么学》学习笔记16...
  10. Golang简单日志类
  11. 携程是如何借助“预测式外呼”提高呼叫效率的
  12. 三国将星录java阵容_三国将星录,通关攻略
  13. 如何进行自学软件测试?
  14. 如何在Cell里画出虚线?
  15. IDC发布中国AI云服务市场报告 百度智能云排名第一
  16. 最新微信hook3.0二次开发C#源码介绍
  17. 软件测试团队口号及队名,团队队名口号(精选50句)
  18. 计算机图形学之机器人
  19. linux用户禁止登录,Linux限制用户登录
  20. Cisco 防火墙Firwall Failover ActiveActive 双HSRP 实现双ISP完美切换

热门文章

  1. oracle 查找表列名,oracle查询列名(查询表字段名称)
  2. C++程序度量驱动调优实例:看狄更斯的双城记,寻找性能瓶颈
  3. 云计算服务商中云融信 十一月产品升级
  4. php校验邮箱是否可用 socket helo,如何利用PHP验证邮箱是否合格
  5. 可视化的 CSS 编辑器 Simple CSS
  6. 观看 比尔盖茨及梅琳达在斯坦福2014届毕业生毕业典礼上的演讲有感
  7. 【考研复习】不定积分公式,总结了个好记的办法
  8. 分布式架构原理解析常见问题解决
  9. 收藏:21个强大的jQuery特效展示
  10. 基于flask徐州市天气信息可视化分析系统-计算机毕设 附源码 04600