使用DHT11和51单片机进行温度的读取。

1、DHT11

DHT11是非常用的温湿度传感器。其共有4个引脚,实物图网上一大把,这里就不放了,分别是VCC供电,串行单总线,NC空脚悬空就行,最后便是GND。

2、时序图

  1. ​​​​​​​​​​​​​​这是它从低功耗状态转换高速状态的时序,

从IO口输出至少18ms(不超过30ms)的低电平它就会工作了,外部低电平结束后它会输出83us的低电平作为响应信号,之后输出87us的高电平让单片机做好接收信号的准备.

响应信号时序​​​

2、87us高电平结束后将会接受40bit的数据那么对于dht11的单总线来说何为1何为0呢?它定义在87us高电平结束后会有54us的低电平,如果这54us低电平后有23到27us的高电平则为0,54us低电平后有68到74us的高电平则为1.

时序图如下:

最后是我们喜闻乐见的源码:

头文件。

#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
//#define LCD1602_4PINS/**********************************
包含头文件
**********************************/
#include<reg51.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif/**********************************
PIN口定义
**********************************/
#define LCD1602_DB  P0      //data bus 数据总线
sbit LCD1602_RS = P2^3;
sbit LCD1602_RW = P2^4;
sbit LCD1602_EN = P2^5;     /**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
//void Lcd1602_Delay1ms(uint c);   //误差 0usvo
void LCD_Delay10ms(unsigned int c);
//void Read_Busy();           //忙检测函数,判断bit7是0,允许执行;1禁止
void Lcd1602_Write_Cmd(unsigned char cmd);     //写命令
void Lcd1602_Write_Data(unsigned char dat);   //写数据
void LcdSetCursor(unsigned char x,unsigned char y);  //坐标显示
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);     //显示字符串
void InitLcd1602();              //1602初始化#endif
/*******************************************************************************
* 实验名              :温度显示实验
* 使用的IO      :
* 实验效果       :1602显示温度
*   注意                   :*******************************************************************************/#include<reg51.h>
#include"lcd.h"
#include<intrins.h>
#include<stdio.h>sbit Temp_data=P2^0;
/*******************************************************************************
* 函数名         : main
* 函数功能         : 主函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
//定义
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned char z);
void DHT11_start();
unsigned char DHT11_rec_byte();
void DHT11_receive();
unsigned char rec_dat[16];//主函数
void main()
{InitLcd1602();while(1){DHT11_delay_ms(150);DHT11_receive();    LcdShowStr(0,1,&rec_dat);}
}//DHT11起始信号void DHT11_start()
{Temp_data=1;DHT11_delay_us(2);Temp_data=0;DHT11_delay_ms(20);Temp_data=1;DHT11_delay_us(13);}//接收一个字节unsigned char DHT11_rec_byte()
{unsigned char i,dat;for(i=0;i<8;i++){while(!Temp_data);//度过54us低电平DHT11_delay_us(16);//延时30us后判断高电平为1否则为零dat<<=1;if(Temp_data==1){dat+=1;}while(Temp_data);}return dat;}//接收温湿度数据
void DHT11_receive()
{unsigned int R_H,R_L,T_H,T_L;unsigned char RH,RL,TH,TL,revise;DHT11_start();
//  Temp_data=1;if(Temp_data==0)//接收83us的应答信号,{while(Temp_data==0);   //等待拉高现在data为1     while(Temp_data);//退出通知单片机接受信号R_H=DHT11_rec_byte();    //接收湿度高八位  R_L=DHT11_rec_byte();    //接收湿度低八位  T_H=DHT11_rec_byte();    //接收温度高八位  T_L=DHT11_rec_byte();    //接收温度低八位revise=DHT11_rec_byte(); //接收校正位DHT11_delay_us(25);    //结束if((R_H+R_L+T_H+T_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;} /*数据处理,方便显示*/rec_dat[0]='0'+(RH/10);rec_dat[1]='0'+(RH%10);rec_dat[2] =' ';rec_dat[3] = 'R' ;rec_dat[4] = 'H';rec_dat[5]=' ';rec_dat[6]=' ';rec_dat[7]=' ';rec_dat[8]=' ';rec_dat[9]='0'+(TH/10);rec_dat[10]='0'+(TH%10);rec_dat[11] =' ';rec_dat[12] = 'C';rec_dat[13] = ' ' ;rec_dat[14]=' ';}}//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{while(--n);
}//延时ms
void DHT11_delay_ms(unsigned char z)
{unsigned char i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);
}void Read_Busy()           //忙检测函数,判断bit7是0,允许执行;1禁止
{unsigned char sta;      //LCD1602_DB = 0xff;LCD1602_RS = 0;LCD1602_RW = 1;do{LCD1602_EN = 1;sta = LCD1602_DB;LCD1602_EN = 0;    //使能,用完就拉低,释放总线}while(sta & 0x80);
}void Lcd1602_Write_Cmd(unsigned char cmd)     //写命令
{//Read_Busy();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD_Delay10ms(1);LCD1602_EN = 1;LCD_Delay10ms(1);LCD1602_EN = 0;
}void Lcd1602_Write_Data(unsigned char dat)   //写数据
{Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD_Delay10ms(1);LCD1602_EN = 1;LCD_Delay10ms(1);LCD1602_EN = 0;
}
//指定位置开始显示数据!
void LcdSetCursor(unsigned char x,unsigned char y)  //坐标显示
{unsigned char addr;if(y == 0)addr = 0x00 + x;//第一行开始,x表示一行的第x个elseaddr = 0x40 + x;//第二行开始,x表示一行的第x个Lcd1602_Write_Cmd(addr|0x80);
}void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)     //显示字符串
{LcdSetCursor(x,y);      //当前字符的坐标while(*str != '\0'){Lcd1602_Write_Data(*str++);}
}void InitLcd1602()              //1602初始化
{Lcd1602_Write_Cmd(0x38);    //打开,5*8,8位数据Lcd1602_Write_Cmd(0x0c);Lcd1602_Write_Cmd(0x06);Lcd1602_Write_Cmd(0x01);    //清屏
}void LCD_Delay10ms(unsigned int c)   //误差 0us
{unsigned char a,b;for(;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);
}

