LCD1602与DHT11温湿度的使用

在下面编写过程中,学了模块化的编程思想,在后面的学习过程中更应该多使用模块化编写,不仅仅书写代码规范 效率执行也高。

一、理解LCD1602原理

1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符,所以简称1602。它是一种专门用来显示字母、数字、符号的点阵型液晶模块

它是由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。

VL是液晶显示偏压信号,当感觉屏幕过暗或过亮是可以调节此电压来调整亮度
RS是高电平是是数据选项,是低电平是命令选项
R/W 是高电平是读操作,是低电平是写操作
E是使能信号
D0 ~ D7是数据I/O口,单片机可以往传数据来让液晶显示不同的数据
BLA是背光源正极(A表示正),BLK是背光源负极(K表示负极),如果没背光数据是难以看清的

常用命令

输入命令是0x01RS是低电平是输入的命令R/W低电平表示写入清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII码 20H;清完屏光标归位,即将光标撤回液晶显示屏的左上方将地址计数器(AC)的值设为 0,就是最走上角那个

二、DHT11温湿度的了解

简介

DHT11作为一款低价、入门级的温湿度传感器,常用于我们的单片机设计实例中;它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
DHT11为 4 针单排引脚封装,如下图,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

数据格式

8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

8位校验和
“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”相加所得结果的末8位。

控制时序

要实现对DHT11传感器的控制和数据的读取,需先学会分析DHT11的控制时序。时序主要分为三部分:1:触发DHT11采集数数据;2:读取数字0;3:读取数字1;。
(1)触发DHT11采集数据
总线空闲状态为高电平,单片机把总线拉低等待DHT11响应,单片机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。
当DHT11接收到单片机的开始信号后,等待单片机开始信号结束,然后发送80us低电平响应信号。
单片机发送开始信号结束后,延时等待20-40us后,切换为输入状态,等待DHT11的80us低电平信号结束,然后判断DHT11是否是否发出 80us 的高电平;如果是,即可开始采集数据。

LCD1602头文件模块化

#ifndef _LCD1602_H_
#define _LCD1602_H_typedef unsigned char u8;
typedef unsigned int u16;void   LCD_Delay1ms();//延时函数void LCD_WriteCommand(u8 Command);//写指令函数void LCD_WriteData(u8 Data);//写数据函数void LCD_Init();//LCD初始化函数void LCD_ShowChar(u8 Line ,u8 Columu,u8 Char);//显示当个字符void LCD_ShowString(u8 Line ,u8 Columu,u8 *String); //显示字符串void LCD_SetCursor(u8 Line ,u8 Columu);//设置字符显示位置int  LCD_Pow(int x,int y);//判断输入的数字是多少位void LCD_ShowNum(u8 Line,u8 Columu,u16 Number,u8 Length); //显示数字
#endif

LCD1602函数代码

