基于单片机的热水控制器设计.docx
《基于单片机的热水控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的热水控制器设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的热水控制器设计
基于单片机的热水控制器设计
一、整体设计方案
1.课程设计要求
1.1题目:
基于单片机的热水控制器设计
1.2要求:
完成基于单片机的热水控制器系统的设计,能够实现水温的自动加热,并检测水温大小,对温度进行显示。
o程序设计合理、简洁。
o自行设计检测及相关处理电路。
o完成单片机数据采集及处理的硬件电路设计及相关软件编程。
o辅助电路及元器件自选。
o自选传感器类型
o加热范围40~100摄氏度
2.设计方案
本文是用51单片机设计的一种多功能热水控制器,具有自动和手动加水、设置水温、实时显示水量及温度和报警功能,并且具有结构简单、可靠性高、成本低等特点。
当前市场上的热水控制器基本上采用双金属片温控,控温精度低、可靠性差、功能单一。
随着微电子技术的发展,单片微处理器功能日益增强,价格低廉,在各方面得到广泛应用。
在热水控制器中应用单片机,具有设计简单、可靠性高、功能易扩展等优点。
热水控制器主要实现对水温的控制,并满足不同用户的个性需求。
因此一个较完善的控制器应具有以下功能:
水温的测量与显示;水量的测量与显示;用户设定功能(如水温设定,定时设定等);对电加热管的控制功能;一些功能键(如定时自动加水,恒温控制,手动加水,手动加热等)。
图1原理框图
二.硬件电路设计
根据热水控制器的功能要求,并结合对51系列单片机的资源分析,采用此系列中的主流型号89C51作为电路系统的控制核心。
电热水控制器的总体布局如图1所示。
基本硬件电路图如图2(a)~(c)所示。
在本系统中,P0.0~P0.3用于七段码显示,P2.6控制水闸开关,P2.7控制电加热管,P3.3~P3.5用于按键设计和读取水量,P3.0~P3.2用于跟DS1820通信进行水温测量,P2.0~P2.1对七段码进行扫描,P2.2~P2.5LED指示灯显示,P3.7控制扬声器用于报警和指示。
1.水温测量电路
水温测量电路如图4所示,测温元件采用DALLAS的单线数字温度传感器DS1820。
DS1820提供九位温度读数,测量范围-55℃~125℃,采用独特1-WIRE总线协议,只需一根口线即实现与MCU的双向通讯,具有连接简单,高精度,高可靠性等特点。
在工作时,通过总线向其提供电源,单片机发出指令码读取温度值。
(1)DS1820的工作原理
DS1820采用3脚PR-35封装或8脚SOIC封装,管脚排列如图2所示。
图中3号引脚为GND,2号引脚I/O为数据输入/输出端(即单线总线),该脚为漏极开路输出,常态下呈高电平。
1号引脚VDD是外部+5V电源端,不用时应接地。
NC为空脚。
图3所示为DS1820的内部框图,它主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速暂存器(内含便笺式RAM),用于存储用户设定的温度上下限值的TH和TL解发器存储与控制逻辑、8位循环冗余校验码(CRC)发生器等七部分。
图2DS1820引脚图
图3DS18B20内部结构图
(2)寄生电源
寄生电源由二极管VD1、VD2和寄生电容C组成。
电源检测电路用于判定供电方式。
寄生电源供电时,VDD端接地,器件从单线总线上获取电源。
在I/O线呈低电平时,改由C上的电压Vc继续向器件供电。
该寄生电源有两个优点:
第一,检测远程温度时无需本地电源;第二,缺少正常电源时也能读ROM。
若采用外部电源VDD,则通过VD2向器件供电。
(3)温度测量原理
DS1820测量温度时使用特有的温度测量技术。
其测量电路框图如图3所示。
DS1820内部的低温度系数振荡器能产生稳定的频率信号f0,高温度系数振荡器则将被测温度转换成频率信号f。
当计数门打开时,DS1820对f0计数,计数门开通时间由高温度系数振荡器决定。
芯片内部还有斜率累加器,可对频率的非线性予以被偿。
测量结果存入温度寄存器中。
一般情况下的温度值应为9位(符号点1位),但因符号位扩展成高8位,故以16位被码读出。
图4DS1820测温原理框图
(4)高速暂存器
在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:
首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后现用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。
考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:
Ts=(Tz-0.25℃)+(CD-Cs)/CD
(5)告警信号
DS1820完成温度转换后,就把测得的温度值与TH、TL作比较。
若T>TH或T因此,可用多只DS1820同时测量温度并进行告警搜索。
一旦某测温点越限,主机利用告警搜索命令即可识别正在告警的器件,并读出其序号,而不必考虑非告警器件。
(6)CRC的产生
在64位ROM的最高有效字节中存储有循环冗余校验码(CRC)。
主机根据ROM的前56位来计算CRC值,并和存入DS1820中的CRC值作比较,以判断主机收到的ROM数据是否正确。
CRC的函数表达式为:
CRC=X8+X5+X3+1。
此外,DS1820尚需依上式为暂存器中的数据来产生一个8位CRC送给主机,以确保暂存器数据传送无误。
2.基本温度水温测量、键盘电路
基本温度水温测量、键盘电路如图5所示,本系统中,有四个功能按键:
定时加水、恒温控制、手动加水和手动加热;三个七段码显示与四个LED灯指示,四个功能按键与水量设定按键使用同一组按键。
按键的优先权高于水量信号,水量高档位信号优先权高于低档位信号,以保证能优先响应按键。
图5基本温度水温测量、键盘电路
3.显示电路
显示电路如图6所示,温度采用二位七段码显示,显示范围0℃~99℃。
水量采用一位七段显示,显示1、2、3、4,四档水位。
对温度和水量进行循环扫描显示。
四个LED用于当前按键功能设定。
图6基本显示电路图图
4.水温和水量控制电路
水温和水量控制电路如图7所示,单片机通过光电耦合对继电器进行控制,用来切断或接通加热管电源,关闭或打开水阀,从而达到对水温和水量的控制。
图7水温和水量控制电路
三.系统软件设计
系统软件采用汇编语言精简指令编写。
本系统中键盘扫描、漏电检测等子程序都通过查询实现,并采用12MHz的时钟频率,对指令的运行时间进行了精确计算和设计,保证软件的可靠性和稳定性。
系统主程序框图如图7所示,DS1820工作程序流程图如图8所示。
1.键盘和显示
本系统中,有四个功能按键:
定时加水、恒温控制、手动加水和手动加热;三个七段码显示与四个LED灯指示。
(1)按下定时加水按钮时,定时LED变亮,并以当前时间为定时时标,每24小时自动加水至设定水量;若长按此钮超过5秒,定时LED灭,并听到“嘟”一声进行水量设定,此后每按一下钮,水量显示加一档,1~4档循环显示,不按此钮超过5秒,再次听到“嘟”一声,水量设定完毕。
系统的定时功能主要通过软件完成。
(2)按下恒温控制钮,恒温LED变亮,表示进行恒温控制,再按一下LED灭,取消恒温控制。
与水量设定类似,长按后,进行温度设定。
(3)按下手动加热钮时,加热LED变亮,加热至65℃,如水量少于1档,则先加水到1档,再按一次取消加热。
(4)按下手动加水钮时,加水至设定水量值,长按可设定水量。
手动加水过程中,再次按下取消加水。
正常情况下,两个七段码显示当前水温,另一个显示当前水位。
2.水温测量
温度读取是通过与DS1820通信完成。
DS1820通信功能是分时完成的,它有严格的时隙概念。
因此系统对DS1820的各种操作必须按协议进行。
DS1820是美国DALLAS公司生产的单线数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,特别适合于构成多点温度测控系统,可直接将温度转化成串行数字信号供微机处理,而且每片DS1820都有唯一的产品号并可存入其ROM中,以使在构成大型温度测控系统时在单线上挂任意多个DS1820芯片。
从DS1820读出或写入DS1820信息仅需要一根口线,共读写及温度变换功率来源于数据总线,该总线本身也可以向所挂接的DS1820供电,而无需额处电源。
DS1820能提供九位温度读数,它无需任何外围硬件即可方便地构成温度检测系统
四.软件流程图设计
五.程序清单
ORG0000H;系统主程序
JMPMAIN
ORG000BH
JMP LEDINT0
ORG001BH
JMPLEDINT1
ORG0100H
PP5:
JMPPP1
PP7:
JMPPP2
MAIN:
MOV34H,#0FFH
MOV35H,#0FFH
MOV36H,#00H
MOV37H,#00H
clr p1.6
setb p1.7
MOVSP,#60H ;给堆栈指针赋初值
MOVTMOD,#51H ;定时器0工作于方式定时器1作为计数器
MOVTH0,#0ECH ;给计数寄存器的高8位赋初值
MOVTL0,#77H ;给计数寄存器的低8位赋初值
MOV 30H,#20
mov 31h,#10
MOV 32H,#20
mov 33h,#10
mov th1,#00h
mov tl1,#00h
MOVIE,#82H
SETB TR0 ;计时开始
setb tr1 ;开始计数
movr0,#0
movr1,#0
movr2,#0
movr3,#0
movr4,#0
LOOP:
movdptr,#0a100h ;读取键盘状态
movxa,@dptr
MOV21H,A ;把A的内容赋给缓冲区21H,再比较判断然后输出
JNB21H.7,PP3 ;加水到50
JNB21H.6,PP7 ;加水到80
JNB21H.5,PP5 ;加水到100
MOVA,34H
CLRC
SUBBA,#1
JCPP3 ;C是1转PP3
JZTTL4 ;A=0转TTL4
AJMPBB ;无条件转移
TTL4:
MOVA,35H
CLRC
SUBBA,#10
JCPP3
MOVA,36H
CLRC
SUBBA,#5
JCBB
JZTTL5
AJMPPP6
TTL5:
MOVA,37H
CLRC
SUBBA,#10
JCBB
AJMPPP6
BB:
MOVA,R0
LCALLXIANSHI
MOV DPTR, #0A000h
MOVx @DPTR,A
lcalldelay
MOVA,R1
LCALLXIANSHI
MOV DPTR, #0A001h
MOVx @DPTR,A
lcalldelay
MOVA,R2
LCALLXIANSHI
MOV DPTR, #0A002h
MOVx @DPTR,A
lcalldelay
MOVA,R3
LCALLXIANSHI
MOV DPTR, #0A003h
MOVx @DPTR,A
lcalldelay
MOVA,R4
LCALLXIANSHI
MOV DPTR, #0A004h
MOVx @DPTR,A
lcalldelay
ajmploop
pp3:
MOVA,#0
LCALLXIANSHI
MOV DPTR, #0A000h
MOVx @DPTR,A
lcalldelay
MOVA,#5
LCALLXIANSHI
MOV DPTR, #0A001h
MOVx @DPTR,A
lcalldelay
MOVA,34H
CLRC
SUBBA,#1
JCPP3
JZTTL
TTL:
MOVA,35H
CLRC
SUBBA,#55
JCPP3
JMPLOOP
pp2:
MOVA,#8
LCALLXIANSHI
MOV DPTR, #0A001h
MOVx @DPTR,A
lcalldelay
MOVA,#0
LCALLXIANSHI
MOV DPTR, #0A000h
MOVx @DPTR,A
lcalldelay
MOVA,34H
CLRC
SUBBA,#2
JCPP2
JZTTL1
TTL1:
MOVA,35H
CLRC
SUBBA,#55
JCPP2
JMPLOOP
PP6:
MOVA,#10
LCALLXIANSHI
MOV DPTR, #0A002h
MOVx @DPTR,A
lcalldelay
MOVA,#13
LCALLXIANSHI
MOV DPTR, #0A001h
MOVx @DPTR,A
lcalldelay
MOVA,#13
LCALLXIANSHI
MOV DPTR, #0A000h
MOVx @DPTR,A
lcalldelay
MOVA,34H
CLRC
SUBBA,#4
JCPP6
JZTTL6
JMPLOOP
TTL6:
MOVA,35H
CLRC
SUBBA,#55
JCPP6
JMPLOOP
pp1:
MOVA,#9
LCALLXIANSHI
MOV DPTR, #0A000h
MOVx @DPTR,A
lcalldelay
MOVA,#9
LCALLXIANSHI
MOV DPTR, #0A001h
MOVx @DPTR,A
lcalldelay
MOVA,34H
CLRC
SUBBA,#4
JCPP1
JZTTL2
TTL2:
MOVA,35H
CLRC
SUBBA,#55
JCPP1
JMPLOOP
TEMPER_L EQU 36H;DS1820温度测量子程序
TEMPER_H EQU 35H
DQ BIT P3.2
; DS18B20初始化程序
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#06BH
TSR1:
DJNZ R0,TSR1 ; 延时
SETB DQ
MOV R0,#25H
TSR2:
JNB DQ,TSR3
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ
RET
;//*****************************************//
; 重新写DS18B20暂存存储器设定值
;//*****************************************//
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH ; 选择9位温度分辨率
LCALL WRITE_1820
RET
;//*****************************************//
; 读出转换后的温度值
;//*****************************************//
GET_TEMPER:
SETB DQ ; 定时入口
LCALL INIT_1820
JB FLAG1,TSS2
RET ; 若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL INIT_1820
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
MOV TEMPER_NUM,A ; 将读出的温度数据保存
RET
;//*****************************************//
; 读DS18B20的程序,从DS18B20中读出一个字节的数据
;//*****************************************//
READ_1820:
MOV R2,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;//*****************************************//
; 写DS18B20的程序
;//*****************************************//
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;//*****************************************//
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;//*****************************************//
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7