59、基于51单片机的温湿度控制系统

毕设帮助、开题指导、技术解答(有偿)见文末。

目录

摘要

1、方案选择

单片机的选择

显示器选择方案

2、主控模块设计

单片机引脚介绍

单片机最小系统

一、硬件方案

二、设计功能

三、实物图

四、原理图

五、PCB图 

六、Protues仿真

七、程序

部分代码

八、资料包括


摘要

温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、化工等各类工业中广泛需要对温度湿度的检测与控制。并且随着人们生活水平的提高,人们对自己的生存环境越来越关注。而空气中温湿度的变化与人体的舒适度和情绪都有直接的影响,所以对温度湿度的检测及控制就非常有必要了。

随着科技的飞速发展和普及,高性能设备越来越多,各行各业对温湿度的要求也越来越高。传统的温湿度检测模式是以人为基础,依靠人工轮流值班,人工巡回查看等方式来测量和记录环境状况信息。在这种模式下,不仅效率低不利于人才资源的充分利用,而且缺乏科学性,许多重大事故都是由人为因素造成的,人工维护缺乏完整的管理系统。而问世监控系统就可以解决这样人才资源浪费,管理不及时的问题,这是由于它的智能化设计所决定的。故本次设计对于类似项目还具有普遍意义。

关键词:单片机,温度传感器,湿度传感器

1、方案选择

单片机的选择

方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的8K程序存储器是FLASH工艺的,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护我们的劳动成果。再者,AT89C52目前的售价比8031还低,市场供应也很充足。AT89C52可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于8K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需lOms。AT89C51芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。PO口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。

方案二:STC89C52系列单片机的指令系统和AT89C52系列的完全兼容,但实际操作起来却存在很多问题:

(1)AT89C52不带ISP下载,要用下载器才行,STC89C52可以用你的USB转串口下载,下载软件可以到STC厂家网上去下。

(2)STC单片机执行指令的速度很快,大约是AT的3-30倍,尽管快是好事,但这样一来,你在AT上好使的程序在STC上不一定好用,最典型的例子就是那些对时序有严格要求的模块,用STC时注意得加长延时,大约是AT的10—30倍就差不多,这一点自己调试就知道了。

(3)STC单片机对工作环境的要求比较低,电压低于5伏时仍然正常工作,甚至3伏到4伏之间都还可以工作,然而这样的环境下AT肯定不行了,所以当一个系统用STC单片机好用,但用AT的单片机不工作时,直接查最小系统,看单片机的供电是否正常。

比较这两种方案,由于在学校期间学过数字电路、单片机原理、C语言程序设计,综合考虑单片机的各部分资源和作为学生能够获得的资源,经过对比此次设计要求,我选择用STC系列芯片完成。而且学校也提供了相应的硬件操作平台,实际操作起来比较方便,故STC为更合理的选择。本系统选择STC89C52单片机作为主控芯片。足够本设计运行,且价格便宜,下载程序方便。

传感器的选择
方案一:选用DS18B20温度传感器作为温度检测模块。DS18B20是一线式数字温度传感器。具有独特的单线式接口方式。测量范围在—55℃~125℃,—10℃~85℃,误差范围在-\+0.5℃。最高精度可达0.0625℃。

HS1101是电容式湿度传感器。可测量相对湿度范围在0%~100%RH。误差为-\+2%RH。

方案二: 选用DHT11作为设计的温湿度检测模块。DHT11是一款集成型的数字温湿度一体传感器。

 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。测量范围20%~90%RH,0℃~50℃。测温精度为-\+2℃,测湿精度为-\+5%RH。完全符合本次毕业设计的要求。

经上述分析,方案一虽然精度更精确。却稍显复杂。方案二即便不能实现方案一的高精度测量。却也能满足设计要求。且简便易行。可靠稳定。具有超高的性价比。故选择方案二。

​​​​​​​显示器选择方案

