棚室温湿度的论文.docx
《棚室温湿度的论文.docx》由会员分享,可在线阅读,更多相关《棚室温湿度的论文.docx(24页珍藏版)》请在冰豆网上搜索。
棚室温湿度的论文
关于智能控制大赛“棚室温湿度控制系统”的论文
组员:
曾健华
黄建
黄顺尧
年级:
2011级4班
时间:
2013年4月25日
1、绪论
1.设计任务
设计并制作一个棚室温度控制系统模型,实现对棚室内的温湿度检测和调节功能。
2.设计要求
2.1 基本要求
1)实现单个温度或湿度参数的检测并利用液晶屏显示出测量结果。
2)设定温度(20度)或湿度(90%)的下限阈值并有一定的报警措施。
3)增加加热/制冷/增湿的装置,控制其随温湿度而有规律地工作。
2.2发挥部分
1)可改动温湿度阀值并设定上下限,系统断电后能自动保存该值。
2)实现多点温度或湿度参数(每个至少两个)的检测并优化温湿度的调节规律,使之更加智能。
3)实现对棚室环境参数的定量调节,误差控制合适范围内。
这里要求温度调节最小范围在15°~30°,误差在1°;湿度不做要求。
4)通过计算机对棚室温湿度进行记录并存储温湿度数据。
5)其他创新功能。
2、实验设计
(一)实验的设计版块如下:
该设计的系统主要由上述的三大部分组成,先由测量部分测出控制的对象,再将控制对象反馈给控制系统,最后由控制系统显示结果。
(2)所用器材:
1.STC89C52单片机简介:
STC89C52是一个低电压,高性能CMOS 8位单片机,有40个引脚,32个外部双向输 入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工 串行通信口,2个读写口线,片内含8k bytes的可反复擦写的Flash只读程序存储器和 256 bytes的随机存取数据存储器(RAM) ,器件采用ATMEL公司的高密度、非易失性存储 技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。
STC89C52单片机主要引脚功能介绍,其引脚图如下图所示:
2.LCD1602液晶显示器简介
1602液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各类仪表和低功耗系统中得到广泛的应用。
1602液晶为
16字X2行的字符型液晶。
该液晶与数码管相比有如下优点:
1).位数多,可显示32位,32个数码管体积相当庞大了。
2).显示内容丰富,可显示所有数字和大、小写字母。
3).程序简单,如果用数码管动态显示,会占用很多时间来刷新显示,而1602自动完成此功能。
3.传感器DHT11简介
传感器DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的温湿度传感和数字模块采集术具有很高的稳定性和可靠性,DHT11传感器内含一个NTC测温和一个电阻式感湿元件,并与一个8位的高性能单片机相连接,在精确的测试中DHT11传感器进行过校准,以程序的形式校准系数储存在0TP内存中,检测信号的时候,在处理过程中传感器内部要调用这些校准系数,采用单线制的串行接口,使系统集成可以有较低的功耗,而且更加简单快速,信号传输距离超过20米,作为一个数字温湿度传感器DHT11具有响应快速、抗干扰强、性价比高等优点,它的性能指标如下:
湿度测量范围为20%~90%
RH;湿度测量精度为±5%RH;
温度测量范围为0~50℃,温度测量精度为±2℃,
工作电压3.0~5.5V,
相应时间<5S,DHT1l采用4针单排引脚封装,传感器通电后,需要等待1s,
这是因为要越过不稳定的状态,在此期间不需发送指令,
电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波
[7]。
典型的应用电路如下图:
(三)程序功能
1.主程序模块框图
主程序主要完成硬件初始化,子程序调用等功能。
在主程序中,对温湿度传感器、LCD1602液晶显示器的初始化,同时调用传感器数据,进行显示。
其框图如下图所示。
2.DHT11初始化模块
该流程主要对传感器的初始化进行设计,如下图所示。
3.LCD1602初始模块
LCD上电时,都必须按照一定的时序对LCD进行初始化操作,主要任务是设置LCD的工作方式,显示状态,清屏,输入方式,光标位置等。
LCD1602液晶显示器初始化框图如图4-3所示:
小结
设计中,主要以STC89C52单片机为核心,对温度和湿度的智能化检测进行了简单的设计与阐述。
对MCS-51单片机系统的温湿度检测原理与结构进行了论述。
本次设计电路采用模块化、层次化设计,以硬件为主,软件程序为辅。
用新型的智能集成温湿度传感器DHT11实现对温度、湿度的检测,将温度湿度信号通过传感器进行采集并转换成数字信号,再运用单片机STC89C52进行数据分析和处理,为显示电路提供信号。
显示部分采用字符型LCD1602液晶显示器。
系统电路简单、集成度高、工作稳定、调试方便、检测精度高。
实验证明该设计系统实现了对环境温湿度精确检测,达到了相应的效果,具有一定的实用价值。
三、附录
1.总电路图如下
2.部分电路图如下:
1)复位电路如下图所示
2)时钟电路如下图所示
3)典型的应用电路如下
4)本设计的LCD1602液晶显示器连接线路图如下图所示
5)DHT11传感器引脚连接图如下图所示。
3.相关程序设计的代码
1)主程序
#include//单片机头文件
#include//温湿度传感器头文件
#include//液晶屏显示器头文件
uchari,key_flag;
ucharset_temp_H,set_temp_H_shi,set_temp_H_ge;//设定温度的变量
ucharset_temp_L,set_temp_L_shi,set_temp_L_ge;//设定温度的变量
ucharset_humi_H,set_humi_H_ge,set_humi_H_shi;//设定湿度的变量
ucharset_humi_L,set_humi_L_ge,set_humi_L_shi;//设定湿度的变量
sbitk1=P3^2;//定义按键K1
sbitk2=P3^3;//定义按键K2
sbitk3=P3^4;//定义按键K3
sbitk4=P3^5;//定义按键K4
/////////////////////////延时函数/////////////////////////////
voiddelay(ucharx)
{
uchara,b;
for(a=0;a<20;a++)
{for(b=x;b>0;b--);}
}
/////////////////////////显示温度和湿度//////////////////////////
voiddisp_t_h()
{
write_cmd(0x8c);
write_dat(tab_lcd_num[ds3]);//显示温度十位
write_cmd(0x8d);
write_dat(tab_lcd_num[ds4]);//显示温度个位
write_cmd(0xcc);
write_dat(tab_lcd_num[ds1]);//显示湿度十位
write_cmd(0xcd);
write_dat(tab_lcd_num[ds2]);//显示湿度个位
}
///////////////////////开机显示////////////////////////////////////
voiddisp_start()
{for(i=0;i<16;i++)
{write_cmd(0x80+i);
write_dat(tab_t[i]);//温度
}
for(i=0;i<16;i++)
{write_cmd(0xc0+i);
write_dat(tab_h[i]);//湿度
}
}
///////////////////////扫描按键////////////////////////////////
voidkey_scan()
{
if(k1==0)//按下K1
{
//设置温度上限///////////////////////////////
if(key_flag==0)//按键标志0
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_temp_H[i]);//显示SETTEMPERATURE字符
while(k4==1)//按下K4
{
if(k2==0)//按下K2
{while(k2==0);
set_temp_H++;//设置温度数值加
if(set_temp_H==100)//到100,清0
set_temp_H=0;
}
if(k3==0)//按下K3
{while(k3==0);//松手检测
set_temp_H--;//设置温度数值减
if(set_temp_H==0)//到0,加为100
set_temp_H=100;
}
set_temp_H_ge=set_temp_H%10;//计算设置温度个位
set_temp_H_shi=set_temp_H/10;//计算设置温度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_temp_H_shi]);//显示设置温度个位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_temp_H_ge]);/显示设置温度十位
}
delay(200);
}
//设置温度下限///////////////////////////////
if(key_flag==1)//按键标志1
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_temp_L[i]);//显示SETTEMPERATURE字符
while(k4==1)//按下K4
{
if(k2==0)//按下K2
{while(k2==0);
set_temp_L++;//设置温度数值加
if(set_temp_L==100)//到100,清0
set_temp_L=0;
}
if(k3==0)//按下K3
{while(k3==0);//松手检测
set_temp_L--;//设置温度数值减
if(set_temp_L==0)//到0,加为100
set_temp_L=100;
}
set_temp_L_ge=set_temp_L%10;//计算设置温度个位
set_temp_L_shi=set_temp_L/10;//计算设置温度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_temp_L_shi]);//显示设置温度个位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_temp_L_ge]);//显示设置温度十位
}
}
////设置湿度上限//////////////////////////////////////////////////
if(key_flag==2)//按键标志2
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_humi_H[i]);//显示SETHUMIDITY字符
while(k4==1)
{
if(k2==0)
{while(k2==0);
set_humi_H++;//设置湿度数值加
if(set_humi_H==100)
set_humi_H=0;
}
if(k3==0)
{while(k3==0);
set_humi_H--;//设置湿度数值减
if(set_humi_H==0)
set_humi_H=100;
}
set_humi_H_ge=set_humi_H%10;//计算设置湿度个位
set_humi_H_shi=set_humi_H/10;//计算设置湿度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_humi_H_shi]);//显示设置湿度十位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_humi_H_ge]);//显示设置湿度个位
}
}
////设置湿度下限//////////////////////////////////////////////////
if(key_flag==3)//按键标志3
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_humi_L[i]);//显示SETHUMIDITY字符
while(k4==1)
{
if(k2==0)
{while(k2==0);
set_humi_L++;//设置湿度数值加
if(set_humi_L==100)
set_humi_L=0;
}
if(k3==0)
{while(k3==0);
set_humi_L--;//设置湿度数值减
if(set_humi_L==0)
set_humi_L=100;
}
set_humi_L_ge=set_humi_L%10;//计算设置湿度个位
set_humi_L_shi=set_humi_L/10;//计算设置湿度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_humi_L_shi]);//显示设置湿度十位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_humi_L_ge]);//显示设置湿度个位
}
}
//按键功能结束////////////////////////////////////////////
key_flag++;
if(key_flag==4)//按键标志5
key_flag=0;
write_cmd(0x01);//清屏
disp_start();//显示字符
}
}
////////////比较数据,开启或关闭继电器////////////////////////////////////
voidbijiao()
{
if(U8T_data_H>set_temp_H)//如果温度大于设置温度上限,打开超出温度上限温度继电器和温度LED
temp_out=0;//P1.1
elsetemp_out=1;//否则关闭超出温度上限温度继电器和温度LED
if(U8T_data_Htemp_led=0;//P1.3
elsetemp_led=1;//否则关闭低于温度下限温度继电器和温度LED
if(U8RH_data_H>set_humi_H)//如果湿度大于设置湿度上限,打开超出湿度上限继电器和湿度LED
humi_out=0;//P1.2
elsehumi_out=1;//否则关闭超出湿度上限继电器和湿度LED
if(U8RH_data_Hhumi_led=0;//P1.4
elsehumi_led=1;//否则关闭低于湿度下限继电器和湿度LED
}
/////////主函数/////////////////////////////////////////////////
voidmain()
{
init_lcd();//初始化液晶1602
disp_start();//显示字符
RH();//读取DHT11温湿度数值
convdat();//转换DHT11温湿度数值
disp_t_h();//显示温度和湿度
while
(1)
{
key_scan();//扫描按键
count++;//计数器加
if(count==100)//到100,转换温湿度数据
{count=0;
RH();
convdat();}
disp_t_h();//显示温度和湿度
bijiao();//比较数据控制继电器动作
}
}
2)DHT11初始化模块
#include//_nop_();延时函数
#defineucharunsignedchar
#defineuintunsignedint
sbittemp_out=P1^1;
sbithumi_out=P1^2;
sbittemp_led=P1^3;
sbithumi_led=P1^4;
uintcount;
uchards1,ds2,ds3,ds4;
ucharU8FLAG,k;
ucharU8count,U8temp;
ucharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
ucharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
ucharU8comdata;
uintU16temp1,U16temp2;
sbitIO=P1^0;
//
voidDelay1(uintj)
{
uchari;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)
{
uchari=5;
for(;i>0;i--);
}
voidCOM(void)
{
uchari;
for(i=0;i<8;i++)
{
U8FLAG=2;
//---------------------
while((!
IO)&&U8FLAG++);
Delay_10us();
Delay_10us();
//Delay_10us();
U8temp=0;
if(IO)U8temp=1;
U8FLAG=2;
while((IO)&&U8FLAG++);
//----------------------
//P2_1=0;
//P2_1=1;
//----------------------
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//--------------------------------
voidRH(void)
{
IO=0;
Delay1(180);
IO=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
IO=1;
if(!
IO)
{
U8FLAG=2;
while((!
IO)&&U8FLAG++);
U8FLAG=2;
while((IO)&&U8FLAG++);
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
IO=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;//数据采集读取
}
}
}
voidconvdat()
{
ds1=U8RH_data_H/10;//湿度个位
ds2=U8RH_data_H%10;
ds3=U8T_data_H/10;
ds4=U8T_data_H%10;
}
3)LCD1602初始模块
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
uchard;
ucharcodetab_t[]={"TEMPERATURE:
C"};
ucharcodetab_h[]={"HUMIDITY:
%"};
ucharcodetab_time[]={"TIME:
"};
ucharcodetab_set_temp_H[]={"SET_TEMP_HIGH"};
ucharcodetab_set_temp_L[]={"SET_TEMP_LOW"};
ucharcodetab_set_humi_H[]={"SET_HUMI_HIGH"};
ucharcodetab_set_humi_L[]={"SET_HUMI_LOW"};
ucharcodetab_set_hour[]={"SET_HOUR"};
ucharcodetab_lcd_num[]={'0','1','2','3','4','5','6','7','8','9'};
voiddelay_1602(ucharx)
{
uchara,b;
for(a=0;a<10;a++)
{for(b=x;b>0;b--);}
}
voidwrite_cmd(ucharx)
{
E=0;
RS=0;
RW=0;
E=1;
P0=x;
delay_1602(50);
}
/*