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. 社区儿童计算机活动总结,社区亲子活动总结
  2. XTU 1243 2016
  3. C++中四种类型转换方式
  4. ntext在mysql_varchar和text说不清的那些事
  5. mysql 优化配置参数(my.cnf)
  6. 养老不用愁,这种机器人可以让老年人自主地进行日常生活
  7. MySql 入门.md
  8. gimp 架构_常见GUI 框架
  9. HDU 1257 最少拦截系统 简单DP
  10. python3生成exe文件_python3.7打包成exe就三步
  11. 打造全能网管——网吧常用工具软件介绍
  12. 游戏开发bug解决思路
  13. 中国工程院院士倪光南:政府应加大核心技术市场化引导
  14. 25岁,一个北漂程序员,如果不想35 岁被淘汰,请把它当成一种信仰!
  15. python处理excel多重筛选
  16. PS 不能使用移动工具 因为目标图层被隐藏怎么办
  17. 视频号的播放量和互动率、完播率密不可分
  18. python爬虫-网易云音乐的歌曲热评
  19. ​雷军辟谣拒投腾讯阿里:想1000万收购网易,丁磊拒了;Gitlab 禁止使用 Windows | EA周报...
  20. 递推最小二乘估计Matlab仿真

热门文章

  1. 自己开发html组态软件教程,《前端开发》第二节:10天教你学会用Html和CSS写简单网页...
  2. 富士施乐复复印机网络连接说明
  3. 用Javascrip写出selelct下拉菜单效果
  4. 七年级上册计算机工作计划,七年级信息技术教学工作计划
  5. Photoshop Dreamweaver CS4 错误148:3解决方案
  6. SQL语句中字段的拼接
  7. springboot家庭财务管理系统、
  8. 基于java网上订餐网站系统
  9. 简述Guitar Pro的音色库
  10. 在现代意义上的电子计算机还未出现,2013年青海政法干警笔试真题解析:言语分析(7)...