
文章目录1. 引言2. DHT11简介3. DHT11引脚4. DHT11的工作原理5. DHT11单片机显示温湿度5.1 参考代码5.2 运行效果6. 总结1. 引言很多同学的毕业设计中都用到了温湿度传感器故在此文中我也简单提及不求优秀但求不拖后腿。2. DHT11简介DHT11是一款含有校准数字信号输出的温湿度复合传感器可实现温湿度一体检测。内部包含一个电阻式感湿元件和一个NTC测温元件用于检测温度和湿度并与一个高性能低功耗8位微处理器相连接把温度和湿度值转换成数字量输出。每个DHT11传感器都在极为精确的湿度校验中进行校准校准系数以程序的形式存在OTP内存中传感器内部在检测信号的处理过程中要调用这些校准系数。主要参数如下测量范围湿度5~ 95%RH温度-20~ 60℃测量精度湿度 ± 5%RH温度 ± 2℃分辨率湿度1%RH 温度0.1℃供电电压3.3~5.5V输出信号数字信号单总线结构供电电流待机0.06mA低速模式测量1.0mA高速模式3. DHT11引脚引脚定义如下VDD供电引脚电压范围为3-5.5V为传感器提供工作所需的直流电源。DATA串行数据输出引脚单总线输出已校准的数字信号用于输出温度和湿度数据。NC悬空未使用。GND接地引脚电源的负极用于完成电路的接地保证设备的正常工作。4. DHT11的工作原理DHT11检测环境温湿度得到的数据由40位二进制编码组成包括湿度和温度的整数部分和小数部分以及一个校验和。具体数据格式如下湿度整数数据8位、湿度小数数据8位、温度整数数据8位、温度小数数据8位、校验和8位。校验和数据是通过将前四个字节湿度整数数据、湿度小数数据、温度整数数据、温度小数数据相加得到的末8位。5. DHT11单片机显示温湿度温湿度传感器 DHT11程序控制单片机温湿度显示LCD128645.1 参考代码#includereg52.h#includeabsacc.h//定义绝对地址访问#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbit DataP3^6;//定义DHT11数据线uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;voiddelayms(uint);voiddelayus10(void);voidDHT11_start();//给DHT11发送起始型号ucharDHT11_rec_byte();//接收DHT11一个字节voidDHT11_receive();//接收DHT11的40位数据// LCD2864 常量定义#definelcdrow0xc0//常量初始行#definelcdpage0xb8//常量初始页#definelcdcolumn0x40//常量初始列#definec_page_max0x08//常量最大页#definec_column_max0x40//常量最大列//LCD12864 端口定义#definebusP0sbit rstP2^0;sbit eP2^1;sbit rwP2^2;sbit rsP2^3;sbit cs1P2^4;sbit cs2P2^5;voidselect(uchar);voidsend_cmd(uchar);voidsend_data(uchar);voidclear_screen(void);voidinitial(void);voiddisplay_zf(uchar,uchar,uchar,uchar);voiddispaly_hz(uchar,uchar,uchar,uchar);uchar code table_zf[]{// 0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9)0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0,0*/0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*1,1*/0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2,2*/0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*3,3*/0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*4,4*/0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*5,5*/0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*6,6*/0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*7,7*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8,8*/0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*9,9*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00/*:,10*/};uchar code table_hz[]{// 温(0) 度(1) 湿(2) 度(3) :(4)0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*温,0*/0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*度,1*/0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,/*湿,2*/0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00/*度,3*/};//定义延迟函数voiddelayus10(void)// 延迟10us{uchar i5;while(--i);}voiddelayus(uchar n)// 延迟10us{while(--n);}voiddelayms(uint j)// 延迟ms{uchar i250;for(;j0;j--){while(--i);i249;while(--i);i250;}}// 定义DHT11 驱动函数voidDHT11_start(){Data1;delayus(2);Data0;delayms(30);//延迟18ms以上Data1;delayus(30);}ucharDHT11_rec_byte()//接收DHT11 一个字节{uchar i,dat0;for(i0;i8;i){while(!Data);//等待50us低电平过去delayus(8);// 延迟60us,如果还为高则数据为1否则为0 【疑似时间不一致】dat1;if(Data1)dat1;while(Data);// 等待数据线拉低;}returndat;}voidDHT11_receive(){DHT11_start();if(Data0){while(Data0);delayus(40);R_HDHT11_rec_byte();R_LDHT11_rec_byte();T_HDHT11_rec_byte();T_LDHT11_rec_byte();reviseDHT11_rec_byte();delayus(25);if((R_HR_LT_HT_L)revise){RHR_H;RLR_L;THT_H;TLT_L;}}}voidselect(uchar cs){if(cs0){cs10;cs20;}elseif(cs1){cs10;cs21;}else{cs11;cs20;}}voidsend_cmd(uchar cmd){rs0;rw0;buscmd;delayus10();e0;e1;e0;}voidsend_data(uchar dat){rs1;rw0;busdat;delayus10();e0;e1;e0;}voidclear_screen(void){uchar c_page,c_column;select(0);for(c_page0;c_pagec_page_max;c_page){send_cmd(c_pagelcdpage);send_cmd(lcdcolumn);for(c_column0;c_columnc_column_max;c_column){send_data(0x00);}}}voidinitial(void){rst0;delayms(10);rst1;select(0);clear_screen();send_cmd(lcdrow);send_cmd(lcdcolumn);send_cmd(lcdpage);send_cmd(0x3f);}voiddisplay_zf(uchar c_page,uchar c_column,uchar num,uchar offset){uchar c1,c2,c3;for(c10;c1num;c1){for(c20;c22;c2){for(c30;c38;c3){send_cmd(lcdpagec_pagec2);send_cmd(lcdcolumnc_columnc1*8c3);send_data(table_zf[(c1offset)*16c2*8c3]);//delayms(100);}}}}voiddisplay_hz(uchar c_page,uchar c_column,uchar num,uchar offset){uchar c1,c2,c3;for(c10;c1num;c1){for(c20;c22;c2){for(c30;c316;c3){send_cmd(lcdpagec_pagec2);send_cmd(lcdcolumnc_columnc1*16c3);send_data(table_hz[(c1offset)*32c2*16c3]);//delayms(100);}}}}voidmain(){initial();while(1){DHT11_receive();select(1);display_hz(6,0,2,0);display_zf(6,32,1,TH/10);display_zf(6,40,1,TH%10);select(2);display_hz(6,0,2,2);display_zf(6,32,1,RH/10);display_zf(6,40,1,RH%10);}}5.2 运行效果6. 总结介绍了 DHT11 温湿度传感器的基本原理、引脚定义与数据通信格式并给出了基于 51 单片机与 LCD12864 显示屏的完整参考代码。通过该示例读者可以掌握 DHT11 单总线时序的读取方法以及 LCD12864 的汉字与数字显示驱动流程为毕业设计或日常实验中的温湿度采集与显示需求提供了一套可直接移植的解决方案。