网站制作一般收费满城建设局网站
2026/4/6 3:41:30 网站建设 项目流程
网站制作一般收费,满城建设局网站,一个做二维码问卷调查的网站,人事处网站开发文献综述STM32DHT11温湿度采集#xff0c;小白也能看懂的保姆级教程 你是否曾盯着一堆电子元件发呆#xff1a;STM32芯片、DHT11传感器#xff0c;明明都是现成的零件#xff0c;却不知道怎么让它们“合作”采集温湿度#xff1f;其实这事儿一点都不复杂#xff01;就像教两个陌生…STM32DHT11温湿度采集小白也能看懂的保姆级教程你是否曾盯着一堆电子元件发呆STM32芯片、DHT11传感器明明都是现成的零件却不知道怎么让它们“合作”采集温湿度其实这事儿一点都不复杂就像教两个陌生人打招呼只要摸清它们的“沟通规则”几分钟就能搞定。今天就带大家从零开始一步步解锁STM32驱动DHT11的技能全程无晦涩术语无复杂操作看完就能上手实操一、先搞懂核心逻辑DHT11和STM32是怎么“聊天”的DHT11是个性格随和的传感器它只用一根线单总线就能和STM32沟通不用复杂的接线这也是它受欢迎的原因。它们的对话流程特别简单就像一套固定的“暗号”STM32先“主动搭话”把总线拉低至少18毫秒相当于大声喊“嗨在吗”然后再拉高20-40微秒等着DHT11回应DHT11“礼貌回复”收到信号后先拉低总线80微秒再拉高80微秒意思是“我在呢准备发数据啦”DHT11“传递信息”紧接着发送40位数据包含湿度整数、湿度小数、温度整数、温度小数和校验和——这里要偷偷说个小秘密DHT11的小数位其实一直是0所以我们重点看整数部分就行STM32“核对信息”把收到的前4个字节加起来取最后8位和校验和对比一致就说明数据没出错这波沟通才算成功。二、完整驱动代码复制粘贴就能用附详细注释下面的代码基于STM32F103系列标准库大家只要根据自己的硬件修改一下引脚定义就能直接用。每个部分都加了超详细的注释就算是编程新手也能看明白每一行的作用1. 头文件dht11.h给“沟通”定好规则头文件就像一本“沟通手册”提前定义好要用的引脚、存储数据的格式和要用到的函数让STM32和DHT11知道该怎么配合。#ifndef__DHT11_H#define__DHT11_H#includestm32f10x.h// 这里要划重点根据自己的硬件修改引脚默认是GPIOB的Pin12#defineDHT11_GPIO_PORTGPIOB// 传感器连接的GPIO端口#defineDHT11_GPIO_PINGPIO_Pin_12// 传感器连接的GPIO引脚#defineDHT11_GPIO_CLKRCC_APB2Periph_GPIOB// 对应端口的时钟// 存储温湿度数据的“小盒子”把有用的信息都装进去typedefstruct{uint8_thumidity_int;// 湿度整数部分0-99比如50就是50%uint8_thumidity_dec;// 湿度小数部分DHT11固定为0不用管它uint8_ttemp_int;// 温度整数部分-20~60比如25就是25℃uint8_ttemp_dec;// 温度小数部分同样固定为0uint8_tcheck_sum;// 校验和用来核对数据是否准确}DHT11_DataTypeDef;// 声明要用到的函数相当于提前告诉STM32有这些“工具”voidDHT11_GPIO_Init(void);// 初始化GPIO引脚做好沟通准备uint8_tDHT11_Read_Data(DHT11_DataTypeDef*DHT11_Data);// 读取温湿度数据uint8_tDHT11_Check_Response(void);// 检测DHT11有没有回应#endif2. 源文件dht11.c实现“沟通”的具体操作如果说头文件是“手册”那源文件就是“操作步骤”把每个函数的具体功能实现出来让STM32知道该怎么发送信号、接收数据。#includedht11.h#includedelay.h// 注意这里需要自己实现us级延时函数非常关键// 快速切换引脚状态的“快捷键”不用写复杂代码提高效率#defineDHT11_OUT_HIGH()GPIO_SetBits(DHT11_GPIO_PORT,DHT11_GPIO_PIN)// 引脚拉高#defineDHT11_OUT_LOW()GPIO_ResetBits(DHT11_GPIO_PORT,DHT11_GPIO_PIN)// 引脚拉低#defineDHT11_IN_READ()GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)// 读取引脚状态// GPIO初始化给引脚“设定角色”先让它能发送信号后续再切换成接收voidDHT11_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK,ENABLE);// 开启GPIO时钟给引脚“通电”// 设定引脚为推挽输出模式就像给STM32装了个“扬声器”能主动发信号GPIO_InitStructure.GPIO_PinDHT11_GPIO_PIN;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(DHT11_GPIO_PORT,GPIO_InitStructure);DHT11_OUT_HIGH();// 初始状态把总线拉高相当于“待命”状态}// 检测DHT11响应看看传感器有没有收到STM32的“招呼”// 返回0成功回应1没回应传感器可能没接好或坏了uint8_tDHT11_Check_Response(void){uint8_tretry0;// 切换引脚为浮空输入模式相当于让STM32“竖起耳朵”听DHT11说话GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_PinDHT11_GPIO_PIN;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(DHT11_GPIO_PORT,GPIO_InitStructure);// 等待DHT11拉低总线最多等80微秒超时就是没回应while(DHT11_IN_READ()1retry80){retry;delay_us(1);// 必须是精准的微秒级延时差一点就可能出错}if(retry80)return1;// 等太久没反应返回失败elseretry0;// 再等DHT11拉高总线同样最多80微秒while(DHT11_IN_READ()0retry80){retry;delay_us(1);}if(retry80)return1;// 响应异常返回失败return0;// 响应正常准备接收数据}// 读取温湿度数据核心函数完成“打招呼-收数据-核数据”的全过程// 返回0读取成功1失败没回应或数据出错uint8_tDHT11_Read_Data(DHT11_DataTypeDef*DHT11_Data){uint8_ti,j,temp;uint8_tdata[5]{0};// 用一个数组存40位数据5个字节// 1. 发送起始信号STM32主动“打招呼”DHT11_OUT_LOW();// 拉低总线delay_ms(20);// 保持20毫秒满足至少18毫秒的要求多等2毫秒更稳妥DHT11_OUT_HIGH();// 拉高总线delay_us(30);// 保持30微秒在20-40微秒范围内// 2. 检测DHT11响应没回应就直接返回失败if(DHT11_Check_Response()!0){return1;}// 3. 读取40位数据5个字节每个字节8位慢慢“听”DHT11说for(i0;i5;i)// 循环5次读取5个字节{for(j0;j8;j)// 循环8次读取每个字节的8位{// 等待总线拉低这是每一位数据的“开始信号”大概50微秒while(DHT11_IN_READ()0);// 延时40微秒后检测电平高电平1低电平0DHT11的“语言规则”delay_us(40);temp0;if(DHT11_IN_READ()1){temp1;// 检测到高电平记为1}// 等待总线拉高结束准备读取下一位while(DHT11_IN_READ()1);// 把当前位的数据拼接到对应的字节里高位在前别搞反啦data[i]|(temp(7-j));}}// 4. 恢复GPIO为输出模式读完数据让引脚回到“待命”状态GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_PinDHT11_GPIO_PIN;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(DHT11_GPIO_PORT,GPIO_InitStructure);DHT11_OUT_HIGH();// 5. 校验数据确保收到的数据是准确的// 规则前4个字节的和最后8位要等于第5个字节校验和if((data[0]data[1]data[2]data[3])data[4]){// 数据准确把数据存到之前定义的“小盒子”里DHT11_Data-humidity_intdata[0];DHT11_Data-humidity_decdata[1];DHT11_Data-temp_intdata[2];DHT11_Data-temp_decdata[3];DHT11_Data-check_sumdata[4];return0;// 读取成功返回0}else{return1;// 校验失败数据可能出错了}}3. 主函数调用示例main.c让整个系统跑起来写完驱动代码最后一步就是在主函数里“指挥”它们工作让STM32定期读取DHT11的数据。#includestm32f10x.h#includedelay.h#includedht11.hintmain(void){DHT11_DataTypeDef dht11_data;// 创建一个“数据盒子”用来存温湿度// 系统初始化给STM32“开机设置”时钟、延时这些都要提前弄好SystemInit();delay_init();// 初始化延时函数必须要有不然计时不准DHT11_GPIO_Init();// 初始化DHT11的引脚做好准备while(1)// 无限循环让系统一直工作{// 读取温湿度数据DHT11采样周期至少1秒别读太频繁哦if(DHT11_Read_Data(dht11_data)0){// 读取成功这里可以加打印代码或者把数据用到其他地方// 举个例子现在的湿度是dht11_data.humidity_int %温度是dht11_data.temp_int ℃}else{// 读取失败可以加个提示或者让系统重试}delay_ms(2000);// 每隔2秒读取一次既高效又不会累到传感器}}三、实操小提醒这些坑千万别踩延时函数是“灵魂”us级延时一定要精准差几微秒就可能导致通信失败要是自己写不好可以找现成的延时库引脚别接错一定要根据自己的硬件修改头文件里的引脚定义接错了传感器根本没反应别频繁读取DHT11的采样周期至少1秒频繁读取会让传感器“罢工”2秒读一次是比较稳妥的选择校验不能少数据校验是判断数据是否准确的关键少了这一步可能会拿到错误的温湿度值。其实STM32驱动DHT11真的没有那么难核心就是摸清它们的“沟通时序”再跟着代码一步步操作。只要把引脚接对、延时精准小白也能轻松实现温湿度采集 赶紧拿出你的电子元件跟着教程试试吧

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询