STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

这篇具有很好参考价值的文章主要介绍了STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文参考此篇博客并在其基础上进行了修改:STM32F103驱动DHT11温湿度传感器(STM32MXcube,HAL)

在此特别鸣谢原文博主!

1.软件准备

(1)编程平台:Keil5

(2)CubeMX

(3)XCOM(串口调试助手)

2.硬件准备

(1)F1的板子,本例使用经典F103C8T6

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

 (2)DHT11——温湿度传感器

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

(3)ST-link 下载器

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

(4)USB-TTL模块

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

(5)杜邦线若干

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

3.CubeMX配置

(1)芯片选择

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印
STM32F103C8T6

 (2)配置RCC、SYS、时钟树

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印
配置RCC
STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印
配置SYS
STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印
配置时钟树

(3) 配置GPIO

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

 (4)配置串口1

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

(5)设置路径、生成代码工程

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

4、Keil5代码

 (1)勾选Use MicroLIB

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

  (2)创建DHT11.c和DHT.h文件

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

 (3)添加上述的DHT11.c文件进工程

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

之后将下述代码添加到DHT11.c里面

#include "dht11.h"
extern UART_HandleTypeDef huart1;
/**
  * @brief  温湿度传感器主函数
  * @param  void
  * @retval None
  */
void DHT11(void)
{
    if(DHT11_READ_DATA() == 1)
    {
        printf("数据校验成功!\r\n");
    }
    else
    {
        printf("DHT11没有应答,请检查传感器!\r\n");
    }
    HAL_Delay(1000);                              
  
}
 
/**
  * @brief  温湿度传感器启动信号发送
  * @param  void
  * @retval None
  */
void DHT11_START(void)
{
    DHT11_GPIO_MODE_SET(0);                         //  主机设置为输出模式
    
    DHT11_PIN_RESET;                                //  主机拉低电平
    
    HAL_Delay(20);                                  //  主机等待 18 < ms > 30
    
    DHT11_GPIO_MODE_SET(1);                         //  主机设置为输入模式,等待DHT11答应
}                                                   //  因为设置了上拉输入,GPIO -> 1
 
/**
  * @brief  读取一位数据 1bit
  * @param  void
  * @retval 0/1
  */
unsigned char DHT11_READ_BIT(void)
{
    while(!DHT11_READ_IO);                          //  过度数据的低电平 
    
    Coarse_delay_us(40);

    if(DHT11_READ_IO)                               //  此时如果还为高电平则数据为 1
    {
        while(DHT11_READ_IO);                       //  过度数据的高电平
        return 1;
    }   
    else                                            //  若此时为低则为 0
    {
        return 0;
    }
}
 
/**
  * @brief  读取一个字节数据 1byte / 8bit
  * @param  void
  * @retval temp
  */
unsigned char DHT11_READ_BYTE(void)
{
    uint8_t i,temp = 0;                             //  暂时存储数据
    
    for(i=0; i<8 ;i++)
    {
        temp <<= 1;                                 
        if(DHT11_READ_BIT())                        //  1byte -> 8bit
        {
            temp |= 1;                              //  0000 0001
        }
    }
    return temp;
}
 
/**
  * @brief  读取温湿度传感器数据 5byte / 40bit
  * @param  void
  * @retval 0/1/2
  */
unsigned char DHT11_READ_DATA(void)
{
    uint8_t i;
    uint8_t data[5] = {0};
    
    DHT11_START();                                  //  主机发送启动信号
    
    if(DHT11_Check())                               //  如果DHT11应答     
    {  
        while(!DHT11_READ_IO);                      //  过度DHT11答复信号的低电平
        while(DHT11_READ_IO);                       //  过度DHT11答复信号的高电平
        
        for(i=0; i<5; i++)
        {                        
            data[i] = DHT11_READ_BYTE();            //  读取 5byte
        }
        
        if(data[0] + data[1] + data[2] + data[3] == data[4])
        {
            printf("当前湿度:%d.%d%%RH当前温度:%d.%d°C--",data[0],data[1],data[2],data[3]);
            return 1;                               //  数据校验通过
        }
        else
        {
            return 0;                               //  数据校验失败
        }
    }
    else                                            //  如果DHT11不应答
    {
        return 2;
    }
}
 
/**
  * @brief  检测温湿度传感器是否存在(检测DHT11的应答信号)
  * @param  void
  * @retval 0/1
  */
unsigned char DHT11_Check(void)
{

    Coarse_delay_us(40);
    if(DHT11_READ_IO == 0)                          //  检测到DHT11应答
    {
        return 1;
    }
    else                                            //  检测到DHT11不应答
    {
        return 0;
    }
}
 
/**
  * @brief  设置引脚模式
  * @param  mode: 0->out, 1->in
  * @retval None
  */
static void DHT11_GPIO_MODE_SET(uint8_t mode)
{
    if(mode)
    {
        /*  输入  */
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.Pin = GPIO_PIN_9;                   //  9号引脚
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;             //  输入模式
        GPIO_InitStruct.Pull = GPIO_PULLUP;                 //  上拉输入
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    }
    else 
    {
        /*  输出  */
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.Pin = GPIO_PIN_9;                //  9号引脚
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;      //  Push Pull 推挽输出模式
        GPIO_InitStructure.Pull = GPIO_PULLUP;              //  上拉输出
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;    //  高速
        HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
    }
}