方案一:采用12864液晶显示屏。液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。

方案二:采用LCD1602液晶显示屏。LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。1602只能显示字母、数字和符号能显示16*2个字符,但寄存器不止32个,有一些显示效果,如字符一个个显示、字符从左到右或从右到左显示等等,显示效果简单。

总结:在编程使用方面,两者难度差不多,原理差不多,都是写指令、写地址、写数据等等。当然12864液晶屏显示更全面、字符更多。相比于1602液晶屏、12864能更形象具体的实现显示功能。不过1602液晶屏也能实现设计的要求。网上买比较廉价,最低的六块钱左右。而12864液晶显示屏最便宜的也要四十块钱。从造价方面考虑,当然是价格低廉的优先。而LCD1602A就是最好的选择。

2、主控模块设计

单片微型计算机是随着微型计算机的发展而产生和发展的。自从1975 年美国德克萨斯仪器公司的第一台单片微型计算机( 简称单片机)TMS-1000 问世以来,迄今为止,单片机技术已成为计算机技术的一个独特分支,单片机的应用领域也越来越广泛,特别是在工业控制中经常遇到对某些物理量进行定时采样与控制的问题,在仪器仪表智能化中也扮演着极其重要的角色。

如果将8位单片机的推出作为起点,那么单片机的发展历史大致可以分为以下几个阶段:

第一阶段(1976—1978):单片机的探索阶段。以Intel公司的MCS-48为代表。MCS-48的推出是在工控领域的探索,参与这一探索的公司还有Motorola、Zilog等。都取得了满意的效果。这就是SCM的诞生年代,“单片机”一词即由此而来。

第二阶段(1978—1982):单片机的完善阶段。Intel公司在MCS-48基础上推出了完善的、典型的单片机系列MCS-51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。

(1)完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有多机通信功能的串行通信接口。

(2)CPU外围功能单元的集中管理模式。

(3)体现工控特性的地址空间及位操作方式。

(4)指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。

第三阶段(1982—1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。Intel公司推出的MCS-96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。

第四阶段(1990—):微控制器的全面发展阶段。随着单片机在各个领域全面、深入地发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。

单片机是在集成电路芯片上集成了各种元件的微型计算机,这些元件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时/计数器、中断系统、时钟部件的集成和I/O接口电路。由于单片机具有体积小、价格低、可靠性高、开发应用方便等特点,因此在现代电子技术和工业领域应用较为广泛,在智能仪表中单片机是应用最多、最活跃的领域之一。在控制领域中,现如今人们更注意计算机的底成本、小体积、运行的可靠性和控制的灵活性。在各类仪器、仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,提高计算机的运算速度,简化仪器仪表的硬件结构,提高其性能价格比。

​​​​​​​单片机引脚介绍

单片机主要特点:

(1)有优异的性能价格比。

(2)集成度高、体积小、有很高的可靠性。单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性和抗干扰能力。另外,其体积小,对于强磁场环境易于采取屏蔽措施,适合在恶劣环境下工作。

(3)控制功能强。为了满足工业控制的要求,一般单片机的指令系统中均有极丰富的转移指令、I/O口的逻辑操作以及位处理功能。单片机的逻辑控制功能及运行速度均高于同一档次的微机。

(4)低功耗、低电压,便于生产便携式产品。

(5)外部总线增加了I2C(Inter-Integrated Circuit)及SPI(Serial Peripheral Interface)等串行总线方式,进一步缩小了体积,简化了结构。

(6)单片机的系统扩展和系统配置较典型、规范,容易构成各种规模的应用系统。

优异的性能价格比。

1)集成度高、体积小、有很高的可靠性。

单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。另外,其体积小,对于强磁场环境易于采取屏蔽措施,适合于在恶劣环境下工作。

此外,程序多采取固化形式也可以提高可靠性。

2)控制功能强。