#include<REG51.H>
#include"LCD1602.h"
#include<INTRINS.H>sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;#define LCD_DataPort P0void    LCD_Delay1ms()//@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}//дָÁî  µÍµçƽvoid LCD_WriteCommand(u8 Command)
{LCD_RS = 0; //设置指令模式LCD_RW = 0; //写模式LCD_DataPort = Command; //传入数据LCD_E = 1;LCD_Delay1ms();LCD_E = 0;LCD_Delay1ms();
}//дÊý¾Ývoid LCD_WriteData(u8 Data)
{LCD_RS = 1; //ÉèÖÃÖ¸ÁîģʽLCD_RW = 0; //ÉèÖÃдģʽLCD_DataPort = Data; //дָÁîLCD_E = 1;LCD_Delay1ms();LCD_E = 0;LCD_Delay1ms()  ;}//³õʼ»¯lcd
void LCD_Init()
{LCD_WriteCommand(0x38);  //配置八位数据接口LCD_WriteCommand(0x0c);   //显示开 光标关LCD_WriteCommand(0x06);   //光标加1 ,画面不动LCD_WriteCommand(0x01);    //清屏}//ÉèÖùâ±êº¯Êý
void LCD_SetCursor(u8 Line ,u8 Columu)
{if(Line==1){LCD_WriteCommand(0x80 |(Columu -1));}else{LCD_WriteCommand(0x80 |(Columu -1) + 0x40);}}
//ÏÔʾ×Ö·û
void LCD_ShowChar(u8 Line ,u8 Columu,u8 Char)
{LCD_SetCursor(Line,Columu);LCD_WriteData(Char);}//дÈë×Ö·û´®void LCD_ShowString(u8 Line ,u8 Columu,u8 *String)
{u8 i;LCD_SetCursor(Line,Columu);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}//ÏÔʾ´Î·½º¯Êý
int  LCD_Pow(int x,int y)
{u8 i,result =1;for(i=0;i<y;i++){result *= x;}return result;
}//ÏÔʾÊý×Öº¯Êý
void LCD_ShowNum(u8 Line,u8 Columu,u16 Number,u8 Length)
{u8 i;LCD_SetCursor(Line,Columu);for(i=Length; i>0 ;i--){LCD_WriteData('0'+Number/ LCD_Pow(10,i-1)%10);}
}

DHT11头文件

#ifndef _DHT11_H_
#define _DHT11_H_void DTH11_Delay_us(u8 n);void  DTH11_Delay_ms(u8 n);void DTH11_START();  //起始信号u8 DTH11_rec_Byte();//接受一个字节void DTH11_rec_Temp_Data(); //接受温湿度数据void  InitUart(void); //使用定时器1,作为串口波特率#endif

DHT11代码

#include<REG51.H>
#inlcude"DTH11.h"sbit Temp_data = P3^6;typedef unsigned char u8;
typedef unsigned int u16;u8 rec_dat[4];
u8 rec_dat_lcd0[6];
u8 rec_dat_lcd1[6];
u8 rec_dat_lcd2[6];
u8 rec_dat_lcd3[6];//ÑÓʱusvoid DTH11_Delay_us(u8 n)
{while(n--);}//延时函数void  DTH11_Delay_ms(u8 n)
{u8 i,j;for(i=0;i<n;i++){for(j=0;j<110;j++);}
}//ÆðʼÐźÅvoid DTH11_START()
{Temp_data = 1;   //高电平先维持一小段时间DTH11_Delay_us(2);  //2usTemp_data = 0;  // 拉低DTH11_Delay_ms(20);  //至少18msTemp_data = 1;DTH11_Delay_us(13);}//½ÓÊÜÒ»¸ö×Ö½Úº¯Êýu8 DTH11_rec_Byte()
{u8 i,Data;for(i=0;i<8;i++){while(!Temp_data);  /等待低电平过去DTH11_Delay_us(8); //延时8us 如果还是 高电平则为1Data<<=1;if(Temp_data==1){Data+=1;}while(Temp_data);  //等待拉低 准备下一位}return Data;
}//接受温湿度数据void DTH11_rec_Temp_Data()
{u16  R_H,R_L,T_H,T_L;u8 RH,RL,TH,TL,revise;DTH11_START();  //主机发送信号Temp_data = 1;  if(Temp_data == 0)  //判断DHT11是否进入响应{while(Temp_data == 0);   //等待低电平DTH11_Delay_us(40);  //µÈ´ý40usR_H=DTH11_rec_Byte();  //接受湿度高八位R_L=DTH11_rec_Byte();  //接受湿度低八位T_H=DTH11_rec_Byte();   //接受温度高八位T_L=DTH11_rec_Byte();    //接受温度低八位revise =DTH11_rec_Byte();   //接受校验位DTH11_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  InitUart(void) //使用定时器1
{SCON = 0x40;  //串口通信方式1 REN = 1;   //允许串口接受TMOD = 0x20;   //配置寄存器 定时器1TH1 = 0xF3;TL1 = 0xF3;  //配置波特率TI = 1;TR1 = 1;
}

主函数

#include<REG51.H>
#include"LCD1602.h"
#include"DHT11.h"
#include"stdio.h"extern  u8 rec_dat[4];
extern  u8 rec_dat_lcd0[6];
extern  u8 rec_dat_lcd1[6];
extern  u8 rec_dat_lcd2[6];
extern  u8 rec_dat_lcd3[6];void main()
{DTH11_START();LCD_Init();LCD_ShowString(1,0,"Humi");LCD_ShowString(2,1,"Temp£º");while(1){DTH11_Delay_ms(150);DTH11_rec_Temp_Data();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]);DTH11_Delay_ms(150);//显示湿度LCD_ShowString(1,6,rec_dat_lcd0);LCD_ShowString(1,8,".");LCD_ShowString(1,9,rec_dat_lcd1);LCD_ShowString(1,10,".");//显示温度LCD_ShowString(2,6,rec_dat_lcd2);LCD_ShowString(2,8,".");LCD_ShowString(2,9,rec_dat_lcd3);LCD_ShowString(2,10,".");}
}

上述只是记录自己的学习过程,有错的欢迎各位大佬指正 。

LCD1602与DHT11温湿度的使用相关推荐

  1. 4. 51 测量空气的温度和湿度(51单片机 + DHT11温湿度 + LCD1602显示)

    51单片机 + DHT11温湿度 + LCD1602显示 DHT11温湿度相关介绍 DHT11产品概述 测量范围 接口说明 电源引脚 串行接口 (单线双向) 相关时序及代码 用代码实现上述时序图(起始 ...

  2. 基于51单片机+DHT11温湿度+LCD1602显示

    DHT温湿度1602显示 DHT11温湿度相关介绍 DHT11产品概述 1.测量范围 2.接口说明 3.电源引脚 4.串行接口 (单线双向) 5.相关时序及代码 6. DHT11引脚说明 程序代码 m ...

  3. Arduino “学生寝室”门禁管理(红外遥控+舵机+无源蜂鸣器+DHT11温湿度传感器+LCD1602+LED灯)

    一.项目要求描述 通过红外接收模块接收指令,将红外接收的引脚模式设置为输入,通过红外遥控器的按键"1~5"向其输入指令.编写代码,使得Arduino UNO控制板及相关传感器实现& ...

  4. 传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)

    作者:GWD 时间:2019.06.26 DHT11温湿度传感器(单总线类) 一. 学习要点: 1.(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因 ...

  5. DHT11温湿度传感器(详细)

    DHT11温湿度传感器--使用LCD1602显示 先上效果图,以及简单的和室内温度对比图,相交而言测量的值还是非常准的. 我的这个做的很简陋,大家可以理解原理后自行升级. 注意学习单片机最重要的就是学 ...

  6. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  7. DHT11温湿度传感器初识

    目录 一.产品概述 1.接线方式 2.特点 3.数据传送逻辑 二.发送时序检测模块是否存在 1.C51单片机(主机)时序分析 2.编写代码检测模块是否存在 3.读取DHT11数据的时序分析 三.温湿度 ...

  8. 基于51单片机的DHT11温湿度检测

    系统提供2种工作模式,在显示模式中:1.显示温湿度2.超出温湿度限定的范围时蜂鸣器,LED实现报警3.加减温度时显示标志:在设置模式中:分别设置温湿度上下限 硬件:单片机AT89C52,液晶LCD16 ...

  9. 51单片机 DHT11温湿度传感器 MQ2传感器

    目录 前言 程序思路 DHT11 一.DHT11基础储备 二.接口说明 三.协议及数据格式 ​编辑 四.DHT11代码 MQ-2烟雾传感器 一.MQ-2烟雾传感器介绍 二.工作原理 三.时序配置 四. ...

最新文章

  1. .svn文件夹_新建SVN仓库并上传项目
  2. 27_Notification
  3. 基于intellij和meavn的整合开发struts2框架的web程序
  4. Windoes上安装(升级)虚拟化VMware Workstattion Pro软件、序列码激活软件
  5. 利用cx_Freeze将py文件打包成exe文件(图文全解)
  6. 《软件测试方法和技术》,《软件测试方法和技术》.ppt
  7. 转:springboot servlet使用配置
  8. 上海交大研究生计算机考研真题,2011年上海交通大学计算机研究生机试真题
  9. mysql5.7+proxy_mysql 5.7+mysql-proxy 0.8.5 读写分离
  10. 【SPI】java基础之SPI框架实现
  11. 11-8 热点key的重建优化
  12. mysql拼接两字段查询
  13. php7使用什么缓存,PHP7 opcache缓存清理问题
  14. access如何保存小数点后_如何设置石材雕刻机原点及断电后怎么保存原点坐标?...
  15. 微信小程序实现蓝牙开门前后端项目(一)
  16. After 500:写500篇博客其实和写一篇是一样的
  17. 嵌入式软件未来发展趋势
  18. 百度经验-怎么进入系统故障恢复控制台
  19. java模拟魔兽世界武器掉落
  20. 2022年打工人转行实录!你后悔转行了吗?

热门文章

  1. 西安交通大学计算机组成实验报告,西安交通大学实验报告
  2. 如何从 Android 手机恢复丢失的联系人
  3. php 超出整形范围,频率超出范围怎么办
  4. c语言把数字转换为字母,c语言输入数字变成字母
  5. 怎样把d盘改成c盘!如何把收藏夹和桌面的路径设成D盘
  6. Android实现自定义铃音
  7. 次世代建模是什么?学到什么程度才能接单赚钱
  8. 全球及中国激光粉尘传感器行业投资前景与运营潜力研究报告2022版
  9. DayDayUp:2021,再见了,无论是躺平还是内卷—愿大家改变不可接受的,接受不可改变的—心若有向往,何惧道阻且长
  10. 智能车浅谈——过程通道篇