STM32F103VE基于标准库下DHT11数据串口打印输出

该博客介绍了一个基于STM32F103VE的项目,使用标准库读取DHT11传感器的温度和湿度数据,并通过串口进行数据打印。程序中包含了初始化配置、延时函数、DHT11数据读取和校验等关键步骤,同时兼容极海APM32F103VC。
摘要由CSDN通过智能技术生成

STM32F103VE基于标准库下DHT11数据串口打印输出


  • 📜串口数据打印
    在这里插入图片描述
  • 🌿DHT11温湿度传感器
    在这里插入图片描述

🔖本程序兼容极海APM32f103vc

🛠引脚定义说明

DHT11 data引脚 ----->PB7
  • 🎉 引脚可以根据需求任意切换。

📝主程序代码

  • 🔰工程模版采用的是正点原子的工程模版。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "dht11.h"


 int main(void)
 {		

	DHT11_Data_TypeDef DHT11_Data;
	 
	 	delay_init();	    	 //延时函数初始化	 
	 delay_ms(200);
	DHT11_Init();
 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
	 printf("stm32f103vet6 \n");
	while(1){
		if( !DHT11_Read_TempAndHumidity(&DHT11_Data)){		
				printf("read dht11 error \n");						
		}//读取温湿度,并且校验读取的示数是否准确
		printf("Temp:%d.%d℃  Humi:%d.%d %%RH \n",DHT11_Data.temp_int,DHT11_Data.temp_deci,DHT11_Data.humi_int,DHT11_Data.humi_deci);
	delay_ms(1000);

	}
 }
  • 🌿 dht.h文件
#ifndef __DHT11_H
#define	__DHT11_H
 
 
#include "stm32f10x.h"
 
/************************** DHT11 数据类型定义********************************/
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;
 
 
/************************** DHT11 连接引脚定义********************************/
 
#define      macDHT11_Dout_SCK_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      macDHT11_Dout_GPIO_CLK                       RCC_APB2Periph_GPIOB
 
#define      macDHT11_Dout_GPIO_PORT                      GPIOB
#define      macDHT11_Dout_GPIO_PIN                       GPIO_Pin_7
 
 
 
/************************** DHT11 函数宏定义********************************/
#define macDHT11_Dout_0	   GPIO_ResetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
#define macDHT11_Dout_1	   GPIO_SetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
 
#define macDHT11_Dout_IN() GPIO_ReadInputDataBit ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
 
 
 
/************************** DHT11 函数声明 ********************************/
void DHT11_Init( void );
uint8_t DHT11_Read_TempAndHumidity( DHT11_Data_TypeDef * DHT11_Data );

#endif 
/* __DHT11_H */


  • dht.c
#include "dht11.h"
#include "delay.h" 
 
 
/* DHT11延时函数使用DWT外设实现,因为SysTick的延时精度被设置为了1ms,不能提供us级别的延时 */
 
#define DHT11_DELAY_US(us)  delay_us(us)
#define DHT11_DELAY_MS(ms)  delay_ms(ms)
 
 
static void    DHT11_GPIO_Config( void );
static void    DHT11_Mode_IPU( void );
static void    DHT11_Mode_Out_PP( void );
static uint8_t DHT11_ReadByte( void );
 
 
 
 /**
  * @brief  DHT11 初始化函数
  * @param  无
  * @retval 无
  */
void DHT11_Init ( void )
{
	DHT11_GPIO_Config ();
	
	macDHT11_Dout_1;               // 拉高GPIOB10
}
 
 
/*
 * 函数名:DHT11_GPIO_Config
 * 描述  :配置DHT11用到的I/O口
 * 输入  :无
 * 输出  :无
 */
