完整版太阳能热水器水位控制系统设计毕业设计.docx
《完整版太阳能热水器水位控制系统设计毕业设计.docx》由会员分享,可在线阅读,更多相关《完整版太阳能热水器水位控制系统设计毕业设计.docx(16页珍藏版)》请在冰豆网上搜索。
完整版太阳能热水器水位控制系统设计毕业设计
毕业论文
太阳能热水器水位控制系统设计
摘要
本设计主要设计了一个基于单片机的太阳能热水器水位控制系统。
设计以单片机为核心,配合电阻型4档水位传感器、8255A扩展键盘和显示器件、以及电磁阀、报警等外围器件,从而完成对太阳能热水器容器内的水位测量及控制;时间显示;缺水时自动上水;水满报警;手动上水等功能。
本文主要进行时钟电路、电源电路、键盘输入电路、传感器电路、显示电路的设计,以及硬件选择和系统软件设计。
本文在已有的太阳能热水器的技术的基础上,采用单片机对热水器水位控制,通过合理的选择和设计,提高了水位传感器的控制水平,改善了热水器的实际使用功能,从而使太阳能热水器水位控制达到了较为理想的效果。
关键词:
太阳能热水器,水位控制,单片机,传感器
Abstract
Thisarticlemainlydesignedamonolithicintegratedcircuits,thecontrolsystemofthesolarwaterkeyboardandthedemonstrationcomponent,thesolenoidvalve,warning,andotherperipherycomponent,thuscompletestothewaterlevelmeasureanddemonstrate;thetimedemonstrate;lackofwaterautomaticallyupstream,thewateroverflowwarn,manualwaterfunctionandsoon.
Thisarticlemainlyforclockcircuit,powersupplycircuits,thekeyboardtoenterthecircuit,sensorcircuit,displayofthecircuitdesign,and.Thisarticleinthegivensolarwaterthebasisofamonolithicintegratedcircuitstocontrolthroughthewater,andimprovethecontrolofthesensorandimprovedtheactualusetomakesolarwater(void)
{
ucharrecode;
if((KPORT&0X0F)!
=0X0F)若有键按下
{
delay
(2);延时抖动
if((KPORT&0XF0)!
=0X0F)若有键按下
{
recode=KPORT;记录键值
return(recode);返回键值
}
}
return(0);返回0
}
根据读取的值,键盘处理程序进行相应动作,键盘数据处理程序不再叙述。
第六章传感器电路
6.1工作原理
当水位处于低水位的时候,传感器的低水位探测线被+5V的电源导通进入稳压电路经过处理在稳压电路的输出端有一个高电平,送入单片机的P1.0口,另一个稳压电路输出的高电平进入单片机的P1.1口单片机经过分析,在P1.2口输出一低电平,驱动红灯亮,P1.5出来一个信号使光电耦合器GDOUHE导通,这样继电器闭合,使水泵加水;当水位处于正常范围内时,水泵加水,在P1.3引脚出来一个低电平,使绿灯亮;当水位在高水位区时,传感器的两根探测线均被导通,均被+5V的电源导通,送入单片机,单片机经过分析,在P1.4引脚出来一个低电平,使黄灯亮,在P1.5端出来一个高电平不能使光电耦合器导通,这样继电器不能闭合,水泵不能加水;当三灯闪烁表示系统出现故障。
6.2单片机控制结构图
图6-1单片机控制结构图
采用单片机AT89C2051作为我们的控制芯片,主要工作过程是当水箱的水在低水位时,水位探测传感器送给单片机一个高电平,然后单片机驱动水泵加水和显示系统使红灯变亮;当水位在正常范围内时,水泵加水,绿灯亮,;当水位在高水位时,单片机不能驱动水泵加水,黄灯亮。
6.3传感器电路组成的原理图
本系统由水位探测传感电路、电源电路、稳压电路、单片机系统、光报警显示电路、继电器控制水泵加水电路、以及水位模型组成。
传感器电路组成的电气原理图如图6-2所示:
图6-2传感器电路组成的电气原理图
工作原理:
当水位处于低水位的时候,传感器的低水位探测线被+5V的电源导通进入稳压电路经过处理在稳压电路的输出端有一个高电平,送入单片机的P1.0口,另一个稳压电路输出的高电平进入单片机的P1.1口单片机经过分析,在P1.2口输出一低电平,驱动红灯亮,P1.5出来一个信号使光电耦合器GDOUHE导通,这样继电器闭合,使水泵加水;当水位处于正常范围内时,水泵加水,在P1.3引脚出来一个低电平,使绿灯亮;当水位在高水位区时,传感器的两根探测线均被导通,均被+5V的电源导通,送入单片机,单片机经过分析,在P1.4引脚出来一个低电平,使黄灯亮,在P1.5端出来一个高电平不能使光电耦合器导通,这样继电器不能闭合,水泵不能加水;当三灯闪烁表示系统出现故障。
第七章其他硬件电路设计
上水、电加热、报警电路属于大功率驱动电路,需用开关控制外部电源的关断。
水位显示是简单的三极管驱动电路。
电源电路微单片机的主电路及部分驱动开关提供电源。
本章对这些综合介绍。
7.1上水控制电路
由单片机P1.1口的输出来控制上水电磁阀。
单片机P1.1口通过一个2.2K的电阻接9013三极管的基极,9013的集电极通过一个单刀继电器接正12V电源,9013射极接地。
当P1.1输出低电平时,三极管截止,几乎没有电流通过三极管的基极到射极、集电极到射极,即,所以此时流过继电器的电流几乎为0,继电器打不开。
当P1.1口输出高电平时,三极管9013导通,有较大的饱和电流流过继电器,使其吸合、关闭,从而开启电磁阀。
7.2电加热控制电路
电加热的继电器采用双开关继电器,一个开关控制电加热器的火线,另一个控制零线。
当P1.0输出低电平时,三极管不导通,继电器无电流通过,开关不开启,电加热器不工作。
当P1.0输出高电平时,三极管导通,继电器有较大电流通过,开关闭合,电加热器开始工作。
。
7.3报警控制电路
报警输出三极管的集电极接蜂鸣器,蜂鸣器的另一端接正5伏电源。
有P1.2口控制报警电路,当水位超标时P1.2口输出高电平报警,不报警时将P1.2口置低电平。
7.4水位显示电路
水位显示电路由P2.0-P2.4口来控制,其中P2.4口输出高低电平控制水位的显示与否,P2.0-P2.3口输出高低电平控制二极管的亮灭来显示水位。
图7-1主要驱动电路电路图
结论
本课题设计了一个以单片机为核心配合其他外围电路的太阳能热水器智能控制系统,完成了对太阳能热水器容器内的水位测量、时间显示;缺水时自动上水,水溢报警;手动上水、参数设定等功能。
1.完成了太阳能热水器水位的测量和显示电路与电源电路的设计
2.通过对水位、水温的测量监控,实现了自动上水、水溢报警、智能加热等功能。
3.完成了用8255A扩展键盘和显示电路的设计,实现了温度时间共六位动态显示,和4个独立键盘输入。
4.完成了时钟电路设计,为系统提供了准确的时间显示,显示时、分。
并为定时加热提供了时间参考,从而完成自动电加热。
5.用键盘实现了手动上水、电加热、参数设置等功能。
参考文献
[1]范延滨,王正彦.太阳能热水器控制器中测量模型.电子测量技术,2004,3.
[2]唐德礼,鲍连升.太阳能热水器水温水位控制器.十堰职业技术学院学报,2002,15(4).
[6]欧阳乔.时钟芯片DS1302的原理及其Proteus仿真设计.计算机与信息技术,2006,6.
[8]LatticeDateBook.LATTICESEMICONDATEBOOKCORPORATION.1994.
[9]马敏,孙寅聪,张炜宇.太阳能热水器控制器的设计.河南科学.2003(02)
[10]王俊杰.基于89C51单片机的太阳能热水器智能控制器的设计.郑州轻工业学院学报(自然科学版).2005(08)
[11]张榜英.基于AT89S52单片机的太阳能热水器控制系统设计.吉首大学学报(自然科学版).2110
(2)
[12]曹明善.基于单片机的高塔水位控制系统设计.管理工程师.2010.5
致谢
在这两个多月的毕业设计里,我不仅仅把大学里学的东西重新复习了一遍,更重要的是把自己从老师从课本里所了解的东西应用到实践应用中,提高了自己的能力。
在做毕业设计的过程中,我查阅了图书馆的资料,也通过上网提高了自己查阅资料的能力。
毕业设计是对大学所学知识的综合运用,也是理论走向实践的第一步,这对以后继续深造或者走向工作岗位都将产生深远的意义,更重要的是为以后的理论和实践的综合发展奠定了一定的基础。
这次毕业设计中,最开始我不知所措,然而随着我不断的学习我也慢慢的适应了论文的设计。
设计中我得到了张老师的指导,他严谨的作风及对我的严格要求给我留下很深的印象,使我受益匪浅,论文写作中,每周都得到张老师的指点,在我学习期间他不仅传授了我做学问的秘诀,还传授了做人的准则。
这些都将使我终生受益。
我再次为张老师的付出表示感谢。
鉴于我现在所具备知识水平有限,难免存在一些错误和漏洞,恳请老师指正不足。
在此,再次向老师、学校表示忠心的感谢。
附录
附录:
主程序流程图和程序
太阳能热水器智能控制系统程序:
定义头文件和各个输入管脚以及变量声明
#includevoidDS1302(void);
voidint0_int(void);
voidint1_int(void);
*定义调用存储单元*
*显示缓冲区(依次为高位低位)*
ucharBUFFER[3]={0,0,0};
ucharWTLV;水位值
ucharTMP;水温值
ucharWTLVSET;水位设定值
ucharTMPSET;水温设定值
*数码管显示编码"0"-"9","A","-"*
ucharcodeTABLE[]={0x7B,0x30,0xEA,0xF8,0xB1,0xD9,0xDB,0x70,0xFB,0xF9,0xF3,0x80};
main()
{
inital();初始化中断、定时器、IO口
kbscan();键盘扫描
key();键盘处理
TmRead();读取温度
LvRead();读取水位
DS1302();读取时间
display();显示
}
voidinital()
{
P1_0=P1_1=P1_2=K0=0;初始化外部驱动口
DS1302_Init();
EA=1;开外部中断
IT0=1;外部中断下降沿触发
EX0=1;允许外部中断0
Hig=1;P1.3输出高电平
TMOD=0x11;定时器工作于方式1
TH1=0X8A;定时器1赋初值
TL1=0XD0;
ET1=1;定时器1开定时中断
TR1=1;开启定时器1
CCOM=0X80;初始化8255A,送控制字,工作方式0
}
ucharkbscan(void)
{
ucharrecode;
if((KPORT&0X0F)!
=0X0F)若有键按下
{
delay
(2);延时抖动
if((KPORT&0X0F)!
=0X0F)
{
recode=KPORT;
return(recode);
}
}
else
return(0);
}
voidkey(void)
{
ucharkey;
key=kbscan();
delay
(2);
if(key==0x01)
{
P1_1=1;上水
}
if(key==0x02)设置水位
{
if(WTLVSET==4)
WTLVSET=0;
else
WTLVSET+=WTLVSET;
BUFFER[0]=WTLVSET;显示设置水位
display();
}
if(key==0x04)电加热
{
P1_0=1;
}
if(key==0x08)设置温度
{
if(TMPSET>=80)
TMPSET=30;
else
TMPSET=TMPSET+10;增加十度
BUFFER[0]=TMPSET;显示设置水温
display();
}
}
voidtimer1_svr()interrupt1
{
TH1=0X8A;重新给定时器1赋值
TL1=0XD0;
Hig=!
Hig;充放电变换
if(Hig)充电开始时启动定时器0
{
TL0=TH0=0X00;定时器0赋初值0
TR0=1;启动定时器0
}
}
voidint0_int(void)interrupt0外部中断0,测水位
{
EX0=0;
EX1=1;
TR0=0;
buf[0]=TL0;
buf[1]=TH0;
}
voidint1_int(void)interrupt2外部中断1,测水温
{
EX1=0;
EX0=1;
TR0=0;
buf[2]=TL0;
buf[3]=TH0;
}
voidTmRead()水温值处理
{
uintval;
val=buf[3]*256+buf[2];
if(val<7549)
TMP=97-int(val*81000);
else
if(val<20000)
TMP=50-int(val1000);
else
TMP=30-int(val*510000);
}
voidLvRead()水位值处理
{
if(buf[1]>60)
{
WTLV=1;
L3=0;L2=1;L1=1;L0=1;
}
elseif(buf[1]>45)
{
WTLV=2;
L3=1;L2=0;L1=1;L0=1;
}
elseif(buf[1]>36)
{
WTLV=3;
L3=1;L2=1;L1=0;L0=1;
}
else
{
WTLV=4;
L3=1;L2=1;L1=1;L0=0;
}
}
voidWtTmCr()水位、水温控制
{
if(WTLV==4)
P1_1=0;
if(WTLV==1)
P1_1=1;
if(TMP>=TMPSET)
P1_0=0;
if(TMP}
voidDS1302_Init(void)初始化DS1302
{
DS1302_Write(DS1302_CONTROL_Reg,0x00);关闭写保护
DS1302_Write(DS1302_SEC_Reg,0x80);暂停
DS1302_Write(DS1302_CHARGER_Reg,0xa9);涓流充电
DS1302_Write(DS1302_YEAR_Reg,0x04);年
DS1302_Write(DS1302_MONTH_Reg,0x12);月
DS1302_Write(DS1302_DATE_Reg,0x09);日
DS1302_Write(DS1302_DAY_Reg,0x04);周
DS1302_Write(DS1302_HR_Reg,0x10);时
DS1302_Write(DS1302_MIN_Reg,0x25);分
DS1302_Write(DS1302_SEC_Reg,0x00);秒
DS1302_Write(DS1302_CONTROL_Reg,0x80);打开写保护
}
voidReadTime(void)读取时间
{
uchardat;
dat=DS1302_Read(DS1302_YEAR_Reg);年
year0=dat&0x0f;
year1=dat>>4;
dat=DS1302_Read(DS1302_MONTH_Reg);月
month=dat;
dat=DS1302_Read(DS1302_DATE_Reg);日
date=dat;
dat=DS1302_Read(DS1302_DAY_Reg);周
day=dat;
dat=DS1302_Read(DS1302_HR_Reg);时
hour=dat;
dat=DS1302_Read(DS1302_MIN_Reg);分
minute=dat;
dat=DS1302_Read(DS1302_SEC_Reg);秒
second=dat