基于单片机的温湿度测量系统Word格式文档下载.docx
《基于单片机的温湿度测量系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的温湿度测量系统Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
![基于单片机的温湿度测量系统Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/ef71a757-69db-41ef-b832-7dc49c4fe9a7/ef71a757-69db-41ef-b832-7dc49c4fe9a71.gif)
传感器模块是用DHT11温湿度传感器,通过DHT11测出当前温湿度值,并且将采集到的数据传输给单片机。
通过单片机STC89C52的处理让LCD1602液晶显示温湿度的值。
我把LCD1602显示设置成分两行显示,第一行显示湿度,第二行显示温度。
1.4.3总体构成
1.4.3.1总体设计框图
按照本设计功能的要求,在保证实现的功能下,尽量减少本设计成本。
总体设计方案围绕上述思想,初步确定设计的方案如图1.1所示。
图1.1系统总体设计
如图1.1所示,系统由微处理器模块、DHT11传感器模块、LCD1602液晶显示模块组成。
1.4.3.2总体设计工作进程
本次设计用到LCD1602和DHT11。
LCD1602液晶经常用到,而DHT11传感器没怎么使用过,因此先解决LCD1602液晶显示问题然后再解决DHT11传感器部分。
整个流程图如图1.2所示
用Proteus仿真
分析题目查找资料
进行液晶显示调试
进行传器调试
完成
图1.2整体设计流程图
2系统的硬件设计
2.1硬件原理图
2.2主控模块设计
使用的时候将P0.0~P0.7口与LCD1602液晶显示的数据传输口相连,P3.3口作为与传感器DHT11的数据采集口相连。
2.2.1基本特性
Atmel公司的STC89C52系列单片机是我国近10年来使用较多的单片机,特别是高校实验室开发实验装置多数都采用它。
因为在21世纪初,在我国电子市场上,STC89C52技术资料丰富,货源充足,价格相对便宜,专营教学仪器单片机总和开发实验装置的科技公司也都青睐它。
STC89C52是一种内带4KB闪存的ROM、低电压、高性能CMOS制造工艺的8位单片机。
它具有MCS-51的所有特性。
STC89C52单片机的软件编程既可以用汇编语言,也可以用C51高级语言。
2.2.2STC89C52组成部分
AT89C51内部的基本组成主要包括:
①中央处理器CPU;
②内部4KBFlashROM,这是用来存放程序、数据等一些东西;
③内部256个RAM单元,通常用户使用低128位单元,主要用来存放和读写数据,而高128位单元系统则是用来分配21个特殊功能寄存器的;
④两个16位的定时器/计数器,即T0、T1;
⑤4个8位的I/0口,即P0、P1、P2、P3;
⑥一个全双工串行口,即RXD、TXD;
⑦5个中断系统,包括2个外部中断、2个定时器/计数器中断以及1个串行通信中断;
2.2.3STC89C52参数
①.属于增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择
②.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
③.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
④.用户应用程序空间为8K字节
⑤.片上集成512字节RAM
⑥.具有EEPROM功能
⑦.有3个16位定时器/计数器。
即定时器T0、T1、T2
⑧.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
⑨.PDIP封装
2.2.4引脚说明
①、电源及时钟引脚
⑴电源引脚:
Vcc是运行和程序校验时接电源+5V,Vss是电源接地端GND
⑵时钟引脚:
XTAL1是片内振荡器反相放大器的输入端和内部时钟工作的输入端,采用内部振荡器时,接外部石英晶体和微调电容的一个引脚。
XTAL2是片内振荡器反相放大器的输出端,接外部石英晶体和微调电容的另一端,当采用外部振荡器时,该引脚是空。
、控制引脚
1ALE/PROG:
地址锁存允许/编程线。
2PSEN:
外部程序存储器ROM的读选通线。
3EA/VPP:
片外ROM允许访问端/编程电源端。
4RST:
复位输入端,大于2个机器周期的高电平脉冲信号有效。
2.2.5复位电路设计
下图是按键手动复位,只要将键按下,RST为高电平,复位有效。
2.2.6外部晶振室之中电路设计
STC89C52振荡电路端可由内部软件编程来控制启停,使系统进入低功耗状态。
外部谐振电路并行连接石英晶体或陶瓷谐振器XTAL和负载电容C11、C12。
对外接电容的值虽然没有严格的要求,但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振的快速性。
外接晶体时。
C11、C12的值常选33pF左右;
在外陶瓷谐振器时,C11、C12的典型值约为47pF。
在设计印刷电路板时,晶体或陶瓷振荡器和电容应尽可能靠近单片机安装,以减少寄生电容,更好地保证振荡器稳定可靠地工作。
为了提高温度稳定性,应采用温度稳定性好的电容。
晶体振荡器可在1.2~12MHz之间选择,电容可在5~60pF之间选择,电容C11、C12的大小对振荡器的频率有微小影响。
2.3DHT11传感器模块设计
2.3.1DHT11传感器简介
本次设计采用DHT11数字温湿度传感器,这个产品有4个引脚封装,1脚用来接电源,2脚接单总线,3脚悬空或不使用,4脚接地。
它的内部还包含着一个电阻式感应湿度的元件和一个测量温度的元件,并且可以与一个性能高的8位单片机相连接。
DHT11具有功耗低、体积小的优点,使其可以适应各种应用场合。
2.3.2DHT11引脚说明
Pin
名称
类型
注释
1
VCC
电源
供电3V-5.5VDC
2
Dout
输出
单总线、串行数据
3
NC
空
空脚
4
GND
地
电源地
2.3.3DHT11传感器指标特性
DHT11性能指标和特性如下:
工作电压范围:
3.5V~5.5V。
工作电流:
平均0.5mA。
湿度测量范围:
20~90%RH。
温度测量范围:
0~50℃。
湿度分辨率:
1%RH8位。
温度分辨率:
1℃8位。
采样周期:
1S。
单总线结构。
与TTL兼容(5V)。
2.3.4DHT11数据结构
DHT11数字温湿度传感器采用单总线数据格式。
即单个数据引脚端口完成输入输出双向传输。
其数据包由5Byte(40Bit)组成。
数据分小数部分和整数部分,具体格式在下面说明。
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据
+8bit校验和
传感器数据输出的是位编码的二进制数据。
数据(湿度、温度、整数、小数)之间应该分开处理。
2.3.5DHT11传输时序
①、DHT11开始发送数据流程
主机发送开始信号后,延时等待20us-40us后读取DHT11的回应信号,读取总线为低电平,说明DHT11发送相应信号,DHT11发送相应信号后,再把总线拉高,准备发送数据,每一bit数据都以低电平开始,格式见上图所示。
如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。
②、主机复位信号和DHT11响应信号
③、数字‘0’信号表示方法
④、数字‘1’信号表示方法
2.3.6DHT11典型电路连接
DHT11典型应用电路如下图所示,它的连接电路比较容易,只需要用一个MCU的I/O口就能完成连接。
推荐其连接线的长度在20米以内时使用5K左右的上拉电阻,而大于20米时就要根据实际情况选择合适的电阻。
使用3.5V电压供电时连接线长度不得大于20cm。
否则线路压降会导致传感器供电不足,造成测量偏差。
每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取两次,但不建议连续多次读取传感器,每次读取传感器间隔大于5秒即可获得准确的数据。
2.3.7DHT11传感器模块电路设计
DHT11传感器连接单片机比较简单,将DHT11的Pin2(2脚)接单片机P3.3口。
由于测量范围电路小于20米,则在传感器的Pin2接一个5K的上拉电阻到电源正极。
DHT11传感器的电源端口Pin1和Pin4分别接电源的正负极,第三脚悬空放置。
DHT11传感器元件的电路原理图如下所示。
2.4LCD1602液晶显示模块设计
2.4.1LCD1602液晶显示屏简介
LCD1602是一种支持字母、数字、符号等显示的点阵型液晶模块,由32个5*7点阵字符位组成,每一个点阵字符位都可以显示一个字符。
LCD1602主要技术参数
2.4.2LCD1602液晶引脚说明
管脚号
管脚名称
状态
管脚功能描述
VSS
VDD
电源正极
VO
液晶显示偏压信号
RS
输入
寄存器选择
5
R/W
读、写操作
6
E
使能信号
7
DB0
三态
数据总线0(LSB)
8
DB1
数据总线1
9
DB2
数据总线2
10
DB3
数据总线3
11
DB4
数据总线4
12
DB5
数据总线5
13
DB6
数据总线6
14
DB7
数据总线7(MSB)
15
LEDA
背光+5V
16
LEDK
背光地
2.4.3LCD1602液晶显示模块
液晶模块如下图所示,第3脚加了一个10K的电位器,该电位器是用来调节LCD1602液晶显示的对比度,通过电位器调节Vo的电压值,使人们可以清楚看见LCD1602液晶上所显示的数值。
3仿真软件简介
3.1Proteus软件
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
他主要就是用来仿真电路,以及仿真单片机及其外围器件,它是目前最好的仿真单片机及外围器件的工具。
其特点是:
实现了单片机仿真和通用模拟电路仿真器相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成系统的仿真功能。
有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
支持主流单片机系统的仿真。
如68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
提供软件调试功能,在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时还可以观察各个变量、寄存器等的当前状态,支持第三方的软件编译和调试环境,如Keil4等软件。
支持大量的外围芯片和存储器,具有强大的原理图绘制功能。
总而言之,该软件是一款集单片机和通用模拟电路仿真器分析于一身的仿真软件,功能极其强大。
在Proteus中绘制好原理图连接号线路后,调入已经编译好的.HEX文件,就可以在Proteus的原理图中看到模拟的实物运行状态和过程。
3.2Keil软件
keiluvision4软件是KEIL公司的产品。
在使用的时候打开Keil4界面,首先要新建一个工程,保存一个名字,然后选择芯片,本设计所用的单片机是AtmelAT89S52,在编写完程序后点击编译,没有错误的话选择“OptionsforTarget‘Target1’”,在该窗口下,将晶振的频率(Xtel(MHz))设置为12MHz,然后选择“Output”在“CreateHEXFile”前面打钩,OK。
在继续编译后出现“createhexfilefrom…”,编译完成,此时文件就可以被单片机识别应用,导入即可。
4系统的软件设计
4.1总体程序框架流程图
对于本次设计我先建立程序框架流程图,然后对整个设计划分模块,逐个实现各个模块功能,然后把各个模块连接起来并构成总程序。
开始
初始化
温湿度检测传送回单片机
LCD1602液晶显示数据
延时
4.2软件程序代码
#include<
reg52.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineuint8unsignedint
#include"
lcd1602.h"
DTH11.h"
config.h"
voidmain()
{
ucharbuff[16];
lcd_init();
while
(1)
{
DTH11();
sprintf(buff,"
SHIDU:
%c%c.%cRH"
buf[0],buf[1],buf[2]);
DisText(0x80,buff);
WENDU:
%c%c.%cC"
buf[3],buf[4],buf[5]);
DisText(0xc0,buff);
delay1ms(20);
}
}
#ifndef__DTH11__H__
#define__DTH11__H__
externucharbuf[6];
/************************************************
延时1ms的延时函数
************************************************/
externvoiddelay1ms(uchari);
DHT11操作总时序时序函数
voidDTH11(void);
#endif
sbitP3_3=P3^3;
ucharu8flag;
ucharcomdata;
ucharRHdata_H_temp,RHdata_L_temp,Tdata_H_temp,Tdata_L_temp,checkdata_temp;
ucharRHdata_H,RHdata_L,Tdata_H,Tdata_L,checkdata;
ucharbuf[6];
voiddelay1ms(uchari)
{
ucharj;
for(;
i>
0;
i--)
for(j=0;
j<
27;
j++);
延时10us的延时函数
voiddelay10us(void)
uchari;
for(i=6;
i--);
DHT11读取一字节数据时序函数
voidcomread(void)
uchari,tem;
for(i=0;
i<
8;
i++)
u8flag=2;
while((!
P3_3)&
&
(u8flag++));
//等待50us时间过去
delay10us();
//延时差不多30us
tem=0;
if(P3_3)//如果是高地平则tem=1;
{
tem=1;
u8flag=2;
while((P3_3)&
//等待70us时间过去
if(u8flag==1)break;
comdata<
<
=1;
//左移一位
comdata|=tem;
//与tem相与
}
else
{
comdata<
comdata|=tem;
voidDTH11(void)
uchartemp;
P3_3=0;
//拉低总线为低电平
delay1ms(180);
//拉低时间为至少18ms
P3_3=1;
//拉高总线为高地平
delay10us();
//拉高时间为20us~40us
if(!
P3_3)
//等待80us的低电平时间过去
while((P3_3)&
//等待80us的高地平时间过去
comread();
//读取数据的函数
RHdata_H_temp=comdata;
//读取数据的RH的高位
RHdata_L_temp=comdata;
//读取数据的RH的低位
Tdata_H_temp=comdata;
//读取数据温度的高位
Tdata_L_temp=comdata;
//读取数据温度的地位
checkdata_temp=comdata;
//读取数据最后一位是校验位
P3_3=1;
temp=(RHdata_H_temp+RHdata_L_temp+Tdata_H_temp+Tdata_L_temp);
if(temp==checkdata_temp);
RHdata_H=RHdata_H_temp;
RHdata_L=RHdata_L_temp;
Tdata_H=Tdata_H_temp;
Tdata_L=Tdata_L_temp;
checkdata=checkdata_temp;
buf[0]=(uchar)(0x30+RHdata_H/10);
//把十六进制数值转换成十进制
buf[1]=(uchar)(0x30+RHdata_H%10);
buf[2]=(uchar)(0x30+RHdata_L/10);
buf[3]=(uchar)(0x30+Tdata_H/10);
buf[4]=(uchar)(0x30+Tdata_H%10);
buf[5]=(uchar)(0x30+Tdata_L/10);
#ifndef__LCD1602__H__
#define__LCD1602__H__
/****************************************************************************
*名称:
lcd_init()
*功能:
lcd初始化函数
****************************************************************************/
voidlcd_init(void);
DisText()
显示文本函数
externvoidDisT