STM32单片机学习笔记(2):DHT11温湿度传感器

控制/MCU

1883人已加入

描述

项目简介

利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。

硬件模块

STM32F103R4

DHT11

LCD1602

74HC373

软件工具

CubMX

Proteus

KEIL

威廉希尔官方网站 连接图

STM32F103R4

DHT11

DHT11

DHT11

LCD1602

DHT11

工作流程

首先还是先利用CubMX创建一个KEIL工程设置PA0位DHT11的数据口,这里之所以选用PA0,主要是有些版本的Proteus会有一些BUG,就是只有PA0端口有输入的功能,换句话说,就是只有PA0能够作为输入被单片机读取到数据。我一开始用的是8.6版本的Proteus,会有这个问题,后来下载更高版本的Proteus也可以解决这个问题,即其余端口也可作为输入口。

DHT11

时钟根据自己习惯保持默认即可。

DHT11

其余也是一样保持默认

DHT11

然后,在生成的KEIL工程里编写相应程序即可。程序主要代码部分在“程序代码” 标题里。

最后,在Proteus中仿真验证。结果如下图所示。

DHT11

程序代码

mian.c

unsigned char buff[10];
  unsigned char temp,humi;
/* USER CODE END 0 */



/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */
  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();


  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  LCD_INIT();
  DHT11_Init();


  while(1)
  {
    /**********功能1:显示温湿度数据******************/
    DHT11_Read_Data(&temp,&humi);//读取DHT11的温湿度数据
    sprintf((char *)buff,"%.2d  %.2d",temp,humi);
    LCD_WRITE_StrDATA(buff,0,0);



    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

DHT11.c

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)    
{        
   unsigned char buf[5];
  unsigned char i;
  DHT11_Rst();
  if(DHT11_Check()==0)
  {
    //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
    for(i=0;i< 5;i++)//读取40位数据
    {
      buf[i]=DHT11_Read_Byte();
    }
    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    {
      *humi=buf[0];
      *temp=buf[2];
    }
  }else return 1;
  return 0;      
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分