锅炉水温自动控制系统.docx
《锅炉水温自动控制系统.docx》由会员分享,可在线阅读,更多相关《锅炉水温自动控制系统.docx(30页珍藏版)》请在冰点文库上搜索。
锅炉水温自动控制系统
锅炉内胆动态水温实值控制设计
刘世斌(LIUSHI-bin)
(大庆石油学院华瑞学院自动控制工程系黑龙江哈尔滨150027;E-mail:
****************)
摘要:
本设计采用一块单片机(STC89C52)作为涡炉水温闭环控制系统的控制核心,实现人工设定温度,自动控制温度,显示水的实时温度等功能。
水温测试方式采用数字温度传感器DS18B20感知器皿中水的温度,通过单片机STC89C52与数字温度传感器DS18B20通讯获得实时温度,并通过程序实现闭环控制。
采用键盘扫描方式对目标温度(0℃~80℃或20~60℃)进行人工设定,并用LCD1602显示水的实时温度、给定温度及温度范围。
同时系统还通过继电器电路控制加热器件的导通与关闭,达到保持设定温度基本不变的目的,并起到强弱点隔离作用,安全可靠。
水温控制算法通过程序对给定温度与实时温度的判断,实现温度调节,其精确度可达1℃。
并设有一定的保护措施,当实时温度不在设定的安全温度范围时系统将报警。
关键词:
单片机(STC89C52),自动控制,闭环控制
Abstract:
Thisdesignusesamicrocontroller(STC89C52)asthevortexfurnacetemperaturecontrolsystem,closedloopcontrolcoreoftheartificialsettingsandautomatictemperaturecontrol,displayreal-timewatertemperatureandotherfunctions.TemperaturetestmethodusingdigitaltemperaturesensorDS18B20sensingthetemperatureofwaterincontainersthroughthemicrocontrolleranddigitaltemperaturesensorDS18B20STC89C52communicationaccessreal-timetemperature,andclosedloopthroughtheprogram.Usingthekeyboardscanningthetargettemperature(0℃~80℃or20~60℃)inartificialsettings,andwiththeLCD1602displayreal-timewatertemperature,foragiventemperatureandtemperaturerange.Systemalsocontroltheheaterthroughtherelaycircuitpartsturnonandoff,tomaintainthesettemperatureisessentiallythesamepurposeandhasplayedtheroleofstrongandweakpointofisolation,safeandreliable.Temperaturecontrolalgorithmforagiventemperaturethroughtheprocesswithreal-timetemperatureofthejudge,toachievetemperatureregulationwithanaccuracyupto1℃.Andhassomeprotectivemeasures,real-timetemperatureisnotsetwhenthesecuritysystemwillalarmwhenthetemperaturerange.Keywords:
microcontroller(STC89C52),automaticcontrol,closed-loopcontrol
Keywords:
microcontroller(STC89C52),automaticcontrol,closed-loopcontrol
1.系统设计
1.1设计要求
1.1.1基本要求
(1)要求采用直接数字控制(DDC)对锅炉水温进行控制,使其温度稳定在给定的值上;
(2)具有键盘输入温度给定值,能显示当前温度值;
(3)温度达到极限时提醒操作人员注意的功能。
1.1.2发挥部分
(1)具有设定温度范围的功能,并显示给定值、当前值及温度范围;
(2)温度控制精度达到1℃;
(3)采用软件实现闭环控制,降低成本;
(4)通过继电器实现对加热器件的控制,起到隔离保护作用。
1.2系统基本方案
根据题目要求,系统可以划分为控制器模块,温度测量模块,水温加热模块,显示模块。
最终选定的整体系统框图如图1.2.1所示。
为了实现各模块的功能,分别做了几种不同的设计方案并进行了论证。
图1.2.1
1.2.1各模块的方案选择和论证
(1)控制器模块
采用STC公司的STC89C52作为系统的控制器。
单片机算术运算功能强,软件编程灵活,自由度大,可用软件编程实现各种算法,并且具有功耗低,体积小,技术成熟,成本低廉等有点,使其在各个领域应用广泛。
(2)水温探测模块
水温探测模块用于测量器皿中水的温度。
系统需要利用测温传感器检测出水的实时温度,是控制模块做出正确的反应,控制水的温度。
采用单总线可编程温度传感器测温度。
DS18B20数字可编程温度传感器可测温范围-55℃~+125℃,在-10~+85℃时精度为0.5℃。
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
并且其所需辅助电路简单,依靠程序直接读取温度,总费用低。
(3)显示模块
使用LCD1602液晶显示屏显示水温。
液晶显示屏(LED)具有轻薄短小,低耗电量,无辐射危险,平面直角显示以及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点,且显示更为人性化,电路焊接更为简单。
(4)水温控制模块
水温控制模块用来控制加热器件的导通与关闭,从而达到控制加热时间,控制水温的目的。
采用继电器驱动电路控制。
继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。
故在电路中起着自动调节、安全保护、转换电路等作用。
电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。
这样吸合、释放,从而达到了在电路中的导通、切断的目的。
对于继电器的“常开、常闭”触点,可以这样来区分:
继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
2.单元电路设计
2.1水温测量电路的设计
2.1.1DS18B20单线数字温度传感器
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
(1)DS18B20的复位时序
DS18B20单线数字温度传感器复位时序图
(2)DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20单线数字温度传感器读时序图
(3)DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
DS18B20单线数字温度传感器写时序图
(4)DS18B20单线数字温度传感器温度/数据转换关系
图表1
2.1.2DS18B20单线数字温度传感器电路
DS18B20单线数字温度传感器电路
2.2STC89C52控制电路
2.2.1STC89C52单片机管脚图
2.2.2STC89C52单片机最小系统及外围电路接口图
STC89C52单片机最小系统及外围电路接口图
2.3LCD1602液晶显示屏电路
2.3.1LCD1602液晶显示屏
(1)LCD1602液晶显示屏主要技术参数
(2)LCD1602液晶显示屏引脚说明
LCD1602液晶显示屏引脚图
1602采用标准的14脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
另外引脚"A"和"K"为背光引脚,"A"接正,"K"接负便会点亮背光灯。
这两个管脚可以不接置空。
(3)LCD1602液晶显示屏指令说明
LCD1602液晶显示屏指令表
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
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:
读数据
2.3.2LCD1602液晶显示屏显示电路图
LCD1602液晶显示屏与STC89C52连接显示电路图
2.4继电器电路
2.4.1继电器主要技术参数
HK4100F电磁继电器
主要技术参数:
型号:
HK4100F-DC5V-SH
外形尺寸(mm):
10.5*15.5*11.8mm(W*L*H)
触点形式:
1C(SPDT)触点负载:
3A220VAC/30VDC
阻抗:
≤100mΩ额定电流:
3A
电气寿命:
≥10万次机械寿命:
≥1000万次
阻值(士10%):
120Ω线圈功耗:
0.2W
额定电压:
DC5V吸合电压:
DC3.75V
释放电压:
DC0.5V工作温度:
-25℃~+70℃
绝缘电阻:
≥100MΩ
线圈与触点间耐压:
4000VAC/1分钟
触点与触点间耐压:
750VAC/1分钟
2.4.2HK4100F继电器驱动电路原理
HK4100F继电器驱动电路原理图如下图所示,三极管Q1的基极B接到单片机的P3.6,三极管的集电极极C接到继电器线圈的一端,线圈的另一端接到+5V电源VCC上;继电器线圈两端并接一个二极管IN4148,用于吸收释放继电器线圈断电时产生的反向电动势,防止反向电势击穿三极管Q1及干扰其他电路;R6和发光二极管LED1组成一个继电器状态指示电路,当继电器吸合的时候,LED1点亮,这样就可以直观的看到继电器状态了。
HK4100F继电器驱动电路原理图
(1)当STC89C52单片机的P3.6引脚输出低电平时,三极管Q1饱和导通,+5V电源加到继电器线圈两端,继电器吸合,同时状态指示的发光二极管也点亮,继电器的常开触点闭合,相当于开关闭合。
(2)当STC89C52单片机的P3.6引脚输出低电平时,三极管Q1截止,继电器线圈两端没有电位差,继电器衔铁释放,同时状态指示的发光二极管也熄灭,继电器的常开触点释放,相当于开关断开。
注:
在三极管截止的瞬间,由于线圈中的电流不能突变为零,继电器线圈两端会产生一个较高电压的感应电动势,线圈产生的感应电动势则可以通过二极管IN4148释放,从而保护了三极管免被击穿,也消除了感应电动势对其他电路的干扰,这就是二极管D1的保护作用。
2.5键盘电路
2.5.1键盘电路图
键盘电路图
2.5.2按键说明
S2调小给定温度值,每按一下给定温度值减一;
S3调大给定温度值,每按一下给定温度值加一;
S4切换温度范围,每按一下切换一次,默认为(0℃~80℃),还可切换为(20℃~60℃);
S6闭合则启动温度自动控制,断开则扫描按键。
2.6蜂鸣器报警电路
2.6.1蜂鸣器报警电路图
当STC89C52的P3.7端输出为高电平时,蜂鸣器则报警;当P3.7输出为低电平时,则属于正常情况,蜂鸣器不响。
3.软件设计
3.1软件框图
软件框图
3.2各模块主要程序
3.2.1LCD1602程序
#include
#include
#include"LCM1602.h"
#definelcd_rsP2_7
#definelcd_rwP2_6
#definelcd_eP2_5
#definelcd_busP0//数据指令的输入/输出端口
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
voiddel_nop(){;}
voiddel_1ms(uinttimecounter)//更好的延时程序1709
{
uintj;
registeri;
j=timecounter;
while
(1)
{
for(i=71;i>0;i--);
j--;
if(j==0)break;
}
}
/**********判断忙标志,返回的是一个位BF**********/
bitlcd_busy(void)
{
registerbflag;/*bflagisthebusyflagBF*/
lcd_rs=0;
lcd_rw=1;
_nop_();
lcd_e=1;
del_nop();
bflag=lcd_bus;
lcd_e=0;
return(bit)(bflag&0x80);/*returntheBFflagbit*/
}
/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:
判断;为0:
不判断****************/
voidlcd_wrcmd(ucharcmd,bitbusyflag)
{
if(busyflag==1)
while(lcd_busy());
lcd_bus=cmd;
lcd_rs=0;
lcd_rw=0;
del_nop();
lcd_e=1;
del_nop();
del_nop();
lcd_e=0;
lcd_bus=0xff;/*needed?
*/
}
/*********指定要显示的位置************/
voidmoveto(ucharposition)
{
ucharconstcmd=0x80;
position-=1;
if(position>32)/*如果大于32,则光标移回上一行*/
position=0;
if(position>=16)/*如果大于16,则光标移到下一行*/
position+=0x30;
//cmd=cmd|position;/*指定初始的位置*/
//lcd_wrcmd(cmd,1);
lcd_wrcmd(position|cmd,1);
}
/************向液晶片写数据***************/
voidlcd_wrdata(ucharlcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
lcd_rs=1;
lcd_rw=0;
del_nop();
lcd_e=1;
del_nop();
del_nop();
lcd_e=0;
lcd_bus=0xff;
}
/************液晶片初始化***************/
voidlcd_init(void)
{
lcd_wrcmd(0x38,0);/*twolines,5x7,8bit*/
del_1ms(5);
lcd_wrcmd(0x38,0);/*twolines,5x7,8bit*/
del_1ms(5);
lcd_wrcmd(0x38,0);/*twolines,5x7,8bit*/
del_1ms(5);
lcd_wrcmd(0x38,1);
lcd_wrcmd(0x0c,1);
lcd_wrcmd(0x06,1);
lcd_wrcmd(0x01,1);
}
/************向液晶片写字符串***************/
voidlcd_wrstr(uchar*str,ucharposition)
{
registeri,j;
j=position;
moveto(j);
for(i=0;j<32,str[i]!
='\0';i++)
{
if(j++==17)moveto(17);
lcd_wrdata(str[i]);
}
}
3.2.2DS18B20程序
#include
#include
#include"LCM1602.h"
#defineBUSY1(DQ1==0)
sbitDQ1=P1^0;
//sbitDOWN_30=P3^0;
//sbitUP_31=P3^1;
sbitON_OR_OFF_35=P3^5;
//sbitRANGE_34=P3^4;
sbitCONTROL_36=P3^6;
sbitALARM_37=P3^7;
unsignedcharidataTMP=0;
voidwr_ds18_1(chardat);
unsignedcharrd_ds18_1();
/***************延时程序,单位us,大于10us*************/
voidtime_delay(unsignedchartime)
{
time=time-10;
time=time/6;
while(time!
=0)time--;
}
/*****************************************************/
/*resetds18b20*/
/*****************************************************/
voidds_reset_1(void)
{
unsignedcharidatacount=0;
DQ1=0;
time_delay(240);
time_delay(240);
DQ1=1;
return;
}
voidcheck_pre_1(void)
{
while(DQ1);
while(~DQ1);
time_delay(30);
}
voidread_ROM(void)
{
intn;
intROM[8];
ds_reset_1();
check_pre_1();
wr_ds18_1(0x33);
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
}
/*****************************************************/
/*Readabitfrom1820位读取*/
/*****************************************************/
bittmrbit_1(void)
{
idatachari=0;
bitdat;
DQ1=0;_nop_();
DQ1=1;
_nop_();
_nop_();
_nop_();
_