室内温湿度控制系统报告汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
室内温湿度控制系统
设计报告
新电八队
室内温湿度控制系统
摘要:本文利用89C52单片机设计一个温室大棚的温湿度检测控制系统,对
室内的温湿度进行检测控制并实时显示。
其中温湿度传感器采用DHT11数字温湿
度传感器,通过89C52单片机的处理把温湿度值显示在1602A液晶上。
并实时判
断温湿度值是否满足设定的温湿度范围,若超出设定范围,通过89C52启动温湿
度控制系统,达到恒温恒湿的目的。
关键字:89C52;DHT11;1602A液晶显示;温湿度控制系统
目录
摘要 (1)
1本系统主要研究内容 (3)
1.1基本要求 (3)
1.2发挥部分 (3)
2系统总体设计 (3)
2.1系统的组成 (3)
2.2系统的工作原理 (4)
3单元电路设计 (6)
3.1单片机系统设计 (6)
3.2传感器的设计 (8)
3.3液晶显示装置设计 (9)
3.4光声报警系统与温湿度控制系统设计........................... 错误!未定义书签。
3.5温湿度系统设计 (13)
4软件设计 (14)
4.1初始化模块 (14)
4.2温湿度检测模块 (14)
4.3温湿度判断控制模块 (15)
4.41602液晶显示模块 (15)
4.5报警模块 (15)
4.6系统整体软件程序 (16)
5系统测试 (16)
6总结 (17)
参考文献: (17)
附录 (18)
1本系统主要研究内容
设计一个室内温湿度检测装置,检测和显示室内的温度、湿度,并在温度、湿度超过设置的范围是采取相应的措施,使得温度达到设置的范围。
1.1 基本要求
(1)采集温度传感器数据,在显示器上显示室内的温度。
(2)采集湿度传感器数据,在显示器上显示室内的湿度。
(3)可以通过按键来设定目标温度和湿度的范围。
1.2 发挥部分
(1)当温度和湿度超过设置的范围时用蜂鸣器发出不同的声音报警,并且用LED灯指示是温度还是湿度超出了预设的范围。
(2)用两个电机模拟对温度和湿度的控制,当温度和湿度超出设置范围时控制两个电机动作,调节温度和湿度达到预设的范围。
电机1正转(顺时针)表示加热,反转(逆时针)表示制冷。
电机2正转(顺时针)表示加湿,反转(逆时针)表示干燥。
(3)用电机的转速表示控制作用的强弱程度,并与温度、湿度的偏差大小相关。
2 系统的总体设计
2.1 系统的组成
以单片机为控制核心,采用温湿度测量,通信技术,控制技术等技术,以温湿度传感器作为测量元件,构成智能温湿度测量控制系统。
可分为温湿度测量电路,显示电路,声光报警电路,温湿度控制电路,选用的主要器件有: 89C52,温湿度传感器DHT11,1602A显示模块,红绿白LED灯,报警装置蜂鸣器等。
系统原理图
2.2 系统的工作原理
本系统以单片机89C52为核心,数据采集、传输、显示、报警都要通过单片机。
数据采集通过单总线的智能数字温湿度传感器DHT11完成;通过单片机把采集的数据显示在1602A上;当采集的数据超出给定范围时,有蜂鸣器实时报警,并显示红灯提示,并进行相应的控制处理。
在整个系统中采用了DHT11单总线技术,单片机采用C语言编程。
· 89C52作为中央控制装置,负责中心运算和控制,协调系统各个模块的工作。
·电机1反转:实现系统的降温工作。
·电机1正转:实现系统的加热工作。
·电机2正转:实现系统的加湿工作。
·电机2反转:实现系统的干燥工作。
·两盏灯,报警模块:负责系统的报警功能。
如果当前的温度超过用户设定的界限值时系统将自动报警,灯在单片机的控制下有规律的闪烁,同时报警模块发出报警声,通知用户采取相应的措施。
系统工作流程图
系统的工作流程图
3 单元电路设计
3.1 单片机系统设计
经过上面的总体方案和实施措施的讨论后可以开始着手硬件系统的设计,硬件系统是应用系统的基础、软件系统设计的依据
根据总体功能和性价比及其运行速度等因素的考虑,选用STC89C52为主机,满足上面的要求而且设计方便,不需要再存储扩展。
STC89C52单片机概述
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T 可选。
相关参数:1. 工作电压:5.5V~3.3V(5V 单片机)
2.8V~2.0V(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/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成。
7. 具有EEPROM 功能
8. 具有看门狗功能
9. 共3 个16位定时器/计数器。
即定时器T0、T1、T2
10.外部中断4路,下降沿中断或低电平触发电路,Power Down 模
式可由外部中断低电平触发中断方式唤醒。
11. 通用异步串行口(UART),还可用定时器软件实现多个UART
12. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
13. PDIP 封装
89C52引脚图
3.2 传感器的设计
DHT11产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
产品为4 针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
DHT11引脚说明
VDD 供电3-5.5VDC
DATA 串行数据,单总线
NC 空脚,请悬空
GND 接地,电源负极
3.3 液晶显示装置设计
1602A是一种工业字符型液晶,能够同时显示16x02即32个字符。
下图为1602A模块尺寸图
引脚接口说明
VSS 电源地9 D2 数据
VDD 电源正极10 D3 数据
VL 液晶显示偏压11 D4 数据
RS 数据/命令选择12 D5 数据
R/W 读/写选择13 D6 数据
E 使能信号14 D7 数据
D0 数据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端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~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:显示光标移动设置
写指令0CH:显示开及光标设置
液晶显示原理
读写操作时序如图13和图14所示:
读操作时序
写操作时序
3.4 光声报警系统与温湿度控制系统设计
本系统采用绿白LED灯作为光报警提示,当系统检测到的数据符合给定的要求时,现场始终白绿灯不亮;当系统检测到的数据不符合给定的要求时,根据情况(温度超限白灯亮,湿度超限绿灯亮)报警提示;本系统采用蜂鸣器作为声报警提示,当系统检测到的数据符合给定的要求时,现场没有蜂鸣器报警提示;当系统检测到的数据不符合给定的要求时,现场蜂鸣器报警提示。
光声报警系统电路图
3.5 温湿度控制系统
本系统温湿度控制系统主要组成有:电机1和电机2。
当系统检测到的数据不符合给定的要求时,系统启动温湿度控制系统实现恒温恒湿的目的。
·电机1反转:实现系统的降温工作。
·电机1正转:实现系统的加热工作。
·电机2正转:实现系统的加湿工作。
·电机2反转:实现系统的干燥工作。
温湿度检测电路
温湿度控制电路
4 软件系统设计
本系统软件系统设计包括:系统初始化模块,温湿度检测模块,1602LCD显
系统流程图
4.1 初始化模块
系统初始化模块的主要功能是完成系统的初始化以及设定系统的工作状态,初始化部分包括以下方面的内容:
4.1.1 单片机初始化以及各种引脚定义。
4.1.2 1602液晶初始化及工作方式。
4.1.3 系统进入正常工作状态。
4.2 温湿度检测模块
温湿度检测模块是本系统中的核心模块之一,它负责完成温度和湿度的测量及模拟量转换为数字量的全过程,这也是它为什么重要的原因。
数字式温湿度传感器DTH11直接把检测到的模拟量转化为数字量送给单片机,在经过单片机的处理,把温湿度值显示在1602液晶上。
温湿度传感器的精确度值直接影响到整个
系统的检测与控制,所以本系统采用数字式温湿度传感器DTH11采集温室内的温湿度。
4.3 温湿度判断控制模块
温湿度判断控制模块也是系统的核心模块之一,所谓判断控制模块,就是对当前温室内的实际温湿度与给定的温湿度范围进行比较,先进行判断,然后再进行控制,控制模块是决定系统将要进行什么工作的。
如温度高于上限时需要降温,低于下限时需要升温,如湿度高于上限时需要降湿,低于下限时需要増湿,同时还要启动警报等等。
温湿度判断控制部分的程序整体思路如图
温湿度判断控制程序整体思路
4.4 1602液晶显示模块
本系统采用1602液晶显示温湿度值,当系统刚开始上电时1602液晶不显示任何数据,等待DTH11的监测数据,双行显示在1602液晶上。
第一行显示:T:--。
C第二行显示:H: --%
4.5 报警模块
报警模块具备两项功能,即为报警灯和声音报警。
报警灯模块是完成LED
有规律的闪烁,以便从视觉上提醒用户。
LED是由单片机控制2个双色LED灯组成的,其转换规律为:
1 系统温湿度值在给定的范围时,绿色LED亮。
2 系统温湿度值超出给定的范围时,白色LED亮。
在LED灯转换的同时,声音报警也会同时启动,可采用延时的方式来延长声音报警的声音。
4.6 系统整体软件程序(见附录)
5系统测试
整个软件通过C语言编程,现在keilC51集成开发环境下将程序写出来,并进行编译、调试,调试通过后会生成HEX文件,具体过程为:
新建一个工程,然后在新建一个C语言程序,并把新建的C语言程序添加到工程中,然后编译工程。
(编译后就会生成HEX文件,HEX文件就是要下载到单片机中的程序文件)
(1)点击Project菜单,选择下拉菜单中的NEW Project,工程名用test1表示,保存文件。
(2)选择所要的单片机,我们选择Ateml公司的AT89C51。
(3)在工程中创建新的程序文件,现在编写程序,我们先编写一个单片机I/O口控制LED灯闪烁的程序。
#include<reg51.h>
sbit p1=p1^0;
unsigned int a;
void main ()
{
a=5000;
p1=0;
while(a--);
a=5000;
p1=1;
while(a--);
}
这段程序是用单片机的P1.0口控制小灯闪烁,编译,然后将HEX文件下载到单片机中运行程序观察LED灯的点亮情况。
当运行程序后LED灯闪烁,说明编译的程序正确。
当简单的程序正确就可以慢慢的加深难度,开始编写温湿度控制程序,在这里就不在写了(见附表),将写好的程序编译好无错后下载到单片机运行软件观察程序运行情况。
进行优化、改进。
6结论
虽然这个设计做的比较简单,但能完成给定的设计内容。
很多东西考虑的不是很细,也有一些特别情况没有做,但是用了很多精力用来完成这个设计,鉴于个人水平和时间的关系,所以并没有把自己当初设想的所有情况都考虑进去。
这两个星期的设计让我学会的很多,觉得自己学的太少还有很多需要认真学习,学无止境,所以要更努力。
参考文献:
[1]林国汉.基于单片机的温度控制系统设计[J].微计算机信息,2009(25): 21~24
[2]易顺明.基于单片机的大棚温湿度控制系统设计[J].现代电子技术,2011 (7):7~15
[3]张毅刚.单片机原理及应用[M].北京:高等教育出版社2008.12~106
[4] Atmel. Atmel 89C51 Microcontrollers Hardware Manual,2010. 35~98
[5]陈桂友,柴远斌.单片机应用技术[M].北京:机械工业出版社,2008.10~88
[6]熊诗波.机械工程测试技术基础[M].4版.北京:机械工业出版社,2008. 60~102
[7]张新荣.基于单片机的多路温度监测系统设计[J].工业控制计算机,2010(7):13~21
[8]夏晓南.基于单片机的温箱温度和湿度的控制[J].现代电子技术,2008 (5):6~12
[9]秦曾煌.电工学.电子技术[M].7版.北京:高等教育出版社,2008.34~80
附录
#include<reg52.h>
#include<math.h>
#include <intrins.h>
void dangqianzhi();
void read_wsd();
#define uchar unsigned char //定义无符号字符型
#define uint unsigned int //定义无符号整型
typedef unsigned char unint8; //定义无符号字节型
typedef unsigned char unint16; //定义无符号字型
sbit en1=P1^6; // L298的Enable A
sbit en2=P1^1; // L298的Enable B
sbit IN1=P1^2; // L298的Input 1
sbit IN2=P1^3; // L298的Input 2
sbit IN3=P1^4; // L298的Input 3
sbit IN4=P1^5; // L298的Input 4
uchar t=0; // 中断计数器
uchar m1=0; // 电机1速度值
uchar m2=0; // 电机2速度值
uchar tmp1,tmp2; // 电机当前速度值
sbit wsd=P1^0; // DHT11数据接受
sbit s1=P3^0; // 按键s1
sbit s2=P3^1; // 按键s2
sbit s3=P3^2; // 按键s3
sbit s4=P3^3; // 按键s4
sbit s5=P3^6; // 按键s5
sbit rs=P3^7; //
sbit fm=P2^3; // 蜂鸣器接口
sbit led1=P2^4; // 温度警报灯
sbit led2=P2^5; // 湿度警报灯
sbit lcden=P3^4; //液晶使能端
sbit lcdrs=P3^5; //液晶数据命令选择端
sbit dula=P2^6; //段选端
sbit wela=P2^7; //位选端
uchar code table[]="T:"; // 温度
uchar code table1[]="H:"; // 湿度
uchar code table2[]="FW:"; // 温度范围
uchar code table3[]="FW:"; // 湿度范围
uchar code table4[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; uchar code table5[]=".0";
uchar code table6[]="~%C";
uchar num,num1,s1num,diwen,gaowen,dishi,gaoshi;
unint8 RH,RL,TH,TL,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
char piancha1,piancha2,piancha3,piancha4;
void delay(uint z) // 延时函数,1ms为单位{
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=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //液晶写数据函数
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void motor1(char speed1) //电机1
{
read_wsd();
dangqianzhi();
m1=abs(speed1);
}
void motor2(char speed2) //电机2
{
read_wsd();
dangqianzhi();
m2=abs(speed2);
}
void init()
{
diwen=0;
gaowen=0;
dishi=0;
gaoshi=0;
TMOD=0x02; // 设定T0的工作模式为2
TH0=0x9B; // 装入定时器的初值
TL0=0x9B;
EA=1; // 开中断
ET0=1; // 定时器0允许中断
TR0=0;
rs=0;
dula=0;
wela=0;
s1num=0;
num1=0;
lcden=0;
write_com(0x38); //设置16X2显示,5X7点阵,8位数据接口
write_com(0x0f); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清零,数据指针清
write_com(0x80); //设置显示初始坐标
}
void timer0() interrupt 1 // T0中断服务程序
{
if(t==0) // 1个PWM周期完成后才会接受新数值
{ tmp1=m1;
tmp2=m2;
}
if(t<tmp1)
en1=1;
else
en1=0; // 产生电机1的PWM信号
if(t<tmp2)
en2=1;
else
en2=0; // 产生电机2的PWM信号
t++;
if(t>=100)
{
t=0;
read_wsd();
dangqianzhi();
} // 1个PWM信号由100次中断产生
if(s5==0)
{
TR0=0;
en1=0;
en2=0;
}
}
void keyscan() // 按键扫描函数
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!s1);
if(s1num==1)
{
write_com(0x80+0x4f);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x4c);
write_com(0x0f);
}
if(s1num==3)
{
write_com(0x80+0x0f);
write_com(0x0f);
}
if(s1num==4)
{
write_com(0x80+0x0c);
write_com(0x0f);
}
if(s1num==5)
{
s1num=0;
write_com(0x0c);
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
gaoshi++;
write_com(0x80+0x4e);
write_data(table4[gaoshi/10]);
write_com(0x80+0x4f);
write_data(table4[gaoshi%10]);
write_com(0x80+0x4f);
}
if(s1num==2)
{
dishi++;
write_com(0x80+0x4b);
write_data(table4[dishi/10]);
write_com(0x80+0x4c);
write_data(table4[dishi%10]);
write_com(0x80+0x4c);
}
if(s1num==3)
{
gaowen++;
write_com(0x80+0x0e);
write_data(table4[gaowen/10]);
write_com(0x80+0x0f);
write_data(table4[gaowen%10]);
write_com(0x80+0x0f);
}
if(s1num==4)
{
diwen++;
write_com(0x80+0x0b);
write_data(table4[diwen/10]);
write_com(0x80+0x0c);
write_data(table4[diwen%10]);
write_com(0x80+0x0c);
}
}
}
if(s3==0)
{
delay(1);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
gaoshi--;
write_com(0x80+0x4e);
write_data(table4[gaoshi/10]);
write_com(0x80+0x4f);
write_data(table4[gaoshi%10]);
write_com(0x80+0x4f);
}
if(s1num==2)
{
dishi--;
write_com(0x80+0x4b);
write_data(table4[dishi/10]);
write_com(0x80+0x4c);
write_data(table4[dishi%10]);
write_com(0x80+0x4c);
}
if(s1num==3)
{
gaowen--;
write_com(0x80+0x0e);
write_data(table4[gaowen/10]);
write_com(0x80+0x0f);
write_data(table4[gaowen%10]);
write_com(0x80+0x0f);
}
if(s1num==4)
{
diwen--;
write_com(0x80+0x0b);
write_data(table4[diwen/10]);
write_com(0x80+0x0c);
write_data(table4[diwen%10]);
write_com(0x80+0x0c);
}
}
}
if(s4==0)
{
delay(1);
if(s4==0)
{
s1num=0;
num1=0;
write_com(0x0c);
TR0=0;
en1=1;
en2=1;
}
}
}
}
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!wsd)&&respond++);
delay_us();
delay_us();
delay_us();
if(wsd)
{
temp=1;
respond=2;
while((wsd)&&respond++);
}
else
temp=0;
com_data<<=1; //左移后赋值为1
com_data|=temp; //按位或后赋值
com_data=com_data|temp
}
return(com_data);
}
void read_wsd() //湿度读取子程序{
wsd=0; //主机拉低18ms
delay(18);
wsd=1; //DATA总线由上拉电阻拉高主机延时20us delay_us();
delay_us();
delay_us();
delay_us();
wsd=1; //主机设为输入判断从机响应信号
if(!wsd) //判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行
{
respond=2;
while((!wsd)&& respond++); //判断DHT11发出 80us 的低电平响应信号是否结束
respond=2;
while(wsd&&respond++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
RH_temp=receive(); //数据接收状态
RL_temp=receive();
TH_temp=receive();
TL_temp=receive();
CK_temp=receive();
wsd=1;
untemp=(RH_temp+RL_temp+TH_temp+TL_temp); //数据校验
if(untemp==CK_temp)
{
RH = RH_temp; //湿度高8位 RL = RL_temp; //湿度低8位 TH = TH_temp; //温度高8位
TL = TL_temp; //温度低8位 CK_data = CK_temp; //数据校检位
}
}
}
void xianshi()
{
write_com(0x80); //给液晶写入数据
for(num=0;num<2;num++)
{
write_data(table[num]);
delay(5);
}
delay(5);
write_com(0x80+0x04);
for(num=0;num<2;num++)
{
write_data(table5[num]);
delay(5);
}
write_com(0x80+0x06);
write_data(table6[2]);
write_com(0x80+0x40);
for(num=0;num<2;num++)
{
write_data(table1[num]);
delay(5);
}
write_com(0x80+0x44);
for(num=0;num<2;num++)
{
write_data(table5[num]);
delay(5);
}
write_com(0x80+0x46);
write_data(table6[1]);
delay(5);
write_com(0x80+0x08);
for(num=0;num<3;num++)
{
write_data(table2[num]);
delay(1);
}
}
void xiefanwei()
{
write_com(0x80+0x0B);
write_data(table4[diwen/10]);
delay(1);
write_com(0x80+0x0c);
write_data(table4[diwen%10]);
delay(1);
write_com(0x80+0x0d);
write_data(table6[0]);
delay(1);
write_com(0x80+0x0e);
write_data(table4[gaowen/10]);
delay(1);
write_com(0x80+0x0f);
write_data(table4[gaowen%10]);
delay(1);
write_com(0x80+0x48);
for(num=0;num<3;num++)
{
write_data(table3[num]);
delay(1);
}
write_com(0x80+0x4B);
write_data(table4[dishi/10]);
delay(1);
write_com(0x80+0x4c);
write_data(table4[dishi%10]);
delay(1);
write_com(0x80+0x4d);
write_data(table6[0]);
delay(1);
write_com(0x80+0x4e);
write_data(table4[gaoshi/10]);
delay(1);
write_com(0x80+0x4f);
write_data(table4[gaoshi%10]);
delay(1);
}
void dangqianzhi()
{
write_com(0x80+0x02);
write_data(table4[TH/10]);
delay(1);
write_com(0x80+0x03);
write_data(table4[TH%10]);
delay(1);
write_com(0x80+0x42);
write_data(table4[RH/10]);
delay(1);
write_com(0x80+0x43);
write_data(table4[RH%10]);
write_com(0x0c);
}
void jingbao1() //温湿度低于下限{
while((TH<diwen)&&(RH<dishi))
{
read_wsd();
dangqianzhi();
if(s5==0||TH>=diwen||RH>=dishi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(50);
fm=1;
delay(50);
led1=0;
delay(50);
led1=1;
delay(50);
led2=0;
delay(50);
led2=1;
delay(50);
piancha1=diwen-TH;
if(piancha1>=1&&piancha1<3)
piancha1=30;
else if(piancha1>3&&piancha1<6)
piancha1=40;
else if(piancha1>6&&piancha1<10)
piancha1=60;
else
piancha1=80;
delay(5);
motor1(piancha1);
delay(2);
IN1=0;
IN2=1;
piancha2=dishi-RH;
delay(5);
if(piancha2>=1&&piancha2<=5)
piancha2=30;
else if(piancha2>5&&piancha2<10)
piancha2=40;
else if(piancha2>10&&piancha2<20)
piancha1=60;
else
piancha1=80;
delay(2);
motor2(piancha2);
delay(2);
IN3=0;
IN4=1;
}
}
void jingbao2() //温度低于下限{
while((TH<diwen)&&((RH>dishi)&&(RH<gaoshi)))
{
read_wsd();
dangqianzhi();
if(s5==0||TH>=diwen||RH<=dishi||RH>=gaoshi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(10);
fm=1;
delay(10);
led1=0;
delay(50);
led1=1;
delay(50);
piancha1=diwen-TH;
delay(10);
if(piancha1>=1&&piancha1<3)
piancha1=30;
else if(piancha1>3&&piancha1<6)
piancha1=40;
else if(piancha1>6&&piancha1<10)
piancha1=60;
else
piancha1=80;
delay(10);
motor1(piancha1);
delay(1);
IN1=0;
IN2=1;
}
}
void jingbao3() // 温度低于下限,湿度高于上限{
while((TH<diwen)&&(RH>gaoshi))
{
read_wsd();
dangqianzhi();
if(s5==0||TH>=diwen||RH<=gaoshi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(50);
fm=1;
delay(50);
led1=0;
delay(50);
led1=1;
delay(50);
led2=0;
delay(50);
led2=1;
delay(50);
piancha1=diwen-TH;
delay(10);
if(piancha1>=1&&piancha1<3)
piancha1=30;
else if(piancha1>3&&piancha1<6)
piancha1=40;
else if(piancha1>6&&piancha1<10)
piancha1=60;
else
piancha1=80;
delay(2);
motor1(piancha1);
delay(2);
IN1=0;
IN2=1;
piancha3=RH-gaoshi;
delay(5);
if(piancha3>=1&&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;
IN4=0;
}
}
void jingbao4() //湿度低于下限{
while((TH>diwen)&&(TH<gaowen)&&(RH<dishi))
{
read_wsd();
dangqianzhi();
if(s5==0||TH<=diwen||TH>=gaowen||RH>=dishi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(100);
fm=1;
delay(100);
led2=0;
delay(50);
led2=1;
delay(50);
piancha2=dishi-RH;
delay(5);
if(piancha2>=1&&piancha2<=5)
piancha2=30;
else if(piancha2>5&&piancha2<10)
piancha2=40;
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();
if(s5==0||TH<=diwen||TH>=gaowen||RH<=gaoshi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(100);
fm=1;
delay(100);
led2=0;
delay(50);
led2=1;
delay(50);
piancha3=RH-gaoshi;
delay(5);
if(piancha3>=1&&piancha3<=5)
piancha3=30;
else if(piancha3>5&&piancha3<10)
piancha3=40;
else if(piancha3>10&&piancha3<20)
piancha3=60;
else
piancha3=80;
delay(1);
motor2(piancha3);
delay(1);
IN3=1;
IN4=0;
}
}
void jingbao6() //温度高于上限,湿度低于下限{
while((TH>gaowen)&&(RH<dishi))
{
read_wsd();
dangqianzhi();
if(s5==0||TH<=gaowen||RH>=dishi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(50);
fm=1;
delay(50);
led1=0;
delay(50);
led1=1;
delay(50);
led2=0;
delay(50);
led2=1;
delay(50);
piancha4=TH-gaowen;
if(piancha4>=1&&piancha4<3)
piancha4=30;
else if(piancha4>3&&piancha4<6)
piancha4=40;
else if(piancha4>6&&piancha4<10)
piancha4=60;
else
piancha4=80;
delay(4);
motor1(piancha4);
delay(1);
IN1=1;
IN2=0;
piancha2=dishi-RH;
if(piancha2>=1&&piancha2<=5)
piancha2=30;
else if(piancha2>5&&piancha2<10)
piancha2=40;
else if(piancha2>10&&piancha2<20)
piancha2=60;
else
piancha2=80;
delay(1);
motor2(piancha2);
IN3=0;
IN4=1;
}
}
void jingbao7() //温度高于上限{
while((TH>gaowen)&&((RH>dishi)&&(RH<gaoshi)))
{
read_wsd();
dangqianzhi();
if(s5==0||TH<=gaowen||RH<=dishi||RH>=gaoshi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(10);
fm=1;
delay(10);
led1=0;
delay(50);
led1=1;
delay(50);
piancha4=TH-gaowen;
if(piancha4>=1&&piancha4<=3)
piancha4=30;
else if(piancha4>3&&piancha4<6)
piancha4=40;
else if(piancha4>6&&piancha4<10)
piancha4=60;
else
piancha4=80;
motor1(piancha4);
delay(1);
IN1=1;
IN2=0;
}
}
void jingbao8() //温湿度高于上限{
while((TH>gaowen)&&(RH>gaoshi))
{
read_wsd();
dangqianzhi();
if(s5==0||TH<=gaowen||RH<=gaoshi)
{
TR0=0;
en1=0;
en2=0;
break;
}
fm=0;
delay(50);
fm=1;
delay(50);
led1=0;
delay(50);
led1=1;
delay(50);
led2=0;
delay(50);
led2=1;
delay(50);
piancha4=TH-gaowen;
if(piancha4>=1&&piancha4<3)
piancha4=30;
else if(piancha4>3&&piancha4<6)
piancha4=40;
else if(piancha4>6&&piancha4<10)
piancha4=60;
else
piancha4=80;
motor1(piancha4);
IN1=1;
IN2=0;
piancha3=RH-gaoshi;
if(piancha3>=1&&piancha3<=5)
piancha3=20;
else if(piancha3>5&&piancha3<10)
piancha3=40;
else if(piancha3>10&&piancha3<20)
piancha3=60;
else
piancha3=80;
motor2(piancha3);
IN3=1;
IN4=0;
}
}
void main()
{
init();
xianshi();
xiefanwei();
while(1)
{
read_wsd();
dangqianzhi();
if(s5==0)
break;
}
while(1)
{
num1=0;
if(s5==0)
{
delay(5);
TR0=0;
en1=0;
en2=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
if(s5==0)
{
while(!s5);
num1++;
while(num1!=0)
{
TR0=0;
en1=0;
en2=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
fm=1;
led1=1;
led2=1;
keyscan();
}
}
}
if(num1==0)
{
while(1)
{
if(s5==0)
{
TR0=0;
en1=0;
en2=0;
break;
}
read_wsd();
dangqianzhi();
keyscan();
if((TH>diwen&&TH<gaowen)&&(RH>dishi&&RH<gaoshi))
{
TR0=0;
en1=0;
en2=0;
}
if((TH<diwen)&&(RH<dishi))
{
jingbao1();
}
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)&&(TH<gaowen)&&(RH>gaoshi))
{
jingbao5();
}
if((TH>gaowen)&&(RH<dishi))
{
jingbao6();
}
if((TH>gaowen)&&((RH>dishi)&&(RH<gaoshi)))
{jingbao7();
}
if((TH>gaowen)&&(RH>gaoshi))
{
jingbao8();
}
}
}
}
}。