温湿度控制器上下限继电器设计报告.docx
《温湿度控制器上下限继电器设计报告.docx》由会员分享,可在线阅读,更多相关《温湿度控制器上下限继电器设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
温湿度控制器上下限继电器设计报告
温湿度控制器设计报告
本设计研究单片机数字温湿度控制器,通过全数字型温湿度传感器测量宽范围的温湿度数据,用来满足恒温湿车间控制、大棚温湿度控制等工农业生产领域需要,要求温湿度测量响应时间快、长期稳定性好,抗干扰能力强,具有较高的应用价值。
一、性能特点
●配用全数字型温湿度传感器DHT11,温度测量范围0℃--100℃,湿度测量范围0%RH—90%RH,可以满足一般需要。
若要求更宽测量范围,只需更换温湿度传感器型号,硬件电路及软件程序全兼容。
●温湿度测量响应时间快、长期稳定性好。
●采用先进的专用微处理器芯片STC89C52,可靠性高,抗干扰能力强。
●配用EEPROM芯片AT24C04,使存储的温度上下限和湿度上下限可以掉电永久保存。
●可以通过四个按键方便地实现温湿度上下限的调整。
●当温度或湿度超限后,报警信号点亮相应报警灯。
●配用三极管和继电器,可以通过驱动继电器打开或切断风机、加热器等外部设备。
二、功能说明
1、实时测量当前温度值和湿度值,在液晶屏动态显示。
2、可以显示当前允许温度范围,在液晶屏显示,如“20-45”表示允许温度范围为20摄氏度至45摄氏度。
3、可以显示当前允许湿度范围,在液晶屏显示,如“15-60”表示允许湿度范围为15%至60%。
4、当温度低于温度下限时,低温报警灯亮,控制继电器动作。
5、当温度高于温度上限时,高温报警灯亮,控制继电器动作。
6、当湿度低于湿度下限时,低湿报警灯亮,控制继电器动作。
7、当湿度高于湿度上限时,高湿报警灯亮,控制继电器动作。
8、可以通过键盘调整温度上下限和湿度上下限,具体方法是连续按设置键直至温度下限、温度上限、湿度下限、湿度上限相应的位置闪烁,再通过Up键和Down键调整数值,调整完毕继续按设置键进入正常状态。
9、可以保存设置参数至EEPROM中,具体方法是按保存键,此时当前设置参数存盘,重新上电显示新的设置值。
如果不按保存键,所调整的设置参数只在此次运行有效,关电后恢复原先设定值。
三、硬件设计
1、设计框图
本研究设计的温湿度控制器框图如图1所示。
图1温湿度控制器方框图
图中STC89C52单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示。
液晶屏上同时可以显示温湿度上下限值,该上下限设置值保存外外部EEPROM存储器中,掉电不失,并且可以通过四只按键上调或下调。
当温度或湿度值超过上下限值时,报警信号点亮相应报警灯。
同时该报警信号通过三极管驱动继电器,以控制外部风机或加热器。
2、温湿度传感器器及检测电路
图2DHT11温湿度传感器外型及管脚
DHT11温湿度传感器外型及管脚如图2所示。
其中电源引脚的供电电压为3.5--5.5V。
传感器上电后,要等待1s以越过不稳定状态在此期间不要发送任何指令。
电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
DHT11典型应用电路如图3所示,其连接电路简单,只需要占用控制器一个I/O口即可完成上下位的连接。
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻,
图3DHT11典型应用电路
DHT11数字湿温度传感器采用单总线数据格式,即单个数据引脚端口完成输入输出双向传输。
其数据包由5Byte(40Bit)组成。
一次完整的数据传输为40bit,高位先出。
数据格式如表一:
表1DHT11数据格式
3、单片机电路
(1)STC89C52单片机特点
●增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;
●工作电压:
5.5V-3.5V(5V单片机);
●工作频率范围:
0~40MHz,相当于普通8051的0~80MHz;
●用户应用程序空间4K//8K/16k/32K/64K字节;
●片上集成1280字节RAM;
●通用I/O口(32/36个),复位后为准双向口/弱上拉(普通8051传统I/O口);
●ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器。
●每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA;
●可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;
●有EEPROM功能;
●看门狗;
●内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);
●时钟源:
外部高精度晶体/时钟,内部R/C振荡器;
●用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟;
●常温下内部R/C振荡器频率为:
5.0V单片机为:
11MHz~17MHz;
●共4个16位定时器,两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器;
●外部中断I/O口4路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,PowerDown模式可由外部中断唤醒;
●通用全双工异步串行口(UART);
●工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级);
●封装:
PDIP-40,PLCC-44。
(2)STC89C52单片机管脚及封装
STC89C52单片机有多种封装形式,本设计中选用40DIP封装,其管脚定义如图4所示。
其最小应用系统如图5所示。
图4STC89C52管脚图
图5单片机最小系统
(4)单片机电路
由STC89C52组成的温湿度控制器单片机系统原理图如图6所示。
图中DATA引脚为温湿度传感器单总线引脚,单片机通过该引脚和传感器通信,读取温湿度数据。
K1、K2、K3、K4为四只调节按键,分别为设置键、上调键、下调键和保存键,用以调整温湿度上下限值并保存数据。
L2、L3、L4、L5为四只报警灯,其中L2为低温报警,L3为高温报警,L4为低湿报警,L5为高湿报警。
图6单片机系统原理图
4、显示电路
显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:
表2液晶屏技术指标
接口信号说明如表3所示。
表3液晶屏接口信号说明
与单片机接口电路如图7所示。
图7LCD与单片机接口电路
5、温湿度上限存储
温湿度阈值存储在EEPROM芯片AT24C04中,并可以通过K1—K4按键调节并保存,其中K1、K2、K3、K4分别为设置键、上调键、下调键和保存键。
AT24C04是IIC芯片,其电路如图8所示。
图8EEPROM存储电路
6、继电器驱动电路
当温湿度数据超过正常范围时,单片机发出继电器动作信号。
该低电平信号通过三极管方法,驱动继电器线圈得电,继电器结点动作。
该结点可以控制空调、加热器、抽风机等电器,以控制温湿度范围。
具体电路如图9所示。
图9继电器电路
四、Portel电路图设计
Protel是目前国内最流行的通用EDA软件,它是将电路原理图设计、PCB板图设计、电路仿真和PLD设计等多个实用工具软件组合后构成的EDA工作平台,是第一个将EDA软件设计成基于Windows的普及型产品。
它集成了软件界面、仿真功能和PLD设计和信号完整性分析,在此基础上Protel99SE又增加了一些新的功能,用户使用更加方便灵活。
Protel的功能十分强大,在电子电路设计领域占有极其重要的地位。
它以其强大功能和实用性,逐渐获得广大硬件设计人员的青睐,是目前众多EDA设计软件中用户最多的产品之一。
Protel软件组成
Protel软件主要由电路原理图设计模块、印制电路板设计模块(PCB设计模块)、电路信号仿真模块和PLD逻辑器件设计模块等组成,各模块具有强大的功能,可以很好的实现电路设计与分析。
(1)原理图设计模块(Schematic模块)
电路原理图是表示电气产品或电路工作原理的重要技术文件,电路原理图主要由代表各种电子器件的图形符号、线路和结点组成。
图4.1所示为一张电路原理图。
该原理图是由Schematic模块设计完成的。
Schematic模块具有如下功能:
丰富而灵活的编辑功能、在线库编辑及完善的库管理功能、强大的设计自动化功能、支持层次化设计功能等。
(2)印制电路板设计模块(PCB设计模块)
印制电路板(PCB)制板图是由电路原理图到制作电路板的桥梁。
设计了电路原理图后,需要根据原理图生设计成印制电路板的制板图,然后在根据制板图制作具体的电路板。
印制电路板设计模块具有如下主要功能和特点:
可完成复杂印制电路板(PCB)的设计;方便而又灵活的编辑功能;强大的设计自动化功能;在线式库编辑及完善的库管理;完备的输出系统等。
(3)电路信号仿真模块
电路信号仿真模块是一个功能强大的数字/模拟混合信号电路仿真器,能提供连续的模拟信号和离散的数字信号仿真。
它运行在Protel的EDA/Client集成环境下,与ProtelAdvancedSchematic原理图输入程序协同工作,作为AdvancedSchematic的扩展,为用户提供了一个完整的从设计到验证仿真设计环境。
在Protel中进行仿真,只需从仿真用元器件库中放置所需的元器件,连接好原理图,加上激励源,然后单击防真按钮即可自动开始。
五、软件编程
1、软件流程图
本设计软件主程序流程图如图13所示。
图13主程序流程图
2、主程序
下面介绍main.c主程序编写,其他程序略。
(1)头文件和一些宏定义
#include
#include"1602.h"
#include"dht.h"
#include"2402.h"
(2)管脚定义
//定义三个LED灯
sbitL2=P1^3;
sbitL3=P1^4;
sbitL4=P1^5;
sbitL5=P1^6;
sbitKey_SET=P3^2;//设置键
sbitKey_UP=P3^3;//加键
sbitKey_DOWN=P3^4;//减键
sbitKey_SAVE=P3^5;//保存键
sbitRelay=P2^0;
(3)常量、变量定义
//定义标识
volatilebitFlagStartRH=0;//开始温湿度转换标志
volatilebitFlagKeyPress=0;//有键按下
//定义温湿度传感器用外部变量
externU8U8FLAG,k;
externU8U8count,U8temp;
externU8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
externU8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
externU8U8comdata;
externU8count,count_r;
U16temp;
S16temperature,humidity;
S16idataTH,TL,HH,HL;//温度上限和湿度上限
char*pSave;
U8keyvalue,keySET,keySAVE,keyUP,keyDOWN;
//定义变量
U16RHCounter;
U8FlagSet,hide;
(4)各子程序
//数据初始化
voidData_Init()
{
RHCounter=0;
L2=1;
L3=1;
L4=1;
TH=40;
TL=20;
HH=85;
HL=20;
keyvalue=0;
keySET=1;
keySAVE=1;
keyUP=1;
keyDOWN=1;
FlagSet=0;
hide=0;
}
//定时器0初始化
voidTimer0_Init()
{
ET0=1;//允许定时器0中断
TMOD=1;//定时器工作方式选择
TL0=0x06;
TH0=0xf8;//定时器赋予初值
TR0=1;//启动定时器
}
//定时器0中断
voidTimer0_ISR(void)interrupt1using0
{
TL0=0x06;
TH0=0xf8;//定时器赋予初值
RHCounter++;
//设闪烁标志
if(RHCounter>400)hide=0;
elsehide=1;
//每2秒钟启动一次温湿度转换
if(RHCounter>=800)
{
FlagStartRH=1;
RHCounter=0;
}
}
//存入设定值、
voidSave_Setting()
{
pSave=(char*)&TL;//地址低位对应低8位,高位对应高8位
wrteeprom(0,*pSave);//存温度上限值TH低8位
DELAY(500);
pSave++;
wrteeprom(1,*pSave);//存温度上限值TH高8位
DELAY(500);
pSave=(char*)&TH;
wrteeprom(2,*pSave);//存温度下限值TL低8位
DELAY(500);
pSave++;
wrteeprom(3,*pSave);//存温度下限值TL高8位
DELAY(500);
pSave=(char*)&HL;//地址低位对应低8位,高位对应高8位
wrteeprom(4,*pSave);//存湿度上限值HH低8位
DELAY(500);
pSave++;
wrteeprom(5,*pSave);//存湿度上限值HH高8位
DELAY(500);
pSave=(char*)&HH;
wrteeprom(6,*pSave);//存湿度下限值HL低8位
DELAY(500);
pSave++;
wrteeprom(7,*pSave);//存湿度下限值HL高8位
DELAY(500);
}
//载入设定值、
voidLoad_Setting()
{
pSave=(char*)&TL;
*pSave++=rdeeprom(0);
*pSave=rdeeprom
(1);
pSave=(char*)&TH;
*pSave++=rdeeprom
(2);
*pSave=rdeeprom(3);
pSave=(char*)&HL;
*pSave++=rdeeprom(4);
*pSave=rdeeprom(5);
pSave=(char*)&HH;
*pSave++=rdeeprom(6);
*pSave=rdeeprom(7);
if((TL>99)||(TL<0))TL=20;
if((TH>99)||(TH<0))TH=40;
if((HL>99)||(HL<0))HH=20;
if((HH>99)||(HH<0))HH=85;
}
voidKeyProcess(uintnum)
{
//键盘设置功能:
通过设置键和加、减键修改当前设置,只有按下保存键才存盘,否则掉电不保存。
switch(num)
{
case1:
//设置键按下,依次设定TL\TH\HL\HH\退出
FlagSet++;
if(FlagSet>4)
{
FlagSet=0;
L1602_char(1,12,TL/10+48);
L1602_char(1,13,TL%10+48);
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
L1602_char(2,12,HL/10+48);
L1602_char(2,13,HL%10+48);
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
}
break;
case2:
//加键按下
if(FlagSet==1)//设TL
{
if(TL<100)TL++;
L1602_char(1,12,TL/10+48);
L1602_char(1,13,TL%10+48);
}
if(FlagSet==2)//设TH
{
if(TH<100)TH++;
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
}
if(FlagSet==3)//设HL
{
if(HL<100)HL++;
L1602_char(2,12,HL/10+48);
L1602_char(2,13,HL%10+48);
}
if(FlagSet==4)//设HH
{
if(HH<100)HH++;
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
}
break;
case3:
//减键按下
if(FlagSet==1)//设TL
{
if(TL>0)TL--;
L1602_char(1,12,TL/10+48);
L1602_char(1,13,TL%10+48);
}
if(FlagSet==2)//设TH
{
if(TH>0)TH--;
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
}
if(FlagSet==3)//设HL
{
if(HL>0)HL--;
L1602_char(2,12,HL/10+48);
L1602_char(2,13,HL%10+48);
}
if(FlagSet==4)//设HH
{
if(HH>0)HH--;
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
}
break;
case4:
//保存键按下
Save_Setting();
FlagSet=0;
break;
default:
break;
}
}
/********************************************************************
*名称:
Main()
*功能:
主函数
***********************************************************************/
voidmain()
{
U16i,j,testnum;
EA=0;
Timer0_Init();//定时器0初始化
Data_Init();
EA=1;
L1602_init();
L1602_string(1,1,"WelcometoT&H");
L1602_string(2,1,"ControlSystem!
");
//延时
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
{;}
//清屏
L1602_string(1,1,"");
L1602_string(2,1,"");
L1602_string(1,1,"Tem:
C-");
L1602_string(2,1,"Hum:
%-");
//载入温度上限和湿度上限设定值
Load_Setting();
L1602_char(1,12,TL/10+48);
L1602_char(1,13,TL%10+48);
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
L1602_char(2,12,HL/10+48);
L1602_char(2,13,HL%10+48);
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
while
(1)
{
//温湿度转换标志检查
if(FlagStartRH==1)
{
TR0=0;
testnum=RH();
FlagStartRH=0;
TR0=1;
//读出温湿度,只取整数部分
humidity=U8RH_data_H;
temperature=U8T_data_H;
//显示温湿度
L1602_int(1,5,temperature);
L1602_int(2,5,humidity);
}
//闪烁显示
if(hide==1)
{
switch(FlagSet)
{
case0:
break;
case1:
L1602_string(1,12,"");
break;
case2:
L1602_string(1,15,"");
break;
case3:
L1602_string(2,12,"");
break;
case4:
L1602_string(2,15,"");
break;
}
}
else
{
L1602_char(1,12,TL/10+48);
L1602_char(1,13,TL%10+48);
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
L1602_char(2,12,HL/10+48);
L1602_char(2,13,HL%10+48);
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
}
//温湿度控制
//温度低于下限
if(temperatureelseL2=1;
//温度高于上限
if