static void DHT11_GPIO_Config ( void )
{		
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;
 
	
	/*开启macDHT11_Dout_GPIO_PORT的外设时钟*/
  macDHT11_Dout_SCK_APBxClock_FUN ( macDHT11_Dout_GPIO_CLK, ENABLE );	
 
	/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;	
 
	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
 
	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
 
	/*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/
  	GPIO_Init ( macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure );		  
	
}
 
 
/*
 * 函数名:DHT11_Mode_IPU
 * 描述  :使DHT11-DATA引脚变为上拉输入模式
 * 输入  :无
 * 输出  :无
 */
static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;
 
	  	/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/	
	  GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;
 
	   /*设置引脚模式为浮空输入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 
 
	  /*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/
	  GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);	 
	
}
 
 
/*
 * 函数名:DHT11_Mode_Out_PP
 * 描述  :使DHT11-DATA引脚变为推挽输出模式
 * 输入  :无
 * 输出  :无
 */
static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
 
	 	/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;	
 
	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
 
	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
	/*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/
  	GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);	 	 
	
}
 
 
/* 
 * 从DHT11读取一个字节,MSB先行
 */
static uint8_t DHT11_ReadByte ( void )
{
	uint8_t i, temp=0;
	
 
	for(i=0;i<8;i++)    
	{	 
		/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
		while(macDHT11_Dout_IN()==Bit_RESET);
 
		/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
		 *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时 
		 */
		DHT11_DELAY_US(40); //延时x us 这个延时需要大于数据0持续的时间即可	   	  
 
		if(macDHT11_Dout_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */
		{
			/* 等待数据1的高电平结束 */
			while(macDHT11_Dout_IN()==Bit_SET);
 
			temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行 
		}
		else	 // x us后为低电平表示数据“0”
		{			   
			temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
		}
	}
	
	return temp;
	
}
 
 
/*
 * 一次完整的数据传输为40bit,高位先出
 * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  
	/*输出模式*/
	DHT11_Mode_Out_PP();
	/*主机拉低*/
	macDHT11_Dout_0;
	/*延时18ms*/
	DHT11_DELAY_MS(18);
 
	/*总线拉高 主机延时30us*/
	macDHT11_Dout_1; 
 
	DHT11_DELAY_US(30);   //延时30us
 
	/*主机设为输入 判断从机响应信号*/ 
	DHT11_Mode_IPU();
 
	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
	if(macDHT11_Dout_IN()==Bit_RESET)     
	{
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(macDHT11_Dout_IN()==Bit_RESET);
 
		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(macDHT11_Dout_IN()==Bit_SET);
 
		/*开始接收数据*/   
		DHT11_Data->humi_int= DHT11_ReadByte();
 
		DHT11_Data->humi_deci= DHT11_ReadByte();
 
		DHT11_Data->temp_int= DHT11_ReadByte();
 
		DHT11_Data->temp_deci= DHT11_ReadByte();
 
		DHT11_Data->check_sum= DHT11_ReadByte();
 
 
		/*读取结束,引脚改为输出模式*/
		DHT11_Mode_Out_PP();
		/*主机拉高*/
		macDHT11_Dout_1;
 
		/*检查读取的数据是否正确*/
		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;
	}
	
	else
		return ERROR;
	
}

/*************************************END OF FILE******************************/





📚程序源码

链接:https://pan.baidu.com/s/1OQTgJIFFb4XjB7-8dN0lGQ 
提取码:g95t
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是基于STM32F103C8T6标准库DHT11测温代码,供参考: ```c #include "stm32f10x.h" #include "delay.h" #define DHT11_PORT GPIOC #define DHT11_PIN GPIO_Pin_3 void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); GPIO_SetBits(DHT11_PORT, DHT11_PIN); delay_ms(1000); } uint8_t DHT11_Read_Byte(void) { uint8_t i, data = 0; for(i=0; i<8; i++) { while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); delay_us(30); if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) data |= (1<<(7-i)); while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); } return data; } uint8_t DHT11_Read_TempAndHumidity(float *Temp, float *Humidity) { uint8_t i, j, check_sum; uint8_t DHT11Data[5]; GPIO_ResetBits(DHT11_PORT, DHT11_PIN); delay_ms(18); GPIO_SetBits(DHT11_PORT, DHT11_PIN); delay_us(40); if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) return 1; delay_us(80); if(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) return 2; delay_us(80); for(i=0; i<5; i++) DHT11Data[i] = DHT11_Read_Byte(); GPIO_SetBits(DHT11_PORT, DHT11_PIN); check_sum = DHT11Data[0] + DHT11Data[1] + DHT11Data[2] + DHT11Data[3]; if(check_sum != DHT11Data[4]) return 3; *Humidity = (float)DHT11Data[0] + (float)DHT11Data[1]/10.0; *Temp = (float)DHT11Data[2] + (float)DHT11Data[3]/10.0; return 0; } int main(void) { float Temp, Humidity; DHT11_Init(); while(1) { if(DHT11_Read_TempAndHumidity(&Temp, &Humidity) == 0) { printf("Temperature: %.1f C, Humidity: %.1f%%\n", Temp, Humidity); } delay_ms(2000); } } ``` 这个程序使用了STM32F103C8T6的标准库和一个DHT11传感器来测量温度和湿度。程序首先初始化GPIO口,然后读取DHT11传感器来获取温度和湿度值。最后,程序会将读取到的温度和湿度值通过串口打印出来,然后等待2秒钟再次读取。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值