/**
  * @brief  程序延时 us , 必须在 72M 主频下使用
  * @param  us: <= 4294967295
  * @retval None
  */
void Coarse_delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
		;
	}
}



下述代码添加到DHT11.h里面

#ifndef __DHT11_H__
#define __DHT11_H__
 
/* Private includes ----------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "stdio.h"
#include "stm32f1xx.h"

/* Private define ------------------------------------------------------------*/
#define DHT11_PIN_SET   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)                                            //  设置GPIO为高
#define DHT11_PIN_RESET HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)                                          //  设置GPIO为低
#define DHT11_READ_IO   HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)                                                          //  DHT11 GPIO定义
 

 
/* Private function prototypes -----------------------------------------------*/
void DHT11(void);
void DHT11_START(void);
unsigned char DHT11_READ_BIT(void);
unsigned char DHT11_READ_BYTE(void);
unsigned char DHT11_READ_DATA(void);
unsigned char DHT11_Check(void);
static void DHT11_GPIO_MODE_SET(uint8_t mode);

void Coarse_delay_us(uint32_t us);
    
#endif

(4) main函数修改

添加如下3处:

 

#include "dht11.h"

 

HAL_Delay(1000);

DHT11();

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

(5) usart.c函数修改

添加如下:

#include "stdio.h"

int fputc(int ch,FILE *f)
{   HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    return ch;
}

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

5、接线图及效果

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

编译无错误后烧录即可通过串口调试助手查看到如下  

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印文章来源地址https://www.toymoban.com/news/detail-401730.html

 本例程源码下载:点击跳转 

到了这里,关于STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32(F103c8t6)自学笔记@阿布君

    1.注意头文件和C文件的包含关系,C文件自身应包含自身的H头文件以及用到的外部头文件,而自身头文件只需包含头文件需要用到的资源文件即可。 参考文献:http://t.csdn.cn/o2GmL 注释: 红色 表示:与电源相关 蓝色 是最小系统相关的引脚 绿色 是IO口、功能口 S代表电源、I代表

    2024年02月03日
    浏览(45)
  • STM32 F103C8T6学习笔记7:双机无线串口通信

    今日尝试配通俩个C8T6单片机之间的无线串口通信,文章提供原理,源码,测试效果图,测试工程下载: 目录 传输不规范问题: 串口通信资源: 单个串口资源理解: 单片机串口资源: 测试目标与测试硬件连接: 串口初始化与串口中断接收逻辑: 串口初始化: 初步测试能否

    2024年02月09日
    浏览(40)
  • STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

    今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理:  红外遥控特点: 红外发射装置:  红外接收示意图:  NEC协议

    2024年02月11日
    浏览(40)
  • STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

    之前的系列教程都是基于Arduino的,但是公司招聘51和stm32的开发还是多些,所以特别开了一个stm32的系列。 这个系列特点是注重了 Arduino 编程思维和习惯下向STM32开发的过渡 。前期没有涉及到太多寄存器相关的知识,利用HAL库和STM32CubeIDE快速入手STM32的数字输入/输出、模拟输

    2024年02月16日
    浏览(41)
  • STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

    作为一名大学生,学习单片机有一段时间了,也接触过嵌入式ARM的开发,但从未使用以及接触过STM32C8T6大开发使用,于是从今日开始,将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题,STM32C8T6单片机资源介绍, 目录 开发环境与下载问题: 1.电脑上需要安装相应

    2024年02月14日
    浏览(39)
  • STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数

    今日学习使用STM32 C8T6的串口,我们在经过学习笔记2的总结归纳可知,STM32 C8T6最小系统板上有三路串口,如下图:  今日我们就着手学习如何配置开通这些串口进行收发,这里不讲串口通信概念与基础,可以自行网上查找,本文直接开始介绍库函数与编程实现:          

    2024年02月10日
    浏览(36)
  • STM32F103C8T6(HAL库)驱动舵机

    常见的舵机分为360°和180°两种,本次对180°舵机进行驱动,舵机驱动需要通过PWM信号进行驱动。本文通过定时器中的PWM信号设定使得SG90舵机进行不同角度的转动。 对于舵机的驱动,需要20ms的脉冲,高电平时间在0.5ms-2.5ms区间即可控制舵机在0-180°角度进行转动。常见角度对应

    2024年02月05日
    浏览(42)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(43)
  • STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符

    使用STM32F103 C8T6 驱动0.96寸单色OLED显示屏: OLED显示屏的驱动,在设计开发中OLED显示屏十分常见,因此今日学习一下。一篇文章从程序到显示都讲通。 文章提供源码、原理解释、测试工程下载,测试效果图展示。   目录 OLED驱动原理—IIC通信: SSD1306 单色 0.96 OLED 显示屏特性

    2024年02月12日
    浏览(55)
  • STM32F103C8T6(HAL库函数 - 内部Flash操作)

    STM32F103C8T6 内部Flash 为 64KB,本次将对他多余空间进行读写。 数据手册下载 STM32F103x8/STM32F103xB 数据手册 包含Flash Memory Page分布 STM32F设备命名 设备容量类型 中容量类型 内部空间介绍 Flash Memory 从 0x0800 0000 ~ 0x0801 FFFF 页分布1K每页, STM32F103C8T6 只有64KByte, 那就是64页 使用 controll

    2024年01月21日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包