锅炉自动给水课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
锅炉自动给水课程设计
前言
本文主要设计了一种基于单片机的锅炉自动给水系统,本系统以8位单片机STC89C52RC 作为系统控制处理器,采用液位上下限传感器和DS18B20采集信息,采用数码管和LCM作为显示
设备,采用WT588D语音警示及报温。
系统具有液位和温度自动检测、报警和控制等功能。
本系统在设计中主要由液位检测、温度检测、按键控制、液位控制、温度控制、显示部分、故障报警等几部分组成来实现液位和温度控制。
用液位传感器检测液位,用DS18B20温度传感器来检测液温,用二个控制按键来实现按健控制,用四位7段LED显示器和LCM128*64来完成显示部分,用继电器来控制水泵的启停。
本设计用单片机控制易于实现锅炉液位、温度控制而且有成本低、程序易于调试、一部分出现故障不会影响其他部分的工作、维修方便等优点。
关键词:STC89C52单片机; 液位控制; 温度控制;报警
PREFACE
In modern society, with the development of industry, the residents living area of the centralized heat supply demand is also growing, steam boiler capacity continues to increase, the operation process requirements more stringent, the boiler liquid level control of a direct impact on people and equipment safety. Low level may make the boiler phenomenon of dry combustion, liquid level is too high will make the boiler steam pressure is too high, danger, the traditional liquid level control cannot remote centralized control, low degree of automation, precision shortcomings, and by manual operation has been unable to adapt to, control system and the necessity of reform unceasingly along with the science and technology progress of controlled object, more and more complex, people on the requirements of control precision improvement. As a result of the controlled object and the process is nonlinear, time-varying, strong coupling between different parameters, random noise and other factors, makes an accurate mathematical model of object creation becomes difficult. In front of these complex systems, the traditional control methods can not meet the control accuracy, and poor stability of the system. Better to boiler automatic control with single-chip microcomputer technology, at the same time, the rapid development of automatic control technology, SCM and its peripheral chip to realize boiler liquid level control is possible, but also become a development trend, single chip not only has small volume, convenient installation, function relatively complete advantages, but also have the very high price ratio, thus wide application prospect, and contribute to the discovery of a possible failure, fire water supply
system and realized by microcomputer automatic control and regulation, will ensure the normal supply of water supply boiler, to maintain the stability of system, guarantee the safe and economic operation. This paper is to use single chip is a pot which has high practical value and superiorit.
KEYWORDS:Single chip computer; peripheral chip; the boiler level control; automatic control and regulation to ensure the safe and economic operation
目录
1绪论 (6)
1.1研究背景和意义 (6)
1.2设计方案 (6)
2 系统硬件设计 (5)
2.1液位传感器的介绍 (5)
2.2温度传感器的选择 (5)
2.3显示电路的设计 (6)
2.3.1数码管 (6)
2.3.2LCM (8)
2.4驱动板介绍 (8)
2.4.1继电器控制电路 (8)
2.4.2驱动板模块原理图 (9)
2.5基础板介绍 (10)
2.5.1单片机最小系统电路 (10)
2.5.2单片机部分 (10)
2.5.3复位电路 (11)
2.5.4时钟电路 (11)
2.5.5串口通信部分 (12)
2.5.6总电源接口电路 (17)
3 系统软件设计 (19)
3.1主程序流程 (13)
4总结 (14)
5致谢 (15)
参考文献 (16)
附录一:头文件 (17)
1............................................................................................................. DS18B20.H
17
附录二:源文件 (20)
1.TEXT1.C (20)
第一章引言
1.1研究背景和意义
目前我国的燃煤锅炉数量众多,我国现有中、小型锅炉30多万台,每年耗煤量占我国原煤产量的1/4,目前大多数工业锅炉仍处于能耗
高、浪费大、环境污染严重的生产状态。
在现代社会中,随着工业的发展,居民生活区的集中热力供应量的需求也越来越大,蒸汽锅炉的容量不断提高,对操作过程要求更加严格,锅炉的液位控制直接影响人们自身和设备的安全。
液位过低可能使锅炉出现干烧现象,液位过高又会使锅炉蒸汽压力过高,发生危险,传统的液位控制不能进行远距离的集中控制,自动化程度低,调节精度差等缺点,且单靠人工操作已不能适应,控制系统改造的必要性随着科学技术的不断进步,被控对象越来越复杂,人们对控制精度的要求不断提高。
由于被控对象和过程的非线性、时变性,多参数间的强耦合、随机干扰等因素,使得建立被控对象的精确数学模型变得很困难。
在这些复杂的系统面前,传统的控制方法无法满足控制精度,而且系统稳定性差。
更好地对锅炉进行自动化控制,同时随着单片机技术,自动控制技术的迅速发展,利用单片机及其外围芯片实现锅炉液位控制已经成为可能,而且也成为一种发展的趋势,单片机不仅有体积小,安装方便,功能较齐全等优点,而且有很高的性价比,因此应用前景广,同时有助于发现可能存在的故障,通过微机实现燃烧与给水系统的自动控制与调节,将保证锅炉正常供气供水,维持稳定系统,保证安全经济运行。
本文即是用单片现的一种锅其有较高的实用价值和优越性。
1.2设计方案
本课题的研究对象为锅炉的液位,对其液位
进行控制。
基本思想是以STC89C52作为控制器,通过STC89C52单片机、温度传感器(DS18B20)、LCM、WT588D等实现具有液位报警和控制的双重功能,同时也具有温度显示控制播报的功能,并对温度和液位情况进行显示。
系统硬件设计包括以下几部分:STC89C52芯片为核心控制器,液位采集、温度采集、键盘、显示部分、报警部分、液位控制、温度控制等部分组成。
可实现的具体功能如下:
(1)当液位低至给定的下限液位时,停止水泵对锅炉放水,启动水泵对锅炉进行加水,直到水满超液位,工作状态指示灯亮1个,表明加水水泵在加水。
(2)当液位高至给定上限的液位时,停止水泵对锅炉加水,启动水泵对锅炉进行放水,水泵工作状态指示灯,表明放水水泵在放水。
(3)温度过低,启动加热工作。
温度过高,停止加热工作。
(4)有温度和液位传感器,同时可以显示其状态。
(5)温度语音播报
(6)语音警示
(7)按键控制显示背光,设定上下限温度及播报音量
第二章 系统硬件设计
2.1液位传感器的介绍
传感器是一种能感受被测物体物理量并将其转化为便于传输或处理的电信号的装置,在现代科技领域中,传感器得到了广泛应用,各种信息的采集离不了各种传感器,传感器的基本功能在于能感受外界的各种“刺激”并作出迅速反映。
本设计当中我们采用的水位探测传感器(如图
2.2所示)简单易行,经济实惠。
12J6
C ON 2
12J7C ON 2R 8
10K
R 910K
M CU V CC
R 3
1K R 41K M CU G ND
传感器接口L 1L 2
图2.1液位传感器原理图
图2.2超液位 图2.3欠液位
2.2温度传感器的选择
目前我们可选择许多类型的IC 温度传感器与多种多样的应用相匹配。
从简单的模拟输出温度传感器到数字输出的本地传感器再到具有远
程温度监测功能和复杂风扇控制算法的高度集成的温度监视系统。
(1)模拟温度传感器
初期的IC温度传感器是提供一个与温度成比例的输出电压或电流。
通过改变热敏电阻,使其为电阻随温度呈非线性关系变化的特性。
现在的模拟温度传感器无需附加线性化电路来校准热敏电阻的非线性,当要求电压与温度之间呈线性关系时,它是良好的选择。
虽然新的数字输出温度传感器已经在许多应用中取代了模拟输出温度传感器,但是模拟输出温度传感器仍然有用武之地。
例如,AD590电流输出温度传感器。
该器件经常用于远程温度检测,因为高阻抗电流输出使其对长线路传输的电压降不敏感,并且还能用于多种多样的温度检测器应用,具有+4 V ~ +30 V宽工作电压范围。
(2)数字输出温度传感器
在许多应用中,最终需要以数字形式提供温度数据。
这可以通过将一个模拟温度传感器的输出接到一个模数转换器(ADC)来实现。
然而,随着IC产品制造技术的进步,将这种ADC和许多其它功能一起集成到温度传感器的管芯上已经成为经济有效的方法。
它能降低成本、印制电路板(PCB)面积和功耗,同时简化系统设计工程师的任务。
数字温度传感器类似于模拟温度传感器,但是它的输出不是以电流或电压形式而是将其转换为1或0形式的数字量。
因此,数字输出温度传感器适合于连接到一个MCU。
本设计中温度的测量是采用了数字温度传感器DS18B20。
DS18B20为一线式数字温度传感器,它只有3个引脚,体积小,分辨率高,与单片机连线只需要一个I/O口就可以,可节省大量
的引线和逻辑电路,硬件电路简单且价格也不贵。
故采用此传感器来实现温度的检测。
图2.4 DS18B20引脚图
2.3 显示电路的设计
2.3.1数码管
本系统选用8位数码管作为显示器,用于显示数字及特殊字符。
对于多为数码管显示器来说,为了简化线路、降低成本,往往来采用以软件为主的接口方法。
由于各位数码管的显示段码是互相并联的,因此在同一时刻只能显示同一种字符。
对于这种接口电路来说,其显示方法有静态显示和动态显示两种。
本系统采用动态方法显示。
2.3.1.1静态显示
静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小。
2.3.1.2 动态显示
如果要在同一时刻显示不同的字符,从电路
上看,这是办不到的。
因此只能利用人眼视觉的残留效应,采用动态扫描显示的方法,逐个地循环点亮各位数码管,每位显示1ms左右,是人眼看起来就好像在同时显示不同的字符一样。
在进行动态显示时,往往事先并不知道应显示什么内容,这样也就可以选择被显示字符的显示段码。
为此,一般采用查表的方法,由待显示的字符通过查表得到其对应的显示段码。
图2.5数码管结构
图2.6数码管原理图
2.3.2 LCM
系统选用1602液晶模块显示锅炉内温度等相关信息。
1602是一种采用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行字等,下图(图
2.7)就是TL1602液晶模块的正面和反面。
图2.7 1602液晶模块实物照片
2.4驱动板介绍
2.4.1继电器控制电路
水泵(普兰迪微型直流隔膜水泵)的参数:⏹额定电压:12V
⏹额定功率:45W
⏹最大压力:1MPa
⏹最大流量:4L/min
该电路由继电器和闭合开关、光电耦合器、水泵等组成。
当水位在低水位时单片机给P0.7送一个高电平导通光电耦合器然后光电耦合器驱动导致继电器闭合从而让12V的直流电接通使水泵加水。
其中光电耦合器是以光为媒介传输电信号的一种电一光一电转换器件。
它由发光源和受光器两部分组成。
把发光源和受光器组装在同一密闭的壳体内,彼此间用透明绝缘体隔离。
发光源的引脚为输入端,受光器的引脚为输出端,在本设计当中发光源为发光二极管,受光器为光敏三极管。
在本设计当中我们采用光电耦合器组成开关电路的作用,能够很好地将单片机信号稳定地
送给继电器驱动继电器闭合。
继电器是具有隔离功能的自动开关元件,在我们设计当中主要来做自动控制作用,我们采用+5V 的直流电来控制12V 的直流电,以达到控制水泵的作用。
电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。
只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。
这样吸合、释放,从而达到了在电路中的导通、切断的目的。
对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
2.4.2驱动板模块原理图
3
电源U1
图2.8电源原理图
9
K
4
传感器接口
图2.9传感器接口原理图
图2.10继电器控制原理图
2.5基础板介绍
2.5.1单片机最小系统电路
系统电路部分由单片机最小系统和功能模块组成,其中单片机的最小系统是整个系统的核心部分。
单片机的工作就是执行用户程序、指挥
各部分硬件完成既定的任务。
单片机具有结构简单、控制功能强、可靠性高、体积小、价格低等优点,其应用领域十分广泛。
最小系统原理框图如图2.11所示。
单
片
机
最
小
系
统
时钟电路
复位电路时钟信号的产生
时序
复位条件
上电复位电路
按键复位电路
节拍与状态
机器周期
指令周期
图2.11 最小系统原理框图
2.5.2单片机接口电路
该部分由单片机芯片、上拉电阻、插针等组成。
本设计选用比较常见的STC89C52单片机芯片。
其电路图如图2.12所示。
图2.12单片机芯片部分
2.5.3复位电路
无论是单片机刚开始接上电源,还是断电后或者发生故障后都要复位。
单片机复位是使CPU 和系统中的其他功能部件都恢复到一个确定的
初始状态,并从这个状态开始工作。
复位电路由电容串联电阻组成,由图并结合“电容电压不能突变”性质,可以知道当系统一通电,RST引脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定,典型的51单片机当RST 引脚的高电平持续两个机器周期以上就将复位。
教科书推荐C取10uF,R1取1K,R2取10K。
也还有其他的取法,原理就是让RC组合可以在RST 引脚上长生不少于2个机器周期的高电平。
电路图如图2.13所示。
图2.13复位电路
2.5.4时钟电路
单片机是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
时钟电路用于生产单片机工作所需要的时钟信号。
在MCS-51系列单片机内部有一个高增益反向放大器,其输入端引脚为XTAL1,其输出端引脚为XTAL2。
一般的,电容C8、C9取22pF左右,晶振振荡频率越高,系统时钟频率越高,单片机的运行速度也越快。
在通常情况下,使用频率为6MHz 或12MHz的晶振。
本系统中使用了单片机的串行口通信,一般晶振的频率采用11.0592MHz。
电路图如图2.14所示。
图2.14时钟电路
2.5.5串口通信部分
本部分的主要作用是单片机与pc机的信息交互。
使编好的程序能下载到单片机中,使所设计的系统能按照预先的设想工作。
其电路图如图2.15所示。
图2.15 串口通信部分电路
2.5.6总电源接口电路
本部分的作用是给整个单片机系统供电,使其正常运转。
图2.16 电源接口电路
第三章系统软件设计
3.1主程序流程
本锅炉系统能够实现自动给水加热并且维持
一定液位及水温,可根据用户要求进行自动放水随后进水,加热维持系统在液位和水温两个参数
的恒定。
图3.1主程序流程图第四章总结
1.换用精度更高的液位传感器,实现更精确地控制进放水,合理利用能源。
2.温度调控改用双向可控硅,用PID精准控制,实现控制目的同时节能。
3.增加上位机显示与控制。
第五章致谢
经过三周的艰苦奋斗和不懈努力,我们一起完成了这次课程设计的设计和制作。
综合来看,本次课程设计包括硬件和软件部分,是综合多学
科知识的平台,对于我们专业课的学习和知识面的扩展有极大的帮助,也符合了对于复合型人才的培养目标。
当然,成功的背后离不开我们团队的合理分工与团结合作,更离不开老师的指导与帮助。
在此,小组全体成员衷心地感谢指导老师所做的不懈努力与无私奉献。
这次课程设计让我们受益匪浅,我们不仅收获了成功的喜悦,而且感受了学以致用,深深地体会了知识的力量。
在设计制作过程中我们学会了为人处事,学会了团队合作,这是我们在这次课程设计中最大的收获。
在品尝这次课程设计中取得某种成功喜悦的同时,我们也发现了自身的不足.这次课程设计让我们受益终身, 将让我们以后走得更稳、更远。
由于时间仓促,报告或有不尽人意之处,望谅解。
参考文献
[1]童诗白·模拟电子技术基础.北京:高等教育出版社,2001
[2]阎石·数字电子技术基础.北京:高等教育出版社,1998
[3]谭浩强.C程序设计(第三版)[M].北京:清华大学出版,2007
[4]蔡美琴.MCS-51系列单片机系统[M].北京:高等教育出版社,2003
[5]王静霞.单片机应用技术[M].北京:电子工业出版社(C语言版),2009
[6] 周荷琴,吴秀清.微型计算机原理与接口技术(第4版).中国科学技术大学出版社.2008.
[7] 谭浩强.C语言程序设计(第三版).清华大学出版社.2005.
[8] 克尼汉[美]. The C Programming Language( The Second Edition).机械工业出版社2006
[9] H M Peitel,PJ Deitel.C How to program, second Edition.
[10] Aubrey Pilgrim. Build Your Own Pentium PC and Save a Bundle. MeGraw-Hill 公司出版
附录一:头文件
1.ds18b20.h
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*********************************** ******DS1820端口设置**************************************** sbit DS=P0^5;
uint temp;
//uint stemp=200;
//uint xtemp=110;//上下限温度值
//延时函数
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 }
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay1(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay1(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
附录二:源文件
1.Text1.c
#include <reg52.h>
#include <ds18b20.h>
sbit rs=P2^0;
sbit wr=P2^1;
sbit lcden=P2^2;
sbit s2=P3^6;
sbit s1=P3^7;
sbit j1=P0^1; //继电器j1//进水
sbit j2=P0^2; //继电器j2//出水
sbit j3=P0^3; //继电器j3 //
加热
sbit up=P0^4; //上限限位开关
sbit down=P0^6; //下限限位开关
uchar a,b;//a标志进水过程 //b标志放水过
bit flag0;
uchar display[2];
void delayus(unsigned int s)
{
u nsigned int i;
f or(i=0; i<s; i++);
f or(i=0; i<s; i++);
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
v oid write_com(uchar com) //液晶写指令
{
rs=0;
P1=com;
lcden=0;
delay(5);
lcden=1 ;
delay(5);
lcden=0;
}
void write_data(uchar date)
//液晶写数据
{
rs=1;
P1=date;
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //液晶初始化
{
wr=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void distwo(uchar add,uchar temp) //液晶显示两位数字
{
uchar shi,ge;
shi=temp/10;
ge=temp%10;
write_com(0x80+add);
write_data(shi|0x30);
write_data(ge|0x30);
}
void diszifu(uchar add,uchar *temp) {
uchar i;
write_com(0x80+add);
for(i=0;temp[i]!='\0';i++)
{
write_data(temp[i]);
delay(5);
}
}
void distemp(uchar add,uint temp) {
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;
w rite_com(0x80+0x40+add);
w rite_data(bai|0x30);
w rite_data(shi|0x30);
w rite_data(0x2e);
write_data(ge|0x30);
w rite_data(0x43);
d isplay[2]=(bai<<4)|(shi);
d isplay[1]=ge;
d isplay[0]=0x22;
}
void active()
{
//进水阀门继电器j1吸合,进水阀打开
i f (down==0&&up==0)//上下液位传感器没浮,1为打开继电器
{
j1=1;
j2=0;
j3=1;
b=0;
a=1;//进水
}
i f(down==1&&up==0)
{
if(b==1)
{
if(temp>=250)
{
j1=1;
}
if(temp<=250)
{
j3=1;
while(!(temp>=300))
{
tmpchange();
distemp(9,tmp());
temp=tmp();
}
j2=0;
j3=0;
}
}
}
i f (down==1&&up==1)
{
j1=0;
if(temp<=250) // 如果小于25度就加热
{
j3=1;
j2=0;
while(!(temp>=300))
{
tmpchange();
distemp(9,tmp());
temp=tmp();
}
j3=0;//大于30度加热关
j2=1;
b=1;
}
else
{
j3=0;
b=1;
}
}
//加热继电器j3吸合
//出水阀门继电器j2吸合,出水阀打开/*if (down==1 && temp>=250)
{
j2=1;
}
e lse
{
j2=0;
} */
}
void main() //主函数
{
uchar i;
float temp;
init();
// init_timer();
j1=0;
j2=0;
j3=0;
diszifu(0x40+4,"temp:");
while(1)
{
tmpchange();
distemp(9,tmp());
temp=tmp();
active();
} }。