为了满足工业控制要求,一般单片机的指令系统中均有极丰富的转移指令、I/O口的逻辑操作以及位处理功能。单片机的逻辑控制功能及运行速度均高于同一档次的微机。

单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。

   VCC:STC89C52电源正端输入,接+5V。

GND:电源地端。

XTAL1:  单芯片系统时钟的反相放大器输入端。

XTAL2: 系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。

RESET:STC89C52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

EA/Vpp:"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。

ALE/PROG:ALE是英文"Address Latch Enable"的缩写,表示地址锁存器启用信号。STC89C52可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为STC89C52是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。

PSEN:此为"Program Store Enable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。STC89C52可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。

PORT0(P0.0~P0.7):端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。

PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当做一般I/O端口使用外,若是在STC89C52扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。

PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。

PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。

其引脚分配如下:

P3.0:RXD,串行通信输入。

P3.1:TXD,串行通信输出。

P3.2:INT0,外部中断0输入。

P3.3:INT1,外部中断1输入。

P3.4:T0,计时计数器0输入。

P3.5:T1,计时计数器1输入。

P3.6:WR:外部数据存储器的写入信号。

P3.7:RD,外部数据存储器的读取信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。​​​​​​​

单片机最小系统

单片机芯片内还有一项主要内容就是并行I/O口。STC89C51共有4个8位的并行I/O口,分别记作P0、P1、P2、P3。每个口都包含一个锁存器、一个输出驱动器和输入缓冲器。实际上,它们已被归入专用寄存器之列,并且具有字节寻址和位寻址功能。在访问片外扩展存储器时,低8位地址和数据由P0口分时传送,高8位地址由P2口传送。在无片外扩展存储器的系统中,这4个口的每一位均可作为双向的I/O端口使用。

单片机的4个I/O口都是8位双向口,这些口在结构和特性上是基本相同的,但又各具特点。

STC89C51单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。在单片机内部有一振荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在5-30pF,典型值为30pF。晶振CYS的振荡频率范围在1.2-12MHz间选择,典型值为12MHz和11.0592MHz。

当在STC89C51单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。

复位电路通常采用上电自动复位和按钮复位两种方式。最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R取1KΩ。除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经过电阻与电源Vcc接通而实现的。

一、硬件方案

本系统采用51单片机+液晶LCD1602显示屏+DHT11温湿度传感器+按键+继电器+蜂鸣器+LED灯设计而成。

二、设计功能


1. 单片机型号:STC89C52/51、AT89C52/51、AT89S52/51 都可通用
 
2.产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。
 
3.采集LCD1602液晶显示温度和湿度值,报警参数可以同时显示出来,直观明了。

4.有4个报警指示灯,分别代表温度过高、温度过低、湿度过高、湿度过低。

5.可以设置温度和湿度的上下限报警范围,并具有掉电保存功能,保存在STC单片机内部,上电无需重新设置。

6.当DHT11测出来的温湿度超出设置的范围时,蜂鸣器会报警,同时对应的报警指示灯会变亮。

7.DHT11传感器湿度测量范围:10%~95%RH;温度测量范围:0~50℃;

三、实物图

四、原理图

五、PCB图 

六、Protues仿真

七、程序

 

部分代码

/********************独立按键程序*****************/
uchar key_can;	 //按键值
 
void key()	 //独立按键程序
{
	key_can = 0;                //按键值还原成0
 	if(key1 == 0 || key2 == 0 || key3 == 0)		//有按键按下 
	{
		delay_1ms(1);	     	//按键延时消抖动
		if(key1 == 0)		//确认是按键按下
			key_can = 3; 	//得到按键值 
		if(key2 == 0)		//确认是按键按下
			key_can = 2; 	//得到按键值 
		if(key3 == 0)		//确认是按键按下
			key_can = 1; 	//得到按键值 
	}
}
 
