dht11:

DHT11数字湿温度传感器采用单总线数据格式。由单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。一次完整的数据传输为40bit,高位先出。数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。校验和数据为前四个字节相加。

用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主 机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后 转换到低速模式。

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必 须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束 后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换 到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉 高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定 了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有 响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。

数字0信号表示方法如下图所示

数字1信号表示方法如下图所示

dht11.h

#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"
#include "delay.h"#define DHT11_IO        GPIOA
#define DHT11_PIN       GPIO_Pin_1void GPIO_SETOUT(void);
void DHT11_Rst(void);
void GPIO_SETIN(void);
u8 DHT11_Check(void);
u8 DHT11_Init(void);
u8 DHT11_Read_Bit(void);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Data(u8 *h);
#endif

dht11.c

#include "dht11.h"
#include "delay.h"void GPIO_SETOUT(void){//输出模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DHT11_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_IO,&GPIO_InitStructure);
}
void DHT11_Rst(void){                 GPIO_SETOUT();                                            //配置成输出模式GPIO_ResetBits(DHT11_IO,DHT11_PIN); //拉低数据线delay_ms(20);                                           //拉低至少18msGPIO_SetBits(DHT11_IO,DHT11_PIN);     //拉高数据线 delay_us(30);                                       //主机拉高20~40us
}
void GPIO_SETIN(void){//输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DHT11_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(DHT11_IO,&GPIO_InitStructure);
}
u8 DHT11_Check(void){   u8 retry=0;GPIO_SETIN();           //设置为输入模式   while (GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//应答信号:DHT11先会拉低40~50us{retry++;delay_us(1);}if(retry>=100)return 1;else retry = 0;while (!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//应答信号:DHT11拉低后会再次拉高40~50us{retry++;delay_us(1);}if(retry>=100)return 1;//返回1通信失败return 0;//返回0通信成功
}
u8 DHT11_Init(void){DHT11_Rst();//发送开始信号return DHT11_Check();//检测DHT11的响应,返回为0初始化成功
}
u8 DHT11_Read_Bit(void){u8 retry = 0;while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变为低电平(等待Bit开始信号){retry++;delay_us(1);}retry = 0;while(!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变高电平(代表数据开始传输){retry++;delay_us(1);}delay_us(40);if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN)) return 1;else return 0;
}
u8 DHT11_Read_Byte(void){        u8 i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}  return dat;
}
u8 DHT11_Read_Data(u8 *h){        u8 buf[5];u8 i;DHT11_Rst();//端口复位,发出起始信号if(DHT11_Check()==0){//等待DHT11回应for(i=0;i<5;i++){//读取五位数据buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*h=buf[0];//湿度整数部分h++;*h=buf[1];//湿度小数部分h++;*h=buf[2];//温度整数部分h++;*h=buf[3];//温度小数部分}}else return 1;return 0;
}

main.c

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "dht11.h"u8 temp = 1,humi = 0;int main(void){  u8 DHT11_BUF[4]={0};uart_init(115200);delay_ms(500);DHT11_Init();delay_ms(1500);DHT11_Read_Data(DHT11_BUF);while(1){DHT11_Read_Data(DHT11_BUF);printf("\r\n humi:%02d.%02d temp:%02d.%02d",DHT11_BUF[0],DHT11_BUF[1],DHT11_BUF[2],DHT11_BUF[3]);delay_ms(1500);}}

串口输出结果:

STM32F103实现DHT11温湿度传感器的串口显示(标准库与keil)相关推荐

  1. Arduino之读取DHT11数字温湿度传感器并串口显示

    温度是表示物体冷热程度的物理量,微观上来讲是物体分子热运动的剧烈程度.温度只能通过物体随温度变化的某些特性来间接测量,而用来量度物体温度数值的标尺叫温标.它规定了温度的读数起点(零点)和测量温度的基本 ...

  2. 第八章 STM32+SGP气体传感器+DHT11温湿度传感器+OLED模块显示室内温湿度、二氧化碳和甲醛浓度

    在智能家居相关的物联网毕设中,少不了室内气体检测功能,比如检测烟雾,检测一氧化碳,检测甲醛等有害气体浓度,别人有的,我们也要有!所以本章给大家介绍一款气体传感器--SGP气体传感器,这款气体传感器能够 ...

  3. DHT11温湿度传感器(详细)

    DHT11温湿度传感器--使用LCD1602显示 先上效果图,以及简单的和室内温度对比图,相交而言测量的值还是非常准的. 我的这个做的很简陋,大家可以理解原理后自行升级. 注意学习单片机最重要的就是学 ...

  4. Arduino+DHT11温湿度传感器+12864oled显示温湿度

            本文利用arduino uno时时读取DHT11温湿度传感器的温度和湿度值,并将读取到的数值显示在OLED12864上. 元器件: arduino板 OLED12864显示屏 DHT1 ...

  5. Arduio ESP8266将DHT11温湿度传感器数据在网页上显示

    Arduio ESP8266将DHT11温湿度传感器数据在网页上显示

  6. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  7. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  8. Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据

    如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!! 目标 Android手机HC-05蓝牙连接Arduino nano获取DHT-11温 ...

  9. stc12c5a60s DHT11温湿度传感器

    DHT11温湿度传感器 DHT11.h #ifndef __DHT11_H__ #define __DHT11_H__#ifndef uchar #define uchar unsigned char ...

最新文章

  1. 【java】兴唐第十八节课
  2. 成功解决MSB8020 The build tools for v141 (Platform Toolset = ‘v141‘) cannot be found. To build using the
  3. dtree 无法出现横向滚动条 (clip)
  4. 图解WinCE6.0下的内核驱动和用户驱动
  5. ROS机器人程序设计(原书第2版)2.3 理解ROS开源社区级
  6. 新鲜出炉 | 临床基因组学数据分析实战开课啦!!!
  7. Linux 权限管理之基本权限
  8. 高效程序员的45个习惯の欲速则不达
  9. java.lang math 类
  10. http://kylin.apache.org/development/new_metadata.html
  11. java 换行符 ascii码_java换行怎么写
  12. Python爬虫五:微信公众号爬虫-2018.9
  13. Android以太网框架情景分析之NetworkManagementService和netd交互深入分析二
  14. 腾讯可信区块链方案白皮书 QA
  15. HashMap源码探究
  16. 数据结构实验教程-第一套
  17. FPGA电子设计系统的资源优化(面积优化)与速度优化
  18. 使用IDEA整合SpringMVC和Mybatis(SSM框架)(二)
  19. 业绩承压,竞争加剧,飞鹤困顿难飞
  20. mysql的收银软件_java swing mysql实现的超市收银进销存系统项目源码附带视频指导运行教程...

热门文章

  1. 22 行 JS 黑掉英国航空,38 万乘客受害;公有云被频繁用于 DDoS 攻击
  2. 没有契合的数据库迁移工具,用pymysql实现一个
  3. AD20无法铺铜的原因
  4. 2012年河北职称计算机操作题,2012年河北省职称计算机考试操作题及答案
  5. moonseo-占座:网站关键词多怎么做优化?
  6. 腾讯类Pinterest网站“读图.知天下” 上线,可用QQ账号登陆
  7. COB与COG各自优势
  8. tk1刷机+ROS安装+rplidar安装和配置+turtlebot安装和配置
  9. Linux内核高端内存管理
  10. Java OOP 第四章 抽象类和接口