proteus连接:

我会把源码和和Proteus工程放到这里。借鉴了好多大佬的欢迎交流

使用DHT11和51单片机进行温湿度的读取(保证好用版本)相关推荐

  1. 基于51单片机的温湿度检测及调节系统

    具体实现功能 系统由STC89C52单片机+AT24c02芯片+LCD1602液晶显示屏+继电器模块+按键模块+报警模块构成. 具体实现功能: 1.LCD1602液晶显示,第一行显示当前的温度和湿度, ...

  2. 基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真

    硬件设计 仿真图1: 该设计是基于51单片机的温湿度光强二氧化碳检测系统,由LCD1602作为显示器,温湿度采用的SHT11传感器,ADC采用的TLC2543,光强就是光敏传感器,气体检测这里采用的是 ...

  3. 实物设计|基于51单片机的温湿度检测报警系统

    目录 具体实现功能: 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能: 由STC89 ...

  4. 【Proteus仿真】51单片机+SHT11温湿度传感器+LCD1602显示

    [Proteus仿真]51单片机+SHT11温湿度传感器+LCD1602显示 Proteus仿真 主程序代码 /*-------------------------------SHT11湿度测量 -- ...

  5. 51单片机的温湿度控制系统

    硬件方案 本设计采用51单片机作为控制核心,每2秒钟从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示.液晶屏上同时显示温湿度上限值,该上限值保存外外部EEPROM存储器中,掉电不失,并且可 ...

  6. 51单片机检测温湿度并且上传到阿里云

    这个项目基于51单片机.ESP8266WiFi模块.温湿度DHT11传感器.阿里云来完成. 目录 1.项目构思 2.各模块的硬件连线及代码编写 2.1.dht11温湿度模块 2.1.1.dht11硬件 ...

  7. 基于51单片机的温湿度控制系统

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 1.方案选择 单片机的选择 显示器选择方案 2.主控模块设计 ​​​​​​​单片机引脚介绍 单片机最小系统 一.硬件方案 二.设计功能 三.实 ...

  8. 基于51单片机的温湿度测量电力载波通信(实物+原理图+PCB+全套资料)

    资料编号:085 采用51单片机,测量温湿度,通过电力载波协议将数据通过220V供电线传到电脑显示,具体功能请看下方演示视频,全套资料齐全 85-基于51单片机温湿度测量电力载波通信系统(源码+原理图 ...

  9. 51单片机之温湿度检测系统(DTH11、OLED、LCD1602)

    目录 LCD1602 LCD1602引脚 LCD1602显示字符 写时序图和读时序图 写时序图 检测忙标志是否忙 LCD1602初始化 在哪里显示,写入指令(地址) 显示什么字符(写入数据) DTH1 ...

最新文章

  1. 全中了!接手同事项目时最崩溃的事 | 每日趣闻
  2. 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践
  3. Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。
  4. QT配置OpenCV(二):成功
  5. Buffer与Cache
  6. 体验VMware Converter Client 6.2与Veeam BR 10迁移ESXi 6.0 vm到vCenter 6.7 u3
  7. 用超 7500 万的 GitHub 代码仓库实力解读:哪门编程语言热度最高?
  8. 小D课堂 - 零基础入门SpringBoot2.X到实战_第三节SpringBoot热部署devtool和配置文件自动注入实战_15、SpringBoot2.x配置文件讲解...
  9. dns服务器哪个稳定,几个非常好用的DNS服务器(解决电信DNS此劫问题) - 电脑技术,dns,ricky,...
  10. 有赞订单搜索AKF架构演进之路
  11. 服务器网卡驱动_教你星际蜗牛C款i211网卡服务器咋装Windows sevs2012R2服务器下
  12. Image-Line升级FL Studio21水果DAW音乐工作站
  13. 如何建设数据指标体系?
  14. 没上网也能使用QQ截图工具
  15. java 添加空格方法_java 各种去空格的方法
  16. 酷炫的 HTML5 网页 PPT
  17. 反町隆史和松岛菜菜子
  18. springboot+vue 审批工作流集成flowable(springboot实现工作流)
  19. 微信小程序开发【一】-- 初识小程序
  20. 枪火重生灵界狂潮攻略(七)猴子流派

热门文章

  1. 区块链知识系列 - BTC和ETH的区别
  2. 使用tb6612模块驱动直流电机
  3. 出发点不对,听再多道理也做不好管理
  4. 搜索引擎优化与信息检索有什么关联
  5. PS 学习笔记 15-橡皮擦工具组
  6. Springboot 项目学习
  7. python实现文字识别软件_文字识别(OCR)CRNN(基于pytorch、python3) 实现不定长中文字符识别...
  8. python小项目——2048小游戏(详解)
  9. python快速实现简易俄罗斯方块小游戏
  10. ★平衡法则在生活中的应用