/****************按键设置函数***************/
void key_with()
{
	if(key_can == 1)	   //设置键
	{
		menu_1 ++;
		if(menu_1 > 4)
		{
			menu_1 = 0;	  //menu_1 = 0 退出设置了,在正常显示界面下
			init_1602();  //lcd1602初始化显示 			
		}
	}
	if(menu_1 == 1)			//设置温度上限报警值 
	{
		if(key_can == 2)   //加键 
		{
			t_high ++ ;		//设置温度上限报警值 加1 	
			if(t_high > 99)
				t_high = 99;
		}
		if(key_can == 3)	//减键 
		{
			t_high -- ;		//设置温度上限报警值 减1 	
			if(t_high <= t_low)
				t_high = t_low + 1;	 //限制温度上限不能低于温度下限
		}
		write_lcd2(1,8,t_high);	   //显示上限报警值
		write_com(0x80+8);         //将光标移动到第1行第8位
		write_com(0x0f);           //显示光标并且闪烁	
	}	
	if(menu_1 == 2)			//设置温度下限报警值 
	{
		if(key_can == 2)	//加键
		{
			t_low ++ ;			//设置温度下限报警值 加1 
			if(t_low >= t_high)
				t_low = t_high - 1;	  //限制温度下限不能高于温度上限
		}
		if(key_can == 3)	//减键 		 
		{
			t_low -- ;			//设置温度下限报警值 减1 
			if(t_low <= 1)
				t_low = 1;
		}
		write_lcd2(1,13,t_low);   //显示温度下限报警值	
		write_com(0x80+13);         //将光标移动到第1行第13位
		write_com(0x0f);          //显示光标并且闪烁	
	}
	if(menu_1 == 3)			//设置湿度上限报警值
	{
		if(key_can == 2)	//加键
		{
			s_high ++ ;		//设置湿度上限报警值加1 	
			if(s_high > 99)
				s_high = 99;
		}
		if(key_can == 3)	//减键 
		{
			s_high -- ;		//设置湿度上限报警值减1 	
			if(s_high <= s_low)
				s_high = s_low + 1;	   //限制湿度上限不能低于湿度下限
		}
		write_lcd2(2,8,s_high);	   //显示湿度上限报警值
		write_com(0x80+0x40+8);    //将光标移动到第2行第8位
		write_com(0x0f);           //显示光标并且闪烁	
	}	
	if(menu_1 == 4)			//设置湿度下限报警值
	{
		if(key_can == 2)	//加键
		{
			s_low ++ ;			//设置湿度下限报警值 加1 
			if(s_low >= s_high)
				s_low = s_high - 1;	  //限制湿度下限不能高于湿度上限
		}
		if(key_can == 3)	//减键		
		{
			s_low -- ;			 //设置湿度下限报警值 减1 
			if(s_low <= 1)
				s_low = 1;
		}
		write_lcd2(2,13,s_low);	     //显示湿度下限报警值
		write_com(0x80+0x40+13);     //将光标移动到第2行第13位
		write_com(0x0f);             //显示光标并且闪烁	
	}		
} 
 
/*****************读温湿度传感器程序****************/
void dht11_dis()
{
	uchar i,j;			 
	dht11 = 0;	   //DHT11端口复位,发出起始信号 
	delay_1ms(20);
	dht11 = 1;
	delay_uint(4);	  
	if(dht11 == 0)	  //判断是否响应    
	{
		while(dht11 == 0);	  //等待低电平时间过完
		while(dht11 == 1);	  //等待高电平时间过完
		for(i=0;i<5;i++)
		{
			for(j=0;j<8;j++)
			{
				table_dht11[i] <<= 1;  //数据左移一位低位自动补0
				while(dht11 == 0);  //等待低电平时间过完
				delay_uint(4);	    //数据1的高电平时间 
				if(dht11 == 1)
				{
					table_dht11[i] |= 0x01;
					while(dht11 == 1);	  //等待高电平时间过完

八、资料包括

需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网盘下载地址及提取码。

  • 5
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冠一电子设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值