STM32/51单片机实训day8——基于Keil5+Proteus8使用DHT11温度传感器实现温湿度采集并在LM016L液晶屏上显示
目录
任务指导
1 DHT11产品概述
2 应用领域
3 传感器性能说明
4 接口说明
5 电源引脚
6 串行接口(单线双向)
通讯过程如图3所示:
任务实现
内 容:本任务使用DHT11温度传感器实现基本的端口配置、初始化时序。
学 时:3
知识点:DHT11温度传感器介绍、工作原理、编码
重 点:DHT11工作原理、编码
难 点:编码
时间:2022年12月28日 9:00~11:50
任务指导
1 DHT11产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
2 应用领域
►暖通空调
►测试及检测设备
►汽车
►数据记录器
► 消费品
►自动控制
►气象站
►家电
►湿度调节器
►医疗
►除湿器
3 传感器性能说明
4 接口说明
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻,如图1。
图1 接口说明
基于典型应用电路,温湿度传感器电路设计如图2。其中DHT11的DATA引脚连接到STM32的PA1引脚上。
图2 温湿度传感器电路设计
5 电源引脚
DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
6 串行接口(单线双向)
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。
操作流程如下:一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验。数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。
通讯过程如图3所示:
图3 通讯
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
任务实现
在工程templates/user目录下,新建dht11.c文件。编写DHT11端口初始化及初始化时序、读写时序部分。
void Delay_us( __IO u32 nTime )
{ TimingDelay = nTime; // 使能滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;while( TimingDelay != 0 );}
//DHT11端口输出模式配置
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 ); }static void DHT11_Mode_IPU(void)
//DHT11-DATA引脚变为上拉输入模式
{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); }static void DHT11_Mode_Out_PP(void)
//DHT11-DATA引脚变为推挽输出模式
{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); }
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{ /*输出模式*/DHT11_Mode_Out_PP();/*主机拉低*/macDHT11_Dout_0;/*延时18ms*/Delay_ms(18);/*总线拉高 主机延时30us*/macDHT11_Dout_1; 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;}elsereturn ERROR;}
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 即下面的延时 */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;}
int main(void)
{uint8_t temp_hum_buffer[5] = {0};led_init(); // LED初始化usart_init(); // USART初始化
dht11_init(); // DHT11初始化while (1){if(dht11_read_temp_hum(temp_hum_buffer) == 1){printf("Temp: %d.%d Hum: %d.%d\n\r", temp_hum_buffer[2], temp_hum_buffer[3], temp_hum_buffer[0], temp_hum_buffer[1]);}else{printf("error!\n\r");}delay();delay();delay();delay();}
}
STM32/51单片机实训day8——基于Keil5+Proteus8使用DHT11温度传感器实现温湿度采集并在LM016L液晶屏上显示相关推荐
- STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计
目录 1 ULN2003A步进电机简介 2 步进电机电路设计 3 旋转角度控制函数 4 程序设计 motor.c motor.h 前期LCD参考文章: 内 容:编程实现控制步进电机 ...
- STM32/51单片机实训day6(一)——Proteus8.6版本+STM32F103驱动LCD12864显示|Keil5单片机程序设计
内 容:实现LCD显示 学 时:4学时 知识点:LCD12864芯片介绍,读写操作时序,电路设计 重点: 读写操作时序 难点:读写操作时序 时间:2022年12月26日 9:00-11:50 总结 ...
- STM32/51单片机实训day3——点亮LED灯、闪烁LED灯(一)理论
内 容:编写代码实现LED灯的点亮功能 学 时:2学时 知识点:分析原理图.LED灯控制原理 重点:GPIO参数配置.LED原理图分析 难点:编写 GPIO参数配置函数.LED点亮函数 时间:20 ...
- 51单片机c语言学习感想,51单片机实训心得体会
[www.hywsbj.com--心得体会] 单片机实训有哪些心得体会呢?下面是小编为大家收集的资料,欢迎阅读哦. 51单片机实训心得体会 通过为期一周的单片机实训,是我们对这门课有了许多新的了解,弥 ...
- 单片机c51语言实训总结,大学生51单片机实训心得体会
<大学生51单片机实训心得体会>由会员分享,可在线阅读,更多相关<大学生51单片机实训心得体会(1页珍藏版)>请在人人文库网上搜索. 1.大学生51单片机实训心得体会实践是检验 ...
- 51单片机实训项目之“万年历”代码原理详解
一.原理图 二.芯片器件 STC89C52 DS18B20(温度传感器) DS1302(时钟芯片) LCD1602液晶显示 独立按键 杜邦线 三.仿真图 四.程序代码详解 (一).子程序 EEPROM ...
- 利用c51进行数模转换并在液晶屏上显示_基于C51单片机的智能计算器、矩阵键盘、lcd1602...
目录 1绪论.............................................................................................. ...
- 利用c51进行数模转换并在液晶屏上显示_51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)...
本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ------------- ...
- 51单片机实训(一)————基于Proteus的光控小夜灯
文章目录 前言 一.项目概述 1.1 系统概述 1.2 功能设计 二.项目硬件设计 2.1 AT89C51单片机最小系统 2.2 外设电路 三.项目软件设计 3.1 程序代码设计 四.项目调试与分析 ...
最新文章
- Python字符串截取值
- matlab 转换图片格式,Matlab实现图片格式转换 pgm转jpg等
- handler和thread之间如何传输数据_换机必备知识:如何将数据转移到Oppo手机上
- java 抽象类与接口的区别及其在jdk中的应用
- 台达EH3系列PLC与温控器的MODBUS RTU通信例程
- Drools规则引擎使用入门
- Mikrotik ROS软路由设置上网方式(三)
- 动态内存分配算法:首次适应算法,循环首次适应算法,最坏适应算法,最佳适应算法实现
- 服务器seo优化,百度SEO优化服务器选择是什么?
- 二十六 .ajax登录 认证 验证码(session)
- WGS84与GCJ02、BD09经纬度坐标转换介绍
- 数学里上凹,下凹,上凸,下凸
- String Ioc简介
- php安全新闻早八点-高级持续渗透-第二季关于后门补充一
- 【力扣题解】面试题 10.11. 峰与谷
- 鸿蒙系统卸载预装,鸿蒙系统怎么退回安卓 鸿蒙系统怎么卸载
- 逆元 与等比数列求和
- 传奇怎么修改服务器启动天数,传奇服务端加入有天数会员系统方法
- autojs非按键精灵怎么做游戏脚本,来,给你游戏识图点击实例
- 汇编语言——学习资料(更新........)