使用CubMX和Proteus学习STM32单片机(二)------DHT11

目录

项目简介

硬件模块

软件工具

电路连接图

工作流程

程序代码

结语


项目简介

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

硬件模块

        STM32F103R4

        DHT11

        LCD1602

        74HC373

软件工具

        CubMX

        Proteus

        KEIL

电路连接图

        STM32F103R4

        

        DHT11

        LCD1602

工作流程

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

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

        其余也是一样保持默认

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

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

        

程序代码

        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;	    
}

结语

本文大部分内容都属于原创,如需转载,请附上本文网站,
如果需要相关的仿真图、程序代码等资料可以直接私信我,我会及时回复。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Runner.DUT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值