C51单片机温湿度传感器DTH11使用
LCD1602显示温湿度传感器DTH11的温度与湿度。
DTH11简介:
DTH11实物
DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。
DHT11 的技术参数如下:
工作电压范围:3.3V -5.5V
工作电流 :平均 0.5mA
输出:单总线数字信号
测量范围:湿度 20~90%RH,温度 0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度 1%,温度 1℃
DHT11有效总线包含三条,VCC GND DAT,看起来与DS18B20类似,但是简单很多,不需要设置命令,只需要读取数据包就可以了,每次读取数据一共读取40个bit也就是五个字节,高位在前MSB五个字节分别是: 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据 +8bit校验和
注意事项:
1、DHT11上电后,要等待 1秒 以越过不稳定状态,在此期间不能发送任何指令。
2、DHT11属于低速传感器,两次通信请求之间的间隔时间不能太短,一般来说要不能低于1秒。
3、当前DHT11通信帧的小数部分默认都是0,厂商预留给以后实现。所以一般只读取整数值部分即可。校验和定义为:前4个Byte的总和的低8位。
电路原理图:
主函数:
#include <reg52.h>
#include <LCD1602.h>
#include <DTH11.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned intuchar wendu [4];
uchar sidu [4];
uchar i;
int j;
void main()
{//uchar i; InitLcd1602();LcdShowStr(2, 0, "sidu:");LcdShowStr(2, 1, "wendu:");while(1){ DHT11_delay_ms(100); DHT11_receive();for(i=0;i<7;i++) {if(i<=2){sidu[i]= rec_dat[i]; //读取湿度}else{wendu[i-4] = rec_dat[i];}}LcdWaitReady();//准备LCDLcdShowStr(10, 0,sidu);LcdShowStr(13, 0,"%");LcdShowStr(10, 1,wendu);LcdShowStr(12, 1," C");}
}
DTH11.h代码:
#define uchar unsigned char
#define uint unsigned intsbit Data=P1^6;
uchar rec_dat[9];
void DHT11_delay_us(uchar n)
{while(--n);
}
void DHT11_delay_ms(uint z)
{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);
}
void DHT11_start()
{Data=1;DHT11_delay_us(2);Data=0;DHT11_delay_ms(30); Data=1;DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{uchar i,dat=0;for(i=0;i<8;i++) { while(!Data); DHT11_delay_us(8); dat<<=1; if(Data==1) dat+=1;while(Data); } return dat;
}
void DHT11_receive()
{uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start();if(Data==0){while(Data==0); DHT11_delay_us(40); 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]=' ';//温度rec_dat[4]='0'+(TH/10);rec_dat[5]='0'+(TH%10); rec_dat[6]=' ';}
}
LCD1602.h代码:
#include <reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P2^2;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);void delay(unsigned int i)
{while(i--);
}
void LcdStar()
{unsigned char str[] = "QingYeMuRong";unsigned char tab[]="wendu = "; InitLcd1602();/* 初始化 1602 液晶 */LcdShowStr(2, 0, str);LcdShowStr(1, 1, tab);LcdShowStr(9, 1, "...");//默认初始化温度00LcdShowStr(14, 1, "C");//添加C温度}/* 等待液晶准备好 */
void LcdWaitReady()
{unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;} while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止
}
/* 向 LCD1602 液晶写入一字节命令, cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;
}
/* 向 LCD1602 液晶写入一字节数据, dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0;
}
/* 设置显示 RAM 起始地址,亦即光标位置, (x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{unsigned char addr;if (y == 0) //由输入的屏幕坐标计算显示 RAM 的地址addr = 0x00 + x; //第一行字符地址从 0x00 起始elseaddr = 0x40 + x; //第二行字符地址从 0x40 起始LcdWriteCmd(addr | 0x80); //设置 RAM 地址
}
/* 在液晶上显示字符串, (x,y)-对应屏幕上的起始坐标, str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{LcdSetCursor(x, y); //设置起始地址while (*str != '\0') //连续写入字符串数据,直到检测到结束符{LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1}
}
/* 初始化 1602 液晶 */
void InitLcd1602()
{LcdWriteCmd(0x38); //16*2 显示, 5*7 点阵, 8 位数据接口LcdWriteCmd(0x0C); //显示器开,光标关闭LcdWriteCmd(0x06); //文字不动,地址自动+1LcdWriteCmd(0x01); //清屏
}
效果截图:
C51单片机温湿度传感器DTH11使用相关推荐
- 基于51单片机温湿度传感器
DHT11 温湿度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调:汽车:消费品:气象站:湿度调节器:除湿器:家电:医疗:自动控制 相对湿度和温度 ...
- 51单片机温湿度传感器DHT11液晶显示屏显示LCE1602
主代码,还有个LCD1602的设置代码 #include<reg51.h> #include<intrins.h> #include<LCD1602.h> #def ...
- AM2120单总线温湿度传感器移植与应用
AM2120单总线温湿度传感器移植与应用 基于STC8G1K08单片机和AM2120温湿度传感器单总线接口技术移植与应用 作者: 郑贤亨 金建强 浙江省江山江汇电气有限公司 摘要:温湿度控制器在高低压 ...
- 【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器
目录 硬知识 DHT11 DHT22 通信协议 读取步骤 数据解读 DHT11 DHT22 示例程序 DHT11_22.c DHT11_22.h 测试程序 main.c 实验现象 DHT11 DHT2 ...
- STM8单片机读取DHT11温湿度传感器
DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似. 供电电压 3.3~5.5V DC 测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃ 测 ...
- 传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)
作者:GWD 时间:2019.06.26 DHT11温湿度传感器(单总线类) 一. 学习要点: 1.(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因 ...
- 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示
目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...
- STM32单片机硬件I2C读取AHT10温湿度传感器数据
STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...
- 【Proteus仿真】51单片机+SHT11温湿度传感器+LCD1602显示
[Proteus仿真]51单片机+SHT11温湿度传感器+LCD1602显示 Proteus仿真 主程序代码 /*-------------------------------SHT11湿度测量 -- ...
最新文章
- MEMS传感器作为变革的驱动力
- 2021 年高教社杯全国大学生数学建模竞赛A题分析
- 一个微笑,跨越73年:Deepfake「复活」以色列立国之战老照片
- travis-ci_使用Travis-CI的SpringBoot应用程序的CI / CD
- BZOJ 1137 半平面交
- LQR轨迹跟踪算法Python算法实现3
- 看KubeEdge携手K8S,如何管理中国高速公路上的10万边缘节点
- java单链表基本操作 一,Java_实现单链表-基本操作
- CentOS 6系统FreeSwitch和RTMP服务 安装及演示(三)
- SQL Server数据库 - 安装教程
- 暗影精灵4风扇转速调节_惠普暗影精灵2怎么调节风扇?
- 超声波传感器测距报警器
- DHT11温湿度传感器学习
- python列表相加
- 笨拙的手指(暴力枚举)
- 社保随便挂靠,会判刑罚款您知道吗?
- 联想拯救者y7000电池耗电快_联想拯救者Y7000游戏本测评之温度、续航双测评
- 监控系统 Prometheus 的说明
- spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效
- 【IoT】 产品设计:硬件产品设计流程ID与MD设计详解(二)