DHT11温湿度LCD显示

Posted Heavy sea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DHT11温湿度LCD显示相关的知识,希望对你有一定的参考价值。

一、温湿度模块传感器介绍

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC 测温元件,并与一个高性能8位单片机相连接。


供电电压:3.3~5.5V 直流电
输出为单总线数字信号
温度测量范围0~50度(精度正负2度,分辨率1度)
湿度测量范围为20~90%RH(精度为正负5%,分辨率1%)

采用单总线双向串行通信协议,每次采集都要由单片机发起开始信号,然后DHT11会向单片机发送响应并开始传输40位数据帧,高位在前。

数据格式为:
第一二个字节: 8bit湿度整数数据+8bit湿度小数数据
第二三个字节: 8bit温度整数数据+8bit温度小数数据
第五个字节: 8bit校验位(它是前四个数据相加后八位的数值)
温湿度小数部分默认为0,即单片机采集的数据都是整数,校验位为4个字节的数据相加取结果的低8位数据作为校验和。

二、有关时序图

通讯过程:

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

输出数字0信号

输出数字1信号

三、示例代码

将温湿度数据显示到LCD1602屏幕上并打印信息到串口:

DHT11.c

#include <REGX52.H>
#include "DHT11.h"

sbit Temp_data = P1^0;
unsigned int rec_dat[4];

unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];


void DHT11_start()	
{
	Temp_data=1;
	DHT11_delay_us(2);
	
	Temp_data=0;
	DHT11_delay_ms(20);   // 至少拉低18ms	
	
	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);   // 等待低电平过去
		  DHT11_delay_us(8);	 // 延时8us若为高电平
			dat<<=1;
			if(Temp_data==1)
			{
				dat+=1;
			}
			while(Temp_data);		// 等待拉低,准备下一位
	}

	return dat;
}

void initUart()
{
	SCON = 0x40;
	REN = 1;
	TMOD = 0x20;
	TL1 = 0xFD;
	TH1 = 0xFD;
	
	TI = 1;       // 中断请求
	TR1 = 1;	
	
}

// 接收温湿度数据
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)
	{
		while(Temp_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]=RH;
        rec_dat[1]=RL;
        rec_dat[2]=TH;
        rec_dat[3]=TL;

	}
	
}


void DHT11_delay_us(unsigned char n)
{
    while(--n);
}


void DHT11_delay_ms(unsigned int z)
{
   unsigned int i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}


DHT11.h

#ifndef _DHT11_H_

#define _DHT11_H_
	void DHT11_start();
	unsigned char DHT11_rec_byte();
	void DHT11_receive();
	void DHT11_delay_us(unsigned char n);
	void DHT11_delay_ms(unsigned int z);
#endif

LCD.c

#include <REGX52.H>
#include "LCD.h"
#include <intrins.h>

sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;

#define LCD_data P0

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}


void LCD_Command(unsigned char command)
{
	LCD_RS = 0;			
	LCD_RW = 0;		
	LCD_data = command;
	LCD_E = 1;			
	Delay1ms();
	LCD_E = 0;
	Delay1ms();
}

void LCD_WriteData(unsigned char datas)
{
	LCD_RS = 1;			
	LCD_RW = 0;			
	LCD_data = datas;
	LCD_E = 1;			
	Delay1ms();
	LCD_E = 0;
	Delay1ms();
}

void LCD_init()
{
	LCD_Command(0x38);   
	LCD_Command(0x0c);	
	LCD_Command(0x06);  
	LCD_Command(0x01);	
}

void setCursor(unsigned char row,unsigned char column)
{
		if(row == 1){
		LCD_Command(0x80|(column-1));   // ¹â±êµØÖ·
	}else{
		LCD_Command(0x80|((column-1)+0x40));
	}
}


// 显示字符串
void LCD_show_string(unsigned char row,unsigned char column,unsigned char *string)
{	
	unsigned int i;
	setCursor(row,column);
	for(i=0;string[i]!='\\0';i++){
			LCD_WriteData(string[i]);
		}
}

LCD.h

#ifndef _LCD_H_
#define _LCD_H_
	void Delay1ms();
	void LCD_Command(unsigned char command);
	void LCD_WriteData(unsigned char datas);
	void LCD_init();
	void setCursor(unsigned char row,unsigned char column);
	void LCD_show_char(unsigned char row,unsigned char column,unsigned char Char);
	void LCD_show_string(unsigned char row,unsigned char column,unsigned char *string);
	int pow(unsigned int x,unsigned int y);
	void LCD_show_num(unsigned char row,unsigned char column,unsigned int num,unsigned int length);
#endif

main.c

#include <REGX52.H>
#include "LCD.h"
#include "DHT11.h"
#include <stdio.h>

extern unsigned int rec_dat[4];

extern unsigned char rec_dat_lcd0[6];
extern unsigned char rec_dat_lcd1[6];
extern unsigned char rec_dat_lcd2[6];
extern unsigned char rec_dat_lcd3[6];


void main()
{	
	LCD_init();
	LCD_show_string(1,1,"Humi:");
	LCD_show_string(2,1,"Temp:");
		
	while(1){
			TI = 0;
			initUart();
			
			DHT11_delay_ms(150);
			DHT11_receive();

			sprintf(rec_dat_lcd0,"%d",rec_dat[0]);
			sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
			sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
			sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
			DHT11_delay_ms(100);
		
			LCD_show_string(1,6,rec_dat_lcd0);
			LCD_show_string(1,8,".");
			LCD_show_string(1,9,rec_dat_lcd1);
			LCD_show_string(1,11,"%");
		
			LCD_show_string(2,6,rec_dat_lcd2);
			LCD_show_string(2,8,".");
			LCD_show_string(2,9,rec_dat_lcd3);
			LCD_show_string(2,11,"C");
			
	}
	
}

以上是关于DHT11温湿度LCD显示的主要内容,如果未能解决你的问题,请参考以下文章

DHT11温湿度LCD显示

51单片机 DHT11+ DS1302+LCD1602温湿度监测系统

51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真

51单片机 DHT11温湿度传感器LCD显示+串口打印+Proteus仿真

基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示

用arduino 制作温湿度计,利用LCD显示屏将温湿度显示在LCD显示屏上