基于单片机的热水控制器设计.docx

上传人:b****4 文档编号:5470088 上传时间:2022-12-16 格式:DOCX 页数:26 大小:144.98KB
下载 相关 举报
基于单片机的热水控制器设计.docx_第1页
第1页 / 共26页
基于单片机的热水控制器设计.docx_第2页
第2页 / 共26页
基于单片机的热水控制器设计.docx_第3页
第3页 / 共26页
基于单片机的热水控制器设计.docx_第4页
第4页 / 共26页
基于单片机的热水控制器设计.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于单片机的热水控制器设计.docx

《基于单片机的热水控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的热水控制器设计.docx(26页珍藏版)》请在冰豆网上搜索。

基于单片机的热水控制器设计.docx

基于单片机的热水控制器设计

基于单片机的热水控制器设计

 

一、整体设计方案

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

    

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1