基于单片机的智能热水壶设计Word下载.docx
《基于单片机的智能热水壶设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能热水壶设计Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
第2章设计方案概述
2.1总体设计思路
本次智能热水壶的设计方案利用单片机软件系统为工作环境,不仅实现基本的烧开水以及烧开后断电功能,并且结合按键控制温度的设定,可加热冷水至指定温度,蜂鸣器报警,随后热水壶断电,同时液晶显示屏显示即时温度。
2.2系统总设计框图
初步确定电路系统由以下模块组成,电路系统框图如图2-1所示。
加热装置-继电器
蜂鸣报警器
液晶显示-LM160L
温度检测-DS18B20
电源供电
按键控制
ST89C52RC
单片机
图2-1电路系统框图
2.3主要模块电路功能简介
1、单片机模块
作为智能热水壶设计的控制中心,单片机用于驱动整个热水壶系统的运作,如液晶屏上的温度显示、接收传感器中的温度信号以及按键信号、LED上显示温度等[2]。
2、温度检测模块
周期性采集温度信号,判断是否达到预设温度,传送至单片机内处理。
3、液晶显示模块
显示水壶内热水的即时温度,便于用户随时掌控温度变化。
4、控制按键模块
三个独立按键组成一个独立键盘,连接单片机的I/O端口,对单片机输入控制信号,用于设温加热模式时控制设定温度的加或减,以及单片机的启动与停止。
模式设定由一个独立按键组成,当按下按键,液晶显示屏右下角显示“1”,即为烧开水模式;
再次按下按键,液晶显示屏右下角显示“2”,即为设温加热模式;
显示“0”为停止加热状态。
5、加热装置模块
用于加热水壶中的水,使水达到设定的温度。
6、蜂鸣器模块
当冷水加热到指定温度时发出报警声提示用户。
7、电源模块
用于给整个设计系统提供电。
2.4外部配件材料的选择
本热水壶采用220V200W的制式,水壶的选用优先考虑耐高温的合金材料,继电器连接加热片来加热壶底来实现烧水。
在水壶底部和加热片上都涂上一层导热胶,使冷水受热均匀、加热的速度更快,减少等待时间。
水壶盖上开孔一个边长约为40mm的方洞,便于放入测温探头、散去蒸汽,避免暴沸。
第3章硬件模块电路设计
3.1硬件组成部分
确定了本次设计需要实现的功能后,针对烧开水、加热冷水、显示温度的功能,设计的硬件部分主要由单片机模块、温度控制模块、液晶显示模块、按键控制模块构成。
3.2主要模块电路设计
3.2.1单片机模块
相比于普通的微型计算机,单片机具有以下特点:
体积小,结构简单,控制能力强,可靠性高,集成度高,抗干扰能力强,磁屏蔽能力强,适合在恶劣环境下工作,以及低电压,低功耗,性价比较高,开发周期短等。
其中,STC89C52是STC公司生产的一种CMOS8位微控制器。
STC89C52使用MCS-51内核,但做了许多改进使芯片具有传统51单片机不具备的功能。
在单芯片上,由于灵巧的8位CPU和在系统可编程Flash,STC89C52为众多嵌入式控制应用系统提供灵活、有效的解决方案[3]。
STC89C52RC芯片如图3-1所示。
图3-1STC89C52RC芯片
STC89C52单片机系统由单片机、时钟电路、复位电路组成,其具有以下功能:
8k字节Flash,512字节RAM,32位I/O口线,定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
STC89C52也可降至0Hz静态逻辑操作,支持2种软件,还可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选[4]。
本次设计采用STC89C52RC型号单片机,且单片机采用内部时钟方式,在MCS-51电路外接晶体以及电容C4和C5组成并联谐振电路且构成一个自激振荡器,接在放大器的反馈回路中,向内部电路提供震荡时钟。
在本次设计中晶体选择1.2MHz频率,而电容C4和C5的选择为30pF的典型值。
单片机中的复位电路采用上电自动复位和按键复位的方式。
3.2.2温度控制模块
比较热电偶温度传感器,它的实现过程为:
靠光敏电阻检测光照的大小,光照的大小改变电阻的大小,再给电阻一个外加电压,就改变了电压的大小,再用转换器件检测电压的变化并转换为数字信号,随后传到单片机上作一定的处理后去控制相应的数码管来显示当时的温度。
而对DS18B20来说过程则简单许多,热电偶电阻传感器一直到单片机之前的部分都可以用一个DS18B20来代替,从而真正的实现了数字化[5]。
本设计系统采用的是DS18B20温度传感器,DS18B20是美国达拉斯公司生产的一款产品,是一线式数字化传感器。
工作电源可在远端引入,也可采用寄生电源方式产生。
低功耗、微型化、抗干扰能力很强,可根据实际要求通过简单的编程实现数字读数方式,便于与微处理器进行接口。
电路简单,实现起来比较容易,几乎适用于所有类型的单片机。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
[6]DS18B20引脚图以及内部系统框图如图3-2、3-3所示。
图3-2DS18B20引脚图
图3-3DS18B20内部系统框图
3.2.3液晶显示模块
本次设计采用的液晶显示屏为LM016L,除了PROTEUS中016没有显示调亮度的两个端口,它与LCD1602具有相同的原理。
它可以显示两行,每行16个字符,因此可相当于32个LED数码管,而且比数码管显示的信息还多。
采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比[7]。
在单片机系统中应用液晶显示屏具有以下优点:
显示质量高、数字式接口、体积小、重量轻、功耗低,在嵌入式应用系统中得到越来越广泛的应用。
液晶显示屏、LCD1602管脚分布图如图3-4、3-5所示。
图3-4液晶显示屏
图3-5LCD1602管脚分布图
3.2.4按键控制电路
三个按键构成一个独立键盘,一端分别接单片机的P0.5、P0.6和P0.7口,另一端接地。
通过单片机的扫描查询,判断按键是否按下,当没有按键按下时,P0口输入为高电平,反之则为低电平[8]。
3.2.5电源供电电路
由于本设计的模块都采用直流+5V供电,于是直接采用三端稳压器供电,省去了复杂的电源变压电路。
再考虑到单片机和液晶显示屏的功耗,使用电池供电比较费电,并且电流也达不到要求,所以也直接用三端稳压器供电,电流大、电压稳定。
3.3总系统电路
总系统电路原理图以及PCB图详见附录1。
第四章软件模块电路设计
4.1设计总体思路
本设计采用51单片机系统固件,基于keiluVision4开发环境,使用C语言编写程序[9]。
程序需要实现以下需求:
1、一般热水壶都具有的烧开水功能。
2、指定温度加热冷水。
切换模式后,按下加或减按键调节需要设定的温度,到水温到达指定温度后热水壶自动断电。
3、LM016L液晶显示屏上显示即时温度、设定温度以及工作模式。
4.2烧开水功能设计特点
由于不同的地域气压差异,当温度达到100度时,水不一定能烧开,甚至在海拔较高的地区水不能加热到100度。
于是本设计中相应的在温度控制模块中采用周期性采样温度的方式,每10s保存一次温度值,通过每次的采样进行比较进而寻找水温的最大值,如果没有更大的水温值,则水达到沸点,若温度稳定持续超过3分钟,并且水温超过80度,此时可判断水烧开了,随后热水壶自动断开电源。
程序执行采用定时器中断方式,提高了系统的响应速度[10]。
4.3控制程序工作流图
根据设计的思路和目标功能,确立了软件的工作流图。
控制程序工作流图如图4-1所示。
图4-1控制程序工作流图
4.4系统主程序
系统主程序代码详见附录2。
第5章系统测试
5.1硬件部分测试
本设计首先在ProtelAltiumDesignerSummer09软件上绘制出原理图,并且完成PCB的设计,之后送至电路板制版工厂完成主控双面电路板的制作,自行动手完成元器件的焊接和测试。
焊接过程需要谨慎认真的态度,先焊好主控芯片,最后焊接其它元器件,焊接结束后用万用表欧姆档对照原理图进行电路检测,检测其导通情况以及是否有短路或虚焊现象并及时修正。
确保一切正常后,下载测试程序检测主控核心板是否能正常工作,经检测,主控核心板能达到预期的工作效果,可以作为本系统的主控部件。
5.1.1热水壶功能测试
在水壶内盛上大约100ml的冷水,放置在涂上一层导热胶的加热板上,将1个DS18B20温度传感器探头放进水中用于检测实时温度,再将程序下载至主控板内后接通电源,选择“1”模式开始烧水,观察并记录如下:
1.独立按键设定工作模式,在液晶显示屏上正常显示实时水温和工作模式。
2.大约10分钟后,水烧开,蜂鸣器报警,显示屏上显示“Boiling”,随后断电。
重复测烧开水时的温度和所用时间5次,得到的结果如表5-1所示:
1
2
3
4
5
开水温度/度
99.51
99.49
99.52
99.50
所用时间
9分58秒
9分56秒
9分57秒
重新在水壶内盛上大约100ml的冷水,重复烧开水前的准备步骤,接通电源,按两下模式按键,选择“2”模式,起始水温为26.41度,再通过温度加减按键调节设定温度,设定50度后,等待大约5分钟后到达设定温度,蜂鸣器报警,随后断电。
重复测设定温度50度时的实际断电温度和所用时间5次,得到的结果如表5-2所示:
实际温度/度
51.22
50.99
51.18
51.23
51.21
4分44秒
4分40秒
4分41秒
4分42秒
4分45秒
5.1.2系统误差分析
分析整个测试过程,总结出有几点误差:
1.温度检测引起的误差。
本设计温度检测中存在的误差是在可以接受的范围内的,由于DS18B20本身存在一定的系统误差,以及检测过程中温度环境不均匀、水流滚动影响等因素,因此设计采用周期采样温度的方法测定温度。
2.继电器引起的误差。
随着继电器对电热管的加热,水温升高,电流流经SSR减小,因此交流的负载增加干扰信号也就不足为奇,SSR误导通。
3.电压波动引起的误差。
5.2软件部分测试
本设计使用C语言在keiluvision开发环境下进行编程,该软件兼容单片机C语言软件开发系统,编译过程中对于出错的地方给出清楚的位置,方便开发者改进错误。
在编程的基础上,整个调试的工作包括工程的建立和函数的调用,检查包含的头文件是否正确,分模块检查,根据设计的要求检查初始化程序,以及优化程序结构。
经过反复的测试后,确定系统能够正常工作,系统功能得到了良好的实现,设计的软件部分测试完成。
5.3结果分析
经过对系统的硬件以及软件部分的反复测试,在两种功能模式下,系统各模块都能够正常工作。
总体来说,这些功能的实现达到了毕业设计题目上的要求,并且本设计的外形设计提高了安全性和灵活性,具有操作简单、实用等特点。
本设计的成本较低,便于进行工业生产,投入日常生活中使用,从这个角度来说,本设计具有一定的实用意义。
结论
通过硬件和软件的设计,我制作了智能热水壶,本次设计的各项目标功能都已实现,包括用烧开水、按键设置温度、指定温度加热冷水、达到设定温度时自动断电等。
通过这次设计,自己努力学习、认真设计,从搜集资料、分析和确定方案,我学习到了电路板的制作与程序的编写等操作技能,通过单片机编程和焊接电路板等实践方面的学习积累了自己的动手经验。
在此期间,我充分的锻炼了我的自学能力,明白了学习生活中要有不轻言放弃的毅力。
同时也领悟到不要在乎作品完成得是否完美,重要的是自己所学的在实践中如何应用以及怎样应用到最好。
本次设计的硬件模块电路部分比较简单,大部分热水壶功能是由软件程序实现。
在编程过程中,我重新复习了许多汇编语言的编程技巧,最终编写的程序更加灵活;
另外我还学习了代码的优化技巧,逐渐养成了良好的编程习惯,写出了高质量的程序代码,为今后的学习工作打下了良好的基础。
致谢
经过三个月的忙碌和工作,我的毕业设计已经接近尾声。
由于经验的匮乏,本次毕业设计难免有许多考虑不周和制作不好的地方,如果没有导师的指导与督促,以及一起制作设计的同学们支持,要去完成这个设计是难上加难的。
在这里首先要感谢我的导师。
她平日里工作繁多,但在我做毕业设计的过程中,从设计方案的确定和修改、中期检查指导、后期完善修改、论文的规范修改等方面都给予了我耐心的指导。
其次还要感谢所有帮助过我的老师,感谢电子工程学院所提供的实验室,在焊接和调试电路时给我们带来了极大的方便。
在这里,我要再一次对我的导师以及电子工程学院的全体老师们表示深深的谢意,在你们的支持与帮助下我顺利的完成了此次毕业设计。
参考文献
[1]中国行业研究网.电水壶发展的三大趋势,2007.
[2]吉林工程技术师范学院.智能水壶.2009.
[3]周鹏.基于STC89C52单片机的温度检测系统设计.现代电子技术,2012.
[4]STC89C51RC单片机官方技术资料.STC官网
[5]南京航空航天大学金城学院.一个单片机实现温度传感网络并用数码管显示的设计,2013.
[6]王欢,王忠庆,岳利维.基于STC89C52RC单片机的温度报警系统的设计与实现.晋城职业技术学院学报,2011.
[7]赵亮.跟我学51单片机(七)——LCD1602液晶显示模块.2011.
[8]吉小辉,陈育中.电水壶自动断电控制器的研究与设计.电子设计工程,2013.
[9]谭浩强.C语言程序设计(第二版).清华大学出版社,1999.
[10]薛江玉,张鹏,冀鹏,宋玉倩.基于单片机的智能烧水壶,2011.
附录1电路原理图、PCB图
附录2系统主程序代码
【main.c】
include<
reg52.h>
#include"
STC89C52RC.h"
Lm016l.h"
DS18B20.h"
#defineTIMER0TIMEH0x3C
#defineTIMER0TIMEL0xB0
#defineHEATON0
#defineHEATOFF1
#defineBUZZERON0
#defineBUZZEROFF1
#defineSETTEMPUPLMT100
#defineSETTEMPDOWNLMT30
sbitBuzzer=P3^7;
sbitKeyMode=P0^5;
sbitKeyUp=P0^6;
sbitKeyDown=P0^7;
sbitHeat=P3^6;
//加热控制
sbitReserve=P2^3;
sbitBackLight=P4^3;
//测试用
sbitTest1=P3^2;
sbitTest2=P3^3;
sbitTest3=P3^4;
sbitTest4=P3^5;
//定义几个全局变量
unsignedchartimeflag;
intRlTemp;
//这里定义为int比较时也用int型比较
intsvRlTemp;
//保存一次温度值
intpvTemp;
//前两秒的温度值
intMaxTemp;
//用于寻找最大温度值
//*************************************************************
//*初始化定时器0这里设置50ms定时
voidConfigTimer0()
{
TMOD|=0x01;
TH0=TIMER0TIMEH;
//
TL0=TIMER0TIMEL;
ET0=1;
//
TR0=1;
EA=1;
}
voidSysInit()
InitLCDLm016l();
InitDs18b20();
ConfigTimer0();
voiddelay(unsignedintx)
unsignedinty;
for(;
x>
0;
x--)
for(y=110;
y>
y--);
/*
voidGetAndDisplay()
stt=GetDs18b20Temperature(&
temp);
if(stt)
WriteLm016lString(0,0,"
error"
);
else
{
Integer2String(temp,str);
WriteLm016lString(0,0,str);
fttp=Ds18b20Convert2Temperature(temp);
n=Float2String(fttp,2,str);
WriteLm016lString(0,1,str);
WriteLm016lChar(n,1,0x08);
//这里0x08为第一个自造字符
}
*/
unsignedintabs(inta,intb)
unsignedintrlt;
if(a>
=b)rlt=a-b;
elserlt=b-a;
returnrlt;
//*判断水是否开了
unsignedcharIsWaterBoiling()
staticunsignedcharstb=0;
//if(abs(RlTemp,pvTemp)<
=4)//小于+-0.25度
//{
//stb++;
//}
//else
//stb=0;
//换种方式判断:
找最大值如果没有更大的值则到达沸点
if(RlTemp>
MaxTemp){MaxTemp=RlTemp;
stb=0;
else{stb++;
//判断
if((stb>
=120)&
&
(RlTemp>
1280))
{//如果温度稳定持续超过3min,并且水温超过80度,则认为水开了
stb=0;
return1;
else
return0;
voidBuzzerLight(unsignedcharn)
n>
n--)
Buzzer=BUZZERON;
delay(50);
Buzzer=BUZZEROFF;
delay(30);
voidmain()
inttemp;
floatfttp;
unsignedcharstt;
unsignedcharstr[16];
unsignedchari,n;
unsignedcharmode;