室内温湿度控制系统报告汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
室内温湿度控制系统
设计报告
新电八队
室内温湿度控制系统
摘要:本文利用89C52单片机设计一个温室大棚的温湿度检测控制系统,对
室内的温湿度进行检测控制并实时显示。
其中温湿度传感器采用DHT11数字温湿度传感器,通过89C52单片机的处理把温湿度值显示在1602A液晶上。
并实时判断温湿度值是否满足设定的温湿度范围,若超出设定范圉,通过89C52启动温湿度控制系统,达到恒温恒湿的目的。
关键字:89C52; DHT11; 1602A液晶显示;温湿度控制系统
目录
摘要 (1)
1本系统主要研究内容 (3)
基本要求 (3)
1. 2发挥部分 (3)
2系统总体设计 (3)
系统的组成 (3)
系统的工作原理 (4)
3单元电路设计 (6)
单片机系统设计 (6)
传感器的设计 (8)
液晶显示装置设计 (9)
光声报警系统与温湿度控制系统设计................................ 错误!未定义书签。
温湿度系统设计 (13)
4软件设计 (14)
初始化模块 (14)
温湿度检测模块 (14)
温湿度判断控制模块 (15)
1602液晶显示模块 (15)
报警模块 (15)
系统整体软件程序 (16)
5系统测试 (16)
6总结 (17)
参考文献: (17)
附录 (18)
1本系统主要研究内容
设计一个室内温湿度检测装置,检测和显示室内的温度、湿度,并在温度、湿度超过设置的范围是采取相应的措施,使得温度达到设置的范围。
基本要求
(1)采集温度传感器数据,在显示器上显示室内的温度。
(2)采集湿度传感器数据,在显示器上显示室内的湿度。
(3)可以通过按键来设定LI标温度和湿度的范围。
发挥部分
(1)当温度和湿度超过设置的范圉时用蜂鸣器发出不同的声音报警,并且用LED灯指示是温度还是湿度超出了预设的范围。
(2)用两个电机模拟对温度和湿度的控制,当温度和湿度超出设置范圉时控制两个电机动作,调节温度和湿度达到预设的范围。
电机1正转(顺时针)表示加热,反转(逆时针)表示制冷。
电机2正转(顺时针)表示加湿,反转(逆时针)表示干燥。
(3)用电机的转速表示控制作用的强弱程度,并与温度、湿度的偏差大小相关。
2系统的总体设计
系统的组成
以单片机为控制核心,釆用温湿度测量,通信技术,控制技术等技术,以温湿度传感器作为测量元件,构成智能温湿度测量控制系统。
可分为温湿度测量电路,显示电路,声光报警电路,温湿度控制电路,选用的主要器件有:89C52, 温湿度传感器DHT11, 1602A显示模块,红绿口LED 灯,报警装置蜂鸣器等。
系统的工作原理
本系统以单片机89C52为核心,数据采集、传输、显示、报警都要通过单片机。
数据采集通过单总线的智能数字温湿度传感器DHT11完成;通过单片机把釆集的数据显示在1602A上;当采集的数据超出给定范围时,有蜂鸣器实时报警,并显示红灯提示,并进行相应的控制处理。
在整个系统中采用了DHT11单总线技术,单片机采用C语言编程。
・89C52作为中央控制装置,负责中心运算和控制,协调系统各个模块的工作。
•电机1反转:实现系统的降温工作。
・电机1正转:实现系统的加热工作。
•电机2正转:实现系统的加湿工作。
•电机2反转:实现系统的干燥工作。
•两盏灯,报警模块:负责系统的报警功能。
如果当前的温度超过用户设定的界限值时系统将自动报警,灯在单片机的控制下有规律的闪烁,同时报警模块发出报警声,通知用户釆取相应的措施。
系统丄作流程图
系统的匸作流程图
3单元电路设计
单片机系统设计
经过上面的总体方案和实施措施的讨论后可以开始着手硬件系统的设计,硬件系统是应用系统的基础、软件系统设计的依据
根据总体功能和性价比及其运行速度等因素的考虑,选用STC89C52为主机, 满足上面的要求而且设计方便,不需要再存储扩展。
STC89C52单片机概述
STC89C52是一种低功耗、高性能CM0S8位微控制器,具有8K在系统可编程Flash 存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k字节Flash, 512字节RAM, 32位I/O 口线,看门狗定时器,内置4KB EEPROM, MAX810复位电路,2个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89C52可降至OHz静态逻辑操作,支持2 种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz, 6T/12T 可选。
相关参数:1.工作电压:〜(5V单片机)
〜(3V单片机)
2.工作频率范围:0〜40MHz,相当于普通8051的0〜80MHz,实际工作频
率可达48MHz
3.用户应用程序空间为8K字节
4.片上集成512字节RAM
5.通用I/O 口(32个),复位后为:P0/P1/P2/P3是准双向口上拉,
P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用
时,需加上拉电阻。
6.ISP (在系统可编程)/IAP (在应用可编程),无需专用编程器, 无
需专用仿真器,可通过串口(RxD/,TxD/)直接下载用户程序,数秒即可完成。
7.具有EEPROM 功能
8.具有看门狗功能
9.共3个16位定时器/计数器。
即定时器TO、Tl、T2
10.外部中断4路,下降沿中断或低电平触发电路,Power Down模式
可由外部中断低电平触发中断方式唤醒。
11.通用异步串行口(UART),还可用定时器软件实现多个UART
12.工作温度范围:-40〜+85°C (工业级)/0〜75°C (商业级)
13.PDIP 封装
89C52引脚图
传感器的设计
DHT11产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程
中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用其至最为苛刻
的应用场合的最佳选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
典型应用电路
VDD供电3 —
DATA串行数据,单总线
NC空脚,请悬空
GND接地,电源负极
液晶显示装置设计
1602A是一种工业字符型液晶,能够同时显示16x02即32个字符。
下图为1602A 模块尺寸图
引脚接口说明
VSS 电源地9 D2数据
VDD 电源正极10 D3数据
VL 液晶显示偏压11 D4数据
RS 数据/命令选择12 D5数据
R/W 读/写选择13 D6数据
E 使能信号14 D7数据
DO 数据15 BLA 背光源正极
D1数据16 BLK 背光源负极
第1脚:VSS 为地电源。
第2脚:VDD 接5V 正电源。
笫3脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度 最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对 比度。
第4脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
笫5脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS 和R/W 共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W 为高电平时 可以读忙信号,当RS 为高电平R/W 为低电平时可以写入数据。
第6脚:E 端为使能端,当E 端山高电平跳变成低电平时,液晶模块执行命令。
2.50—
4.60一 8.00
----------- 80,00^0.5- ---------- 75.00±0.3- ---------- 70.80±0.3-
--------- 64 50<V.A>
--------- 5&20CA.AX
—38.10—
PITCH 25彳 —
01/>.8一
・
■O 7
1
11 0 0 in sp 4-02.50-^ 一40.00 ---------
—
」一; OIS
•寸「
I08MWI O
第7〜14脚:DO〜D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S: 屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:显示开关控制。
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示
5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8: DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接
收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H (不检测忙信号)
延时5mS
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏写指令06H:显示光标移动设置写指令OCH:显示开及光标设置
液晶显示原理
R/W
读操作时序
—
■
Valid Data
t
c
写操作时序
光声报警系统与温湿度控制系统设计
本系统采用绿口LED灯作为光报警提示,当系统检测到的数据符合给定的要求时,现场始终口绿灯不亮;当系统检测到的数据不符合给定的要求时,根据情况(温度超限口灯亮,湿度超限绿灯亮)报警提示;本系统采用蜂鸣器作为声报警提示,当系统检测到的数据符合给定的要求时,现场没有蜂鸣器报警提示;旳系统检测到的数据不符合给定的要求时,现场蜂鸣器报警提示。
温湿度控制系统
本系统温湿度控制系统主要组成有:电机1和电机2。
当系统检测到的数据不符合给定的要求时,系统启动温湿度控制系统实现恒温恒湿的U的。
•电机1反转:实现系统的降温工作。
・电机1正转:实现系统的加热工作。
•电机2正转:实现系统的加湿工作。
•电机2反转:实现系统的干燥工作。
温湿度检测电路
温湿度控制电路
4软件系统设计
本系统软件系统设计包括:系统初始化模块,温湿度检测模块,1602LCD显示模块,报警模块,温湿度判断控制模块。
系统软件总体流程图
JT女台/ 初
女台不匕
一丄…
沁曲丿竺
检沙!U
系统流程图
初始化模块
系统初始化模块的主要功能是完成系统的初始化以及设定系统的工作状态,初始化部分包括以下方面的内容:
4.1.1单片机初始化以及各种引脚定义。
1602液晶初始化及工作方式。
4. 1. 3系统进入正常工作状态。
温湿度检测模块
温湿度检测模块是本系统中的核心模块之一,它负责完成温度和湿度的测量及模拟量转换为数字量的全过程,这也是它为什么重要的原因。
数字式温湿度传感器DTH11直接把检测到的模拟量转化为数字量送给单片机,在经过单片机的处理,把温湿度值显示在1602液晶上。
温湿度传感器的精确度值直接影响到整个系统的检
测与控制,所以本系统采用数字式温湿度传感器DTH11采集温室内的温湿度。
温湿度判断控制模块
温湿度判断控制模块也是系统的核心模块之一,所谓判断控制模块,就是对当前温室内的实际温湿度与给定的温湿度范围进行比较,先进行判断,然后再进行控制,控制模块是决定系统将要进行什么工作的。
如温度高于上限时需要降温, 低于下限时需要升温,如湿度高于上限时需要降湿,低于下限时需要増湿,同时还要启动警报等等。
温湿度判断控制部分的程序整体思路如图
温湿度判断控制程序整体思路
1602液晶显75模块
本系统采用1602液晶显示温湿度值,当系统刚开始上电时1602液晶不显示任何数据,等待DTH11的监测数据,双行显示在1602液晶上。
第一行显示:T:一• C第二行显示:H: --%
报警模块
报警模块具备两项功能,即为报警灯和声音报警。
报警灯模块是完成LED 有规
律的闪烁,以便从视觉上提醒用户。
LED是山单片机控制2个双色LED灯组成的,
其转换规律为:
1系统温湿度值在给定的范围时,绿色LED亮。
2系统温湿度值超出给定的范围时,白色LED亮。
在LED灯转换的同时,声音报警也会同时启动,可釆用延时的方式来延长声音报警的声音。
系统整体软件程序(见附录)
5系统测试
整个软件通过C语言编程,现在keilCol集成开发环境下将程序写出来, 并进行编译、调试,调试通过后会生成HEX文件,具体过程为:
新建一个工程,然后在新建一个C语言程序,并把新建的C语言程序添加到工程中,然后编译工程。
(编译后就会生成HEX文件,HEX文件就是要下载到单片机中的程序文件)
(1)点击Project菜单,选择下拉菜单中的NEW Project, X程名用testl 表
示,保存文件。
(2)选择所要的单片机,我们选择Ateml公司的AT89C51。
(3)在工程中创建新的程序文件,现在编写程序,我们先编写一个单片机I/O
口控制LED灯闪烁的程序。
SincludeO
sbit pl二pl"0;
unsigned int a;
void main ()
{
a二5000;
pl 二0;
while(a—);
a二5000;
pl二1;
while(a—);
}
这段程序是用单片机的口控制小灯闪烁,编译,然后将HEX文件下载到单片机中
运行程序观察LED灯的点壳情况。
当运行程序后LED灯闪烁,说明编译的程序正确。
当简单的程序正确就可以慢慢的加深难度,开始编写温湿度控制程序,在这里就不在写了(见附表),将写好的程序编译好无错后下载到单片机运行软件观察程序运行情况。
进行优化、改进。
6结论
虽然这个设计做的比较简单,但能完成给定的设计内容。
很多东西考虑的不是很细,也有一些特别悄况没有做,但是用了很多精力用来完成这个设计,鉴于个人水平和时间的关系,所以并没有把自己当初设想的所有情况都考虑进去。
这两个星期的设计让我学会的很多,觉得自己学的太少还有很多需要认真学习,学无止境,所以要更努力。
参考文献:
[1]林国汉.基于单片机的温度控制系统设计[J].微计算机信息,2009(25): 21〜
24
[2]易顺明.基于单片机的大棚温湿度控制系统设计[J].现代电子技术,2011 (7):7〜15
[3]张毅刚.单片机原理及应用[M].北京:高等教育出版社〜106
[4]Atmel. Atmel 89C51 Microcontrollers Hardware Manual, 2010. 35〜98
[5]陈桂友,柴远斌.单片机应用技术[M].北京:机械工业出版社,〜88
[6]熊诗波.机械工程测试技术基础[M]. 4版.北京:机械工业出版社,2008. 60〜102
[7]张新荣.基于单片机的多路温度监测系统设it [J].工业控制计算机,2010
(7) :13〜21
[8]夏晓南.基于单片机的温箱温度和湿度的控制[J].现代电子技术,2008
(5):6〜12
[9]秦曾煌.电工学.电子技术[M]. 7版.北京:高等教育出版社,〜80
附录
#include<>
SmcludeO
Smclude <>
void dangqianzhi();
void read_wsd();
Sdefine uchar unsigned char ”;
uchar code table6
uchar num, numl, sinum. diwen, gaowen, dishi, gaoshi; unintS RH. RL, TH, TL, CK.data; unintS TH_temp, TL_temp, RH_temp, RL_temp, CK_temp;
unintS com_data. untemp, temp;
unintS respond;
char pianchal, piancha2, piancha3, piancha l;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x—)
for (y=110;y>0;y—);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com: delay(5);
lcden=l;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=l;
P0=date;
delay(5);
lcden=l;
delay(5);
lcden=0;
}
void motor1(char speedl)
{
read_wsd();
dangqianzhi ();
ml=abs(speedl);
//延时函数,1ms为収位//液晶写命令函数
//液晶写数据函数
〃电机1
}
void motor2(char speed2) //电机2
read_wsd();
dangqianzhi();
m2=abs(speed2);
}
void init0
diwen=0; gaowen=0;
dishi=0; gaoshi=0;
TM0D=0x02;
TH0=0x9B; TL0=0x9B;
EA=1;
ETO=1;
TR0=0;
rs=0;
dula=0;
wela=0;
slnum=0;
numl=0;
lcden=0;
write_com(0x38);
write_com(OxOf);
write_com(0x06);
write_com(0x01);
write_com(0x80); }
void timerOO interrupt 1
//设定TO的工作模式为2
//装入定时器的初值
//开中断
//定时器0允许中断
〃设©16X2显示,5X7点阵,8位数拯接口
//设宜开显示,不显示光标
〃写一个字符后地址抬针加1
〃显示清零,数据抬针淸
〃设宜显示初始坐标
T0中断服务程序
if(t=O) // 1个P剧周期完成后才会接受新数值{ imp1二ml;
tmp2=m2;
}
辻(t<tmpl)
enl=l;
else
enl=0; //产生电机1的PWM信号
if(t<tmp2)
en2=l;
else
en2=0;
十;
if(t>=100)
{
t=0;
read_wsd();
dangqianzhi0; }
if(s5==0)
{
TR0=0;
enl=0;
en2=0;
}
void keyscan0
{
if(sl==0)
{
delay (5);
if(sl==0)
//产生电机2的PWM信号
//按键扫描函数
1个PWM信号由100次中断产
生
slnum 卄;
while(!sl);
if (slnum=l)
{
writ e_c om(0x80*0x4 f);
write-com(0x0f);
}
if(slnum==2)
{
wr i te_com(0x80*0xlc);
write_com(0x0f);
}
if(slnum==3)
{
writ e_c om(0x80*0x0f);
write_com(0x0f);
}
if (slnum==-l)
wr i te_com(0x80*0x0c); write_com(OxOf);
}
if (slnum=5)
{
slnum=O; write_com(OxOc);
}
}
}
if(slnum!=O)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if (slnum=l)
{
gaoshi++;
writ e_c om(0x80*0x4 e);
write_data(table![gaoshi/10]); writ e_c
om(0x80*0x1f);
write_data(table![gaoshi%10]); writ e_c
om(0x80*0xlf);
}
if (slnum=2)
{
dishi++;
write_com(0x80*0x4b);
write_data(tabledldishi/10]); writ e_c
om(0x80*0x4 c);
write_data(tabled[dishi%10]);
write_com(0x80*0xlc);
}
if (slnum=3)
{
gaowen-H-;
write_com(0x80+0x0e);
write_data(tablei[gaowen/10]); writ
e_com(0x80+0x0f);
write_data(table4[gaowen%10]);
writ e_com(0x80+0x0f);
}
if (slnum=l)
{
diwen^;
writ e_com(OxSO+OxOb);
write.data(table i[diwen/10]);
writ e_com(0x80+0x0c);
writ e.dat a(table![diwen%10]);
write_com(OxSO+OxOc);
}
}
}
if(s3==0)
{
delay(1);
if(s3=0)
{
while (!s3);
if(slnum==l)
{
gaoshi—;
writ e_c om(0x80*0x4 e);
write.data(table! [gaoshi/10]);
writ e_c om(0x80*0xlf);
writ e.dat a(t ab1el[gaosh i%l0]);
writ e_c om(0x80*0x4 f);
}
if (slntun==2)
{
dishi—;
wri te_com(0x80*0x4b);
write_data(table*! [dishi/10]);
write_com(0x80-0x1 c); write_data(table ! [dishi%10]);
writ e_c om(0x80*0x4 c); }
if(slnum==3)
write_data(table*! [gaowen/10]);
l [gaowen%!0]);
writ e_c om(0x80*0x0 f);
}
if(slnum==l)
{
diwen—;
writ e_c om(0x80*0x0b);
wr i te_com(0x80*0x0c);
writ e_c om(0x80*0x0 c);
}
}
}
if(s!==O)
{
delay(1);
if(s4=0)
{
slnum=0;
numl=0;
write_com(0x0c);
TRO=O; enl=l; en2=l;
gaowen—;
wr i te_com(0x80*0x0e);
writ e_c om(0x80*0x0 f);
wr ite_data (table4 [diwen/10]): write_data(tab 1 e-1 [d 1 wen% 10]);
} }
void delay_us() unintS i;
}
char receive 0
{
unintS i:
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while ((!wsd)&&respond*+);
delay_us();
delay_us();
delay_us();
if (wsd)
{
temp=l;
respond=2;
while((wsd)i^respond^);
}
else
temp=0;
com_data«=l; com_data 二temp;
com_data=com_data temp
}
return(com_data);
}
void read_wsd()
{
wsd=0:
delay(18);
wsd=l;
delay_us ();
delay_us ();
delay_us ();
delay_us ();
wsd=l;
ifCwsd)
则跳出■响应则向下运行
//左移后赋值为1
//按位或后赋值
//湿度读取子程序//主机拉低18ms
//DATA总线由上拉电阻拉商主机延时20us
//主机设为输入判断从机响应信号
//判断DHT11是否有低电平响应信号如不响应
respond=2; while((!wsd)&&
respond*^);
}
void xianshi 0
»Tite_com(0x80);
for (num=0; num<2; numE
write_data(tab 1
e[num]); delay(5);
} delay(5);
write_com(0x80+0x01);
for(num=0;num<2;num++)
write_data(tabled[num])
; delay(5);
writ e_com(0x80+0x06);
//判断DHT11发出80us 的低电平响应信号是
否结束
respond=2;
while(wsd&&respond +-r ); 则进入数据接收状态
//判断从机是否发出80us 的高电平,如发岀
RH_temp=receive();
//数据接收状态
RL_temp=receive 0;
TH_temp=receive0;
TL_temp 二receive();
CK_temp=receive(); wsd=l;
untemp= (RH_temp^RL_temp*TH_temp+TL_temp); //数据校验 if(untemp==CK_temp) {
RH = RH_temp; RL = RL_temp; //湿度岛8
位 //湿度低TH = TH.temp; TL = TL_temp; CK_data = CK_temp;
//温度扁8位
〃温度低8位
//给液晶写入数据
write_data(table6[2]);
writ e_com(0x80+0x10);
for(num=O;num<2;num十+)
write_data(tablel[numj);
delay(5);
}
write_com(0x80+0x44);
for(num=0;num<2;num十+)
{
write_data(Table5[numj);
delay(5);
}
write_com(0xS0+0x46);
write_data(table6[l]);
delay(5);
write_com(0x80+0x08);
for(num=0;num<3;num十+)
{
writ e_dat a(t ab1e2[num]);
delay(l);
}
}
void xiefanwei 0
{
write_com(0x80*0x0B);
write_data(table-1 [diwen/10]); delay
(1);
writ e_com(OxSO+OxOc);
writ e_dat a(tablei[diwen%10]);
delay(1);
writ e_com(0x80+0x0d);
write_data(table6[0]);
delay(l);
write_com(0x80+0x0e);
write_data(tablei[gaowen/10]); delay(1);
write_com(0x80+0x0f);
writ e_data(tablei[gaowen%10]);
delay(1);
writ e_com(0x80+0x48);
for(num=0;num<3;num十+)
writ e_dat a(tab1e3[num]);
delay(1);
write_com(OxSO+OxlB);
write_data(table4[dishi/10]); delay(1);
writ e_com(0x80+0x4c);
write_data(Table4[dishi%10]); delay(l);
write_com(0x80+0x4d);
write_data(table6[0]);
delay(1);
write_com(0xS0+0x4e); write_data(table-1
[gaoshi/10]); delay (1);
write_com(0x80+0x4f);
write_data(table4[gaoshi%10]); delay(1);
}
void dangqianzhi()
{
writ e_com(0x80+0x02);
write_data(table-1 [TH/10]);
delay (1);
wr it e_com (0x80*0x03); write_data(table!
[TH%10]); delay (1);
write_com(0x80*0x42);
write_data(tab 1 el [RH. 10]);
delay (1);
write_com(0x80*0x-13);
write_data(tab 1 e! [RH%10]);
write_com(0x0c);
}
void jmgbaol ()
//温湿度低于下限{
while ((TH<diwen) && (RH<di shi))
{
read_wsd();
dangqianzhi 0;
if(s5==0 |TH>=diwen||RH>=dishi) {
TRO=O;
enl=0;
en2=0;
break;
}
fm=O;
delay(50);
fm=l;
delay(50);
ledl=0;
delay(50);
ledl=l;
delay(50);
led2=0;
delay(50);
led2=l;
delay(50);
piancha1=diwen-TH;
if(pianchal>=l&&pianchal<3) pianchal=30;
else if(pianchal>3&&pianchal<6) pianchal=40;
else if(pianchal>6&&pianchal<10) pianchal=60;
else
pianchal=80;
delay (5);
motorl(pianchal);
delay (2);
IN1=O;
IN2=1;
piancha2=dishi"RH;
delay (5);
if(piancha2>=l&&piancha2<=5) piancha2=30;
else if(p1ancha2>5&&p1ancha2<10) piancha2=10;
else if(piancha2>10&&piancha2<20) pianchal=60;
else
pianchal=80;
delay (2);
motor2(piancha2);
delay (2);
IN3=0;
IN4=1;
}
void jingbao2()
//温度低于下限while ((TH<diwen) && ((RH>dishi)&& (RH<gaoshi)))
{
read_wsd();
dangqianzhi 0;
if(s5=0 |TH>=diwen| |RH<=dishi 11 RH>=gaoshi) {
TR0=0;
enl=0;
en2=0;
break;
}
fm=0;
delay(10);
fm=l;
delay(10);
ledl=0;
delay(50);
ledl=l;
delay(50);
piancha1=diwen-TH;
delay (10);
if(pianchal>=l&&pianchal<3)
pianchal=30;
else if(pianchal>3&&pianchal<6)
pianchal=40;
else if(p1ancha1>6&&p1ancha1<10)
pianchal=60;
else
pianchal=80;
delay (10);
motorl(pianchal);
delay (1);
IN1=O;
IN2=1;
}
}
void jingbao3() //温度低干下限.湿度高于上限
while ((TH<diwen) && (RH>gaoshi)) read_wsd ();
dangqianzhi 0;
if(s5==0 |TH>=diwen|!RH<=gaoshi) {
TRO=O;
enl=O;
en2=0;
break;
}
fm=O;
delay (50);
fm=l;
delay (50);
ledl=0;
delay (50);
ledl=l;
delay (50);
led2=0;
delay (50);
led2=l;
delay (50);
piancha1=diwen-TH;
delay (10);
if(pianchal>=l&&pianchal<3)
pianchal=30;
else if(pianchal>3&&pianchal<6) pianchal=40;
else if(pianchal>6&&pianchal<10) pianchal=60;
else
pianchal=80;
delay (2);
motor1(pianchal);
delay (2);
IN1=O;
IN2=1;
p1ancha3=RH-gaosh i;
delay (5);
if(piancha3>=l&&piancha3<=5)
piancha3=30;
else if(piancha3>5&&piancha3<10) piancha3=40;
else if(piancha3>10&&piancha3<20)
piancha3=60;
else
piancha3=80;
delay(2);
motor2(piancha3);
IN3=1;
IN1=O;
}
}
void jmgbao! 0 //湿度低于下限
{
while ((TH>diwen)^(TH<gaowen)&&(RH<dLshi))
{
read_wsd();
dangqianzhi 0;
if(s5==0 |TH<=diwen||TH>=gaowen||RH>=dishi) {
TR0=0;
enl=0;
en2=0;
break;
}
fm=0;
delay(100);
fm=l;
delay(100);
led2=0;
delay (50);
led2=l;
delay(50);
p1ancha2=dishi^RH;
delay (5);
if(piancha2>=l&&piancha2<=5)
piancha2=30;
else if(piancha2>5&&piancha2<10)
piancha2=10;
else if(piancha2>10&&piancha2<20)
piancha2=60;
else
piancha2=80;
motor2(piancha2);
IN3=0;
IN4=1;
}
}
void jingbao5() while ((TH>diwen) && (TH<gaowen)&& (RH>gaoshi)) {
read_wsd();
dangqianzhi 0;
if(s5==0||TH<=diwen||TH>=gaowen||RH<=gaoshi) {
TRO=O;
enl=0;
en2=0;
break;
}
fm=0;
delay (100);
fm=l;
delay(100);
led2=0;
delay (50);
led2=l;
delay (50);
p1ancha3=RH _gaosh i;
delay (5);
if(piancha3>=l&&piancha3<=5) piancha3=30; else if(p1ancha3>5&&p1ancha3<10) piancha3=10; else if(piancha3>10&&piancha3<20) piancha3=60; else
piancha3=80;
delay (1);
motor2(piancha3);
delay (1);
while ((TH>gaowen) && (RH<dishi))//湿度高于上限
IN3=1;
IN4=0;
}
}
void jingbao6()
〃温度商于上限.湿度低于下限
read_wsd();
dangqianzhi();
if (s5==0 HTH<=gaowen| |RH>=dishi) {
TR0=O;
enl=O;
en2=0;
break;
}
fm=O;
delay (50);
fm=l;
delay (50);
ledl=0;
delay (50);
ledl=l;
delay (50);
led2=0;
delay(50);
led2=l;
delay (50);
p1anchal=TH-gaowen;
if(piancha4>=l&&piancha4<3)
pianchal=30;
else if(p1anchal>3&&p1anchal<6) piancha*l=40;
else if(pianchad>6&&p1anchal<10) pianchal=60;
else
pianchal=80;
delay (4);
motor 1 (pianchal);
delay (1);
IN1=1;
IN2=0;
p1ancha2=di shi"RH;
if(piancha2>=l&&piancha2<=5)
piancha2=30;
else if(p1ancha2>5&&p1ancha2<10) piancha2=40;
else if(piancha2>10&&piancha2<20) piancha2=60;
else
piancha2=80;
delay (1);
motor2(piancha2);
IN3=0;
IN4=1;
}
}
void jingbao? 0 //温度高于上限
{
while ((TH>gaowen) && ((RH>dishi)&& (RH<gaoshi)))
{
read_wsd();
dangqianzhi 0;
if(s5==0 |TH<=gaoweni iRH<=dishi||RH>=gaoshi) {
TR0=0;
enl=0;
en2=0;
break;
}
fm=0;
delay(10);
fm=l;
delay(10);
ledl=0;
delay(50);
ledl=l;
delay(50);
pianch&1二TH-gaowen;
if (piancha4>:=l&&piancha4<=3)
piancha*l=30;
else if(pianchal>3&&p1anchal<6) piancha4=10;
else if(pianchal>6&&p1anchal<10) pianchal=60;
else
piancha4=80;
motor 1 (piancha-l);
delay (1);
IN1=1;
IN2=0;
}
}
void jingbaoS()//視湿度拓于上限
while ((TH>gaowen) && (RH>gaoshi))
read_wsd();
dangqianzhi ();
if(s5==0 |TH<=gaowen| RH<=gaoshi) {
TRO=O;
enl=O;
en2=0;
break;
}
fm=O;
delay (50);
fm=l;
delay(50);
ledl=0;
delay (50);
ledl=l;
delay (50);
led2=0;
delay (50);
led2=l;
delay(50);
pianchal=TH-gaowen;
if(pianchal>=l&&piancha4<3)
piancha4=30;
else if(piancha4>3&&pianchal<6)
piancha-l=40;
else if(piancha4>6&&p1anchal<10)
piancha*l=60;
else
piancha4=80;
motor1(pianchal);
IN1=1;
IN2=0;
p1ancha3=RH-gaosh i;
if(piancha3>=l&&piancha3<=5)
piancha3=20;
else if(p1ancha3>5&&p1ancha3<10)
piancha3=40;
else if(piancha3>10&&piancha3<20)
piancha3=60;
else
piancha3=80; motor2(piancha3); IN3=1;
IN1=O;
}
void mainO
{
initO;
xianshi ();
xiefanwei ();
while(l)
{
read_wsd(); dangqianzhi 0; if(s5==O) break;
}
while(1)
{
numl=0:
if(s5==O)
{
delay(5);
TRO=O;
enl=O;
en2=0;
IN1=O;
IN2=0;
IN3=0;
IN4=0;
if(s5==0)
{
whileds5);
while(numl!=O)
{
TRO=O;
enl=O;
en2=0;
IN1=O;
IN2=0;
IN3=0;
IN1=O; fm=l; ledl=l;
led2=l;
keyscan 0;
}
}
if (numl==O)
{
while(l)
{
if(s5==0)
{
TR0=O;
enl=O;
en2=0;
break;
}
read_wsd();
dangqianzhi 0;
key scan ();
if ((TH>diwen&&TH<gaowen) && (RH>di shi&&RH<gaoshi)) {
TRO=O;
enl=O;
en2=0;
}
if((TH<diwen)&&(RH<dishi))
{
jingbaolO ;
)
if ((TH<diwen)&&((RH>dishi) && (RH<gaoshi)))
jingbao2();
}
if ((TH<diwen)&& (RH>gaoshi))
{
jingbao3();
}
if((TH>diwen)&&(TH<gaowen)&&(RH<dishi))
{
jingbao4();
}
if ((TH>diwen)&& 仃H〈gaogn) &&(RH>gaoshi))
{
jingbao5();
}
if((TH>gaowen)&&(RH<dishi))
{
jingbao6();
}
if((TH>gaowen)&&((RH>dishi)&&(RH<gaoshi))) {jmgbao7 ();
}
if ((TH>gaowen) && (RH>gaoshi))
{
jingbao8();
}
}
}。