基于单片机AT89C51控制的热水器方案设计书.docx
《基于单片机AT89C51控制的热水器方案设计书.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C51控制的热水器方案设计书.docx(23页珍藏版)》请在冰豆网上搜索。
基于单片机AT89C51控制的热水器方案设计书
热水器控制系统以AT89C52单片机为检测控制中心单元,采用DSl2887实时时钟,不仅实现了时间、温度和水位三种参数实时显示功能,而且具有时间设定、温度设定与控制功能。
控制系统可以根据天气情况利用辅助加热装置(电加热器)使蓄水箱内的水温达到预先设定的温度,从而达到24小时供应热水的目的。
本设计主要采用了水位传感器、温度传感器和单片机AT89C52来实现控制。
可以在不同时间进行不同的温度调节,从而实现24小时热水的控制。
摘要1
1总体方案设计3
1.1方案比较3
1.2方案选择4
2.单元模块设计4
2.1各单元模块功能介绍及电路设计4
2.1.1单片机系统设计4
2.1.2控制器实时时钟接口电路5
2.1.3水位检测和温度检测接口电路6
2.1.4DS18B20与单片机接口电路设计7
2.1.4键盘和显示接口电路的设计9
2.1.5光电隔离与辅助加热电路10
3软件设计11
3.1软件设计原理及设计所用工具11
3.2显示子程序13
3.3主程序:
14
附录1:
19
1总体方案设计
1.1方案比较
方案一设计的太阳能热水器控制系统以89C52单片机为检测控制中心单元,采用DSl2887实时时钟,不仅实现了时间、温度和水位三种参数实时显示功能,而且具有时间设定、温度设定与控制功能。
控制系统可以根据天气情况利用辅助加热装置(电加热器)使蓄水箱内的水温达到预先设定的温度,从而达到24小时供应热水的目的。
实际应用结果表明,该控制器和以往显示仪相比具有性价比高、温度控制与显示精度高、使用方便和性能稳定等优点。
AT89C52
图1-1系统硬件结构图
方案二采用系统的温度采集选用PTl000铂电阻温度传感器,采集到的电压信号经集成运放LM324放大到2.O一5.0伏之间,送入串行加转换器11LCl543N,转换结果由单片机处理,其电路原理如图3所示.设计时将加转换器的参考电压设置为vREF+=5.0V,VREF=1.5V.LM324按照同相比例放大电路连接,则Vo=vi*(Rt/R+1)=0.5*(Rt/300+1).Rt值的变化表示了PtlooO温度传感器温度的变化,每个温度值对应一定的转换结果。
可以在程序中建立一个查找表,表中每个元素的地址即为转换结果,元素值即为所对应的温度值。
图1-2系统硬件结构图
1.2方案选择
方案一硬件电路简单,程序设计复杂一些,但是我已经使用开发工具KEIL用汇编语言对系统进行了程序设计,用仿真软件PROTEUS对系统进行了仿真,达到了预期的结果。
由此可见,该方案完成具有可行性,体现了技术的先进性,经济上也没有问题。
2.单元模块设计
2.1各单元模块功能介绍及电路设计物
2.1.1单片机系统设计
单片机系统由AT89C52和一定功能的外围电路组成,包括为单片机提供复位电压的复位电路,提供系统频率的晶振。
这部分电路主要负责程序的存储和运行。
上图中MCS-51内部时钟方式电路外接晶体以及电容C5和C6构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的高低、谐振器的稳定性、起振的快速性和温度的稳定性。
晶体可在1.2MHz~12MHz之间任选,电容C5和C6的典型值在20pF~100pF之间选择,但在60pF~70pF时振荡器具有较高的频率稳定性。
典型值通常选择为30pF左右,但本电路采用33pF。
在设计印刷电路板时,晶体或陶瓷振荡器和电容应尽可能安装的与单片机芯片靠近,以减少寄生电容,更好的保证振荡器稳定和可靠的工作。
为了提高温度稳定性,应采用温度稳定性能好的NPO高频电容。
AT89C52的复位是由外部的复位电路来实现的。
复位电路通常采用上电自动复位和按钮复位两种方式。
本设计中所用到的是上电按钮复位。
图2-2单片机系统
2.1.2控制器实时时钟接口电路
为实现热水器24小时供应热水的目的,控制器必须有一个实时时钟来为系统提供准确的基准时间;在软件设计上则要实时地读出当前时间,同设定时间比较,以决定系统工作状态。
本系统采用美国DALLAS半导体公司最新推出的时钟芯片DS12887,该芯片采用CMOS技术,把时钟芯片所需的晶振和电池以及相关的电路集成到芯片内部,并与MC146818管脚完全兼容。
DS12887芯片具有微功耗、外围接口简单、精度高,工作稳定可靠等优点。
它与89C52单片机的接口电路见下图2-2。
图2-2DS12887与单片机接口电路
2.1.3水位检测和温度检测接口电路
蓄水箱水位和温度检测部分是实现温度智能控制的重要环节,只有准
确地检测出水位和温度,才能通过软件计算提前开始辅助加热的预加热时间。
要实现辅助加热提前时间的精确计算,最好是采用连续液位传感器,但考虑系统成本,本设计仍采用分段式液位传感器(通过软件来提高精度),在水位显示上也仍采用分段显示。
水位检测部分的硬件连接如图2-3所示。
图2-3水位监测及显示接口电路
检测原理如下:
当水箱中无水时,8个非门均由1M欧姆电阻上拉成高电平,所以图中各“非”门(CD4069)输出均为低电平,LED1~LED8均不亮。
当水位高于“非”门1的输入探针时,由于水的导电作用,使“非”门1的输入变为低电平,所以其输出变为高电平,LED点亮,依此类推。
随着水位的上升,各“非”门输出相继为高电平,LED依次点亮。
这里要注意的是上拉电阻不能选择太小,因为水的电阻在100k8左右,所以上拉电阻选择太小的话,将在水位升高时,无法把“非”门输入端拉成低电平。
实验表明,上拉电阻选择在500k~1M欧姆左右能很好地满足电路的工作要求。
为了使89C52随时能够读出当前的水位情况,这里选用74LS244作为状态输入缓冲器。
蓄水箱温度检测电路采用DS18B20芯片使其换成脉冲信号,送到89C52的I/O口(编程为计数器工作模式),通过测量输出脉冲频率的大小来换算成水温高低信号。
2.1.4DS18B20与单片机接口电路设计
基于DS18B20多点温度测量系统以AT89C51为中心器件,以KEIL为系统开发平台,用C语言进行程序设计,以PROTEUS作为仿真软件设计而成的。
DS18B20是智能温度传感器,它的输入/输出采用数字量,以单总线技术,接收主机发送的命令,根据DS18B20内部的协议进行相应的处理,将转换的温度以串口发送给主机。
主机按照通信协议用一个IO口模拟DS18B20的时序,发送命令(初始化命令、ROM命令、功能命令)给DS18B20,并读取温度值,在内部进行相应的数值处理,用图形液晶模块显示各点的温度。
在系统启动之时,可以通过4×4键盘设置各点温度的上限值,当某点温度超过设置值时,报警器开始报警,从而实现了对各点温度的实时监控。
每个DS18B20有自己的序列号,因此本系统可以在一根总线上挂接了4个DS18B20,通过CRC校验,对各个DS18B20的ROM进行寻址,地址符合的DS18B20才作出响应,接收主机的命令,向主机发送转换的温度。
采用这种DS18B20寻址技术,使系统硬件电路更加简单。
如图2-4
图2-4DS18B20与单片机接口电路
2.1.4键盘和显示接口电路的设计
下图为89C52单片机P1口构成的中断方式4*4键盘电路。
P1.0-P1.3为行线,P1.4-P1.7为列线,行线与4输入与门74HC21的一组输入端相连,输出端与外部中断INT1相连。
16个键号Ki(I=0-15)次序如图中标注。
图2-589C52P1口构成的4*4中断方式键盘
行列式键盘处理程序较为复杂,当有键按下时74HC21输出端出现低电平请求中断;在中断服务程序中要再次确认是否真有键按下,真有键按下时,再查出是哪个键按下,把该键的键号送入堆栈保护,等待键释放后再将键号弹出A中。
该键盘输入处理程序的出口状态是键号在A中。
设计中断程序时,先在主程序中将中断系统初始化,并开中断。
在试验演示中通常开中断都设置循环等待。
键盘和显示电路是人机交互的重要手段。
控制键是用户干预系统运行的唯一接口,也是用户比较关心的问题。
为了实现控制器对时间与温度的设定及显示功能,串行显示电路采用串入并出芯片74LS164驱动4位数码管实现时间与温度的静态显示。
该电路只使用89C52的3个端口,配接4片串入并出移位寄存器74LS164与1片三端可调稳压器LM317T。
其中74LS164的引脚Q0~Q7为8位并行输出端;引脚A、B为串行输入端;引脚CLK为时钟脉冲输入端,在CLK脉冲的上升沿作用下实现移位,在CLK=0、清除端MR=1时,74LS164保持原来数据状态;MR=0时,74LS164输出清零,其显示电路如图3-5。
其工作过程如下:
89C52的串行口设定在方式0移位寄存器状态下,串行数据由P3.0发送,移位时钟由P3.1送出。
在移位时钟的作用下,串行口发送缓冲器的数据一位一位地移入74LS164中。
4片74LS164串级扩展为4个8位并行输出口,分别连接到4个LED显示器的段选端作静态显示。
需要指出的是,由于74LS164无并行输出控制端,因而在串行输
入过程中,其输出端的状态会不断变化,造成不应显示的字段仍有较暗的亮度,影响了
显示的效果。
以往的做法是在74LS164的输出端加接4片锁存器或三态门,使移位寄存器串行输入数据时其输出端的变化不反映到LED上,待串行输入结束后再打开锁存器或三态门,将稳定的显示数据送给LED。
本设计电路的独特之处在于仅采用了1片三端可调稳压器LM317T,317T的3、2脚分别是电压输入、输出端,317T的1脚是电压调整端,脚2输出电压随脚1电压而变化。
脚1与接地电阻之间并一个NPN三极管,它的基极受P1.7口线控制,串行输入时P1.7口线为高电平,三极管饱和导通使317T的脚1约为0.3V,脚2输出电压随之下降到1.5V,不足以使共阳极LED发光,故此时串行输入的影响不会反映到LED上;串行输入结束后,使P1.7口线为低电平,三极管截止,脚2输出电压因脚1电压增高便上升到2.0V使LED正常发光。
因此,1片三端可调稳压器LM317T起到了4片锁存器的作用使LED显示不会闪烁。
本电路的另一优点是通过可调电位器P1可在线调整脚2的输出电压,使LED的显示亮度均匀可调,而且省掉了大量的LED限流电阻。
2.1.5光电隔离与辅助加热电路
图3-5为太阳能热水器光电隔离与辅助加热电路设计。
当室外光强不足(阴天、下雨)时,对水箱的水提前加热是很必要的,这一电路恰好能完成这一功能。
工作原理:
当单片机89C52P2.1口输出高电平时,三极管T1导通,致使发光二极管发光,同时光敏三极管T2导通,继电器闭合,电阻丝R1~R4发热,这样就完成了加热任务,此电路虽然简单,但在太阳能热水器中是必不可少的。
图2-7辅助加热电路图
3软件设计
3.1软件设计原理及设计所用工具
热水器不论在什么样的天气里,都能够在设定的时间向用户提供设定温度的热水,从而给用户带来便利。
当控制器在设定的时间使水温达到设定温度时,将通过声光报警提醒用户。
根据这一要求,控制器软件设计采用模块化结构,包括主程序、键盘中断子程序、DS12887更新周期结束中断子程序、LED显示子程序和提前加热时间计算子程序等。
系统主程序主要完成温度和水位的检测以及进行辅助加热时间预算和一些初始化功能。
在主程序中采用了查表方法进行辅助加热提前量预算。
系统主程序流程图如图所示。
图3-1系统程序流程图
对于温度和时间设定,每次设定结束后,就将设定值存入DS12887的非易失性RAM中,下次开机时进行读取。
这样作至少有两个优点:
一是系统在不进行设定时,就认定该设定值和先前一次一样,解决了每次开机总要从头设定的问题,另一个是若系统在运行中间停电而再次来电时,可以不用重新设定,就能按原设定值对温度进行控制,增强了控制器适应外界变化的能力。
对提前加热时间的计算,则是系统能否实现预定功能的重要一环。
因为系统采用分段式水位检测,若采用能量守恒的方法对提前加热时间进行预算,也同样得不到精确的结果。
为了避开繁琐的计算过程,本系统中采用了模糊控制思想,使用了如下一些控制语句:
IF水位高AND温度差大THEN加热时间长
IF水位适中AND温度差适中THEN加热时间适中
IF水位低AND温度差低THEN加热时间少
采用这种思想后,可以用实验方法获得各种情况下需要加热的时间,编制成表格。
使用时,只要查表获得提前加热时间就行了。
显然,表格分得越细,控制就越准确。
本控制器采用温差每等于5℃为一格,就能满
足控制要求了。
为了减小误差,试验表明,可以采用如图的方法。
图3-2水位监测处理示意图
实验中,用水位达到B1时的结果代替水位达到A1时的结果,B2代替A2,B3代替A3,B4代替A4。
这样,CPU读入的A1水位查表后得到的预加热时间是实验中水位在B1处的时间。
经过这种处理,会把由于分段检测而产生的计算误差减小一半,由原来的h变成了h/2(h为分段水位检测间隙)。
如果水箱水深为40cm,分8段检测,此种处理方法的计算将使水位误差由原来的5cm变成了2.5cm。
这种误差对于民用的热水器来说,已完全能够满足要求了。
3.2显示子程序
分析表明,移位寄存器74LS164仅有串入并出作用没有译码功能。
因此,在编写显示驱动程序之前,首先需要计算列写出与本电路对应的LED段选码,然后由89C52的P3.0口送入74LS164的串行输入端,再并行输出到LED的段选端。
需要指出的是,上面显示电路采用TOS28106BHK型号的共阳极LED显示器,根据PCB印制线路板的连线方便,其LED的8个段选端与74LS164的并行输出口即8根段选线的连接没有遵照通常的规律,而是如图3-5所示的段排列为7、6、4、2、1、9、10、5,相应的段选码也要重新计算,如显示字符0的段选码为11H。
电路中设计了4位LED显示器,其功能为:
左首位为百位数或标志位,左二位为十位数,左三位为个位数,左四位为小数点后的十分位数。
据此,给出如图所示的显示子程序框图。
图3-3显示子程序框图
3.3主程序:
ORG000H
JMPSTART
START:
CurtempEQU10H;Curtemp存储地址
PretempEQU11H;Pretemp存储地址
MOVTMOD,#53H
LCALLInitDS12887;初始化DS12887时钟芯片
SETBEA;开CPU中断
LCALLReadTempandTime;读温度时间设定值
LCALLReadWaterandPosition;读水位高度
CLRC;C清零
SUBCurtemp,pretemp
JCOffheat
Heatcontinue:
LCALLFUZZY;预算提前加热时间
LCALLDELAY
LCALLHeat
SJMP$
OffHeat:
CLRP2.1
RETI
Heat:
SETBP2.1
LCALLDELAY
CLRC
LCALLReadTemp
MOVA,Curtemp
ADDA,#2H
SUBA,Pretemp
JNCKeepTemp
JMPHeatcontinue
LCALLKeeptempCON
RETI
InitDS12887:
SETBP2。
1
MOVDPTR,#0BH;初始化DS12887B寄存器
MOVA,#22H;置DS1288724小时模式
MOVX@DPTR,A;允许报警中断禁止其它中断
MOVDPTR,#0AH;初始化DS12887A寄存器
MOVXA,#20H;时钟频率52.628KHZ,禁止SQW
MOVDPTR,#00H;初始化时钟
MOVA,#00H
MOVX@DPTR,A;秒
MOVDPTR,#02H;分
MOV@DPTR,A
MOVDPTR,#04H;时
MOVA,#12H
MOV@DPTR,A
RETI
ReadTempandTime:
LCALLReadTemp
LCALLReadTime
RETI
ORG0013H
JMPKeyBoardINT
KeyBoardINT:
LED显示子程序:
DISI:
SETBP1.7;灭显示
MOVR0,#SBCD
MOVA,@R0;取出要显示的数
ADDA,#2DH;加上偏移量
MOVCA,@A+PC;查表取出段选码
MOVSBUF,A;送出显示
DL1:
JNBTI,DL1;输出完否?
CLRTI;完,清中断标志
INCR0
MOVA,@R0
ADDA,#21H
MOVCA,@A+PC
ANLA,#OEFH;个位加小数点
MOVSBUF,A
DL2:
JNBTI,DL2
CLRTI
INCR0
MOVA,@R0
ADDA,#13H
MOVCA,@A+PC
MOVSBUF,A
DL3:
JNBTI,DL3
CLRTI
MOVA,#0FFH
MOVSBUF,A
DL4:
JNBTI,DL4
CLRTI
CLRP1.7;亮显示
RET
SEGTAB:
DB11H,0D7H,32H
DB92H,0D4H,98H
DB18H,0D3H,10H,0D0H
键盘输入主程序:
MOVP1,#0FH;键盘初始化,P1.0~P1.3置输入方式,P1.4~P1.7为0状态
MOVIE,#84H;开CPU中断,开INT1中断
SJMP$;中断等待
中断服务程序:
ORG0013;INT1中断入口地址
LJMPIO51K16;从中断入口转移键盘处理程序IO51K16
IO51K16:
CALLD10MS;延时10秒
LCALLKEYIN;调键输入检查子程序
JNZLKOUT;有键输入,转查键号
RETI;无键输入,中断返回
LKOUT:
MOVR2,#0EFH;首列扫描字写如R2
MOVR4,#00H;首列偏移值如R4
CONU:
MOVP1,R2;列扫描字写入列线中
MOVA,P1;读入P1口状态到A中
JBACC.0,LONE;检查第0行是否为0状态,不为0表示按下键不在此行,转下行
MOVA,#00H;第0行为0状态,表明按下键在此行,首列号如A
AJMPLKP;转求键号
LONE:
JBACC1.1,LTWO;检查第1行有无键按下
MOVA,#04H;有键按下,该行首列号入A
AJMPLKP;转求键号
LTWO:
JBACC.2,LTHR
MOVA,#08H
AJMPLKP
LTHR:
JBACC.3,NEXT;该列所有行都无键按下,转NEXT
MOVA,#0CH;有键按下,该行首列号入A中
LKP:
ADDA,R4;求键号,键号位首列号加列偏移值
PUSHA;键号入栈保护
WKFE:
LACLLKEYIN;等待键释放
JNZWKFE;键未释放转WKFE等待
POPA;键释放,键号如A
LJMPKJMP;转键操作转处理
NEXT:
INCR4;转查下一列,列偏移值加1
MOVA,R2
JNBACC.7,KND;最后一列查完?
查完中断返回
RLA;未查完,列扫描字左移1位
MOVR2,A;扫描字如R2继续查找
LJMPCONU
KND:
RETI
KEYIN:
MOVP1,#0FH;查完有无键按下,A不为0,有键按下
MOVA,P1
CPLA
ANLA,#0FH
RET
KJMP:
SUBA,#OFH
JCWriteTemp
ADDA,#0FH
CLRC
SUBA,#0EH
JCStoreTemporTime
ADDA,#0EH
CLRC
SUBA,#ODH
JCWaterpoistion
ADDA,#ODH
CLRC
SUBA,#0CH
JCVtemp
ADDA,0CH
CLRC
SUBA,#OBH
JCStoreTime
RETI
ORG0003H
JMPHeat
RET
附录1: