当前位置: 首页 > news >正文

STM32--DHT11(标准库)驱动开发

一、前言

        在我们进行嵌入式开发时,驱动开发也是十分重要的一步,在很多时候,我们的都需要自己来编写硬件的底层驱动,实现硬件与芯片的通信,常见的协议有SPI,IIC,以及单总线的一些通信方式,今天我们就来开发DHT11驱动。

二、DHT11

        在开发一款驱动前,我们需要知道他是干什么的,DHT11数字温湿度传感器,是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电容式感湿元件和一个NTC 测温元件。

        常用于,暖通空调、除湿器、农业、冷链仓储、测试及检测设备、消费品、汽车、自动控制、数据记录器、气 象站、家电、湿度调节器、医疗、其他相关湿度检测控制。

        因其成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的信号传输距 离、数字信号输出、精确校准,而广泛适用。

        他有四个引脚,1脚为电源引脚,2脚为串行数据引脚(单总线),3脚为悬空NC,4脚为GND接地。以下是他的原理图。

        在实际运用中,常将2脚与主控芯片相连接,我们这里以stm32F103C8T6为例,以下是它的电路连接图。

         

 我们选择的是PA3脚,来作为我们的通信引脚,因此我们在编写程序时,也要选择我们的PA3脚,接下来我们就要进行驱动开发。

三、DHT11底层驱动开发

        在开发任何一款驱动时,他们的数据手册,就是我们的开发依据,所有的时序以及通信方式,校验方式,我们都要依据他们的数据手册,开发DHT11也不例外,我们先在网上搜索DHT11数据手册,下载下来。

        如果找不到,也可以用我下面这个:

百度网盘: https://pan.baidu.com/s/1MGWL-QDO7CBo2ZFKPBY-vQ?pwd=styz

提取码: styz 

        接着我们就可以开始我们的驱动编写了,我们打开CUBEMX,来创建一个工程文件。

        

接着我们创建两个文件夹,一个为DHT11.c一个为DHT11.h

        我们引入头文件后我们开始解读我们的数据手册。

        我们可以看到他有两个状态,当主机输出,以及主机输入状态,显然我们需要初始化我们的PA3引脚为两个状态。因此我们要创建两个函数,来封装这两个状态。

        这样我们在改变模式的时候就可以直接调用函数就可以了。我们接着看数据手册。

        我们可以看到,在开始接受数据之前我们需要输出低信号18ms,以代表起始信号,所以我们也需要在程序里编写。

         我们在看上面的时序图,我们需要拉低电平,也就是输出低电平,为了方便后续的编写,我们可以直接定义一个函数。

               

        这样我们就可以直接调用函数,然后按照起始信号的时序来编写就行。

        这样我们就可以开始接受从机给我们发送命令了 ,我们继续看数据手册。

        

        我们可以看到,这里的延时,变为了微秒级的延时,因此我们还需要自己写一个函数来实现微秒延迟。

        这样一个简单的us延时就完成了。我们继续看数据手册,我们可以发现,当我们的DHT11开始输出低电平时则代表它响应了我们主机的信号。我们就可以用函数先判断引脚是否为低电平。

        这样我们直接判断信号为高还是低,如果为低我们就直接改为输入模式,因为这时的DHT11为输出。因此我们还需要写输入逻辑。也就是发送数据的时序。

        

        接下来我们就可以开始存数据了。我们为了便于使用,我们可以创建一个结构体变量。

        根据数据手册,我们按照顺序创建结构体。

        

接着我们就可以使用他了,我们继续编写我们的读时序。

        

这样就完成了我们的读时序编写,最后我们只需要再写一个函数初始化我们的硬件。

         这样我们的驱动就编写完成了,我们最后只需要在我们的DHT11.h中声明我们的函数就可以在外部调用我们的函数了。

        

        这样我们可以读取数据了。

http://www.xdnf.cn/news/1210771.html

相关文章:

  • spring cloud sentinel 动态规则配置
  • 【华为机试】20. 有效的括号
  • docker docker、swarm 全流程执行
  • C++多态:面向对象编程的灵魂之
  • 网络安全第15集
  • 力扣30 天 Pandas 挑战(3)---数据操作
  • C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
  • uniapp 实现全局变量
  • Rust 实战三 | HTTP 服务开发及 Web 框架推荐
  • React 中获取当前路由信息
  • 2.oracle保姆级安装教程
  • 《零基础入门AI:传统机器学习入门(从理论到Scikit-Learn实践)》
  • 如何解决人工智能在社会治理中面临的技术和伦理挑战?
  • 网络原理--HTTPHTTPS
  • AI产品经理手册(Ch3-5)AI Product Manager‘s Handbook学习笔记
  • PyCharm插件开发与定制指南:打造个性化开发环境
  • FSMC的配置和应用
  • SpringBoot集成deepseek
  • Export useForm doesn‘t exist in target module
  • vue3组件通信的几种方法,详解
  • 05动手学深度学习(下)
  • Linux - 权限的理解(深入浅出,详细细微)
  • 书籍推荐算法研究
  • gRPC性能陷阱:低延迟网络下的客户端瓶颈揭秘
  • Spark SQL 数组函数合集:array_agg、array_contains、array_sort…详解
  • Zynq SOC FPGA嵌入式裸机设计和开发教程自学笔记:GPIO扩展与中断控制技术,万字详解!!
  • 【变更性别】
  • TCPDump实战手册:协议/端口/IP过滤与组合分析指南
  • ESP32学习-1.第一个程序helloworld
  • 子数组和 问题汇总