找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27938|回复: 19
打印 上一主题 下一主题
收起左侧

单片机电热水器控制系统设计文档 已经制作成品成功

  [复制链接]
跳转到指定楼层
楼主

摘要


电热水器作为人们生活中不可或缺的家用电器之一,对我们的生活水平有着重要的影响,常用的热水器主要分为以下三种:燃气式热水器,太阳能热水器以及电热水器。
太阳能热水器虽然有没有污染的优点,但是其使用受到天气与位置的较大限制,加之其不能对温度进行有效控制;燃气热水器虽然不用受到上面的限制,但是人们通常会对其使用过程中的一些危险,如一氧化碳中毒和燃气泄漏的担心,加之其安装过程非常繁琐,也渐渐淡出人们的视线;而电热水器在具有其上优点的同时,其安装十分方便,同时在当今时代,电热水器的各方面的研发已经十分的成熟,安全性也能很好的得到保证。
而随着科技的发展,传统的机械式控制系统一难以满足人们对高生活水平的要求,而在微处理器技术、传感器技术的进一步成熟的现今社会,电热水器开始摒弃传统的机械式的控制方式,转而采用全新的控制方式,,以微处理器为核心,通过传感器测温,然后再通过显示屏显示,辅以友好的人机界面,从而实现热水器的智能使控制方法。
本文完成的控制系统是利用AT89S52单片机作为控制核心的,然后利用其现有接口外接各种硬件模块,主要有:温度测量电路,实时时钟电路,键盘,看门狗电路,加热开关,LED显示电路。
软件部分主要是为实现系统功能而进行的C语言编程。
本系统为一款智能式电热水器,使用独立键盘输入各种指令,使用DS18B20测量温度,测量温度精度可达到0.01℃,采用一块LCD显示屏显示所需要显示的各种数据,便于用户的操作,通过用户的各种事先指令,对单片机进行操作,达到控制热水器的加热系统的工作状态,基本达到了对热水器的控制的目的。


目录
第一章 绪论1
1.1引言              1
1.2选题背景与意义              1
1.3研究现状              2
1.4研究内容              2
1.5本文结构              4
第二章 电热水器控制系统设计方案4
2.1系统功能说明
2.2系统主要实现功能
2.3系统整体设计方案
2.4方案论证
第三章 主要元件介绍
3.1单片机系统模块介绍
3.1.1 AT89S52单片机的主要性能
3.1.2 AT89S52管脚功能说明
3.1.3单片机的最小系统
3.2温度检测模块
3.2.1 DS18B20的主要功能及特点
3.2.2DS18B20的内部结构
3.2.3 DS18B20的工作时序
第四章 硬件模块的设计
4.1 温度采集模块
4.2实时时钟电路模块
4.2.1 DS1302的介绍
4.2.2实时时钟模块原理图
4.3键盘输入模块
4.4继电器加热模块
4.5 LCD显示模块设计
4.5.1 LCD模块概述
4.5.2 LCD模块硬件说明
4.5.3 内部控制指令
4.5.4显示硬件设计原理图
4.6其余硬件模块设计
第五章系统软件设计
5.1主程序模块
5.2 DS18B20测温模块
5.3实时时钟模块
5.4 LCD显示模块            
5.5键址返回程序
5.6测试及性能分析            


  •                  绪  论

1.1引言

我国作为热水器生产的大国,近年来热水器的发展十分迅速,而热水器主要有三个研究方向:太阳能,燃气式与电热式。近年来因为单片机技术的发展,传感器技术的渐渐成熟,电热水器的数字化与精确控制已经变成可能。
作为一种需要在浴室,洗手间与厨房中使用的电器,这种电热水器采用水电分离的控制方式,即采用小电流低电压的控制电路来控制高电压大电流的加热电路,一般情况下,使用十分安全。并且在安全可靠的基础上,这种热水器还提供清楚的温度显示与方便的温度调节装置,所以在目前的市场上十分受到欢迎。

1.2选题背景与意义

本文对电热水器的控制系统进行可研究,具体研究的意义如下:
1) 随着传感器测量技术的渐渐成熟,这种技术被广泛的运用在了在传统测温方式不便于温度测量的场合,而且传感器作为测量元件其相较于传统测温系统,测量精度与可靠性得到了进一步的提升,这一技术在当时与以后的时间里得到了发展与完善,迅速的显示出来其对于传统的物理式的温度测量系统的优越性。[1]
2) 在这一系统中(温度采集与控制),我们要求对温度进行实时控制,单片机具有极强的处理能力,将其运用在温度控制系统中就具备了传统的控制电路所不具有的实时控制能力,随着单片机技术的发展成熟以及周边元件的开发,其控制方式变得越来越简单,并且其相较于传统控制电路,可以大幅度的提高温度控制的精度,从而达到更高的技术要求。
3)单片机由于体积小重量轻、价格便宜、功耗低,控制能力强及运算速度快等特点,因而采用其作为主控芯片,使整个系统设计简单易行,成本低廉,使用方便。
4)就目前来看,随着天然气价格上涨以及高层住房的普及,燃气式热水器与太阳能式热水器因为其自身的缺陷而失去市场占有率,而电热水器由于其自身不会受到这种限制,并且电热水器由于其小巧的外形、快速的加热速度、节能的设计、可靠地安全性等特点所以在今后的热水器市场上必将作为一种主流热水器出现。
所以选取电热水器的控制系统作为此次的研究课题是具有十分重要的意义的。

1.3研究现状
    电热水器在中国的历史已经有10多年了,期间也经历了数次起落的过程,在上个世纪的最后几年,随着国外品牌的进入和国内一些大家电厂的目光转向电热水器,储水式电热水器能适应任何天气变化,普通家庭可直接安装使用,长时间通电可以大流量供热水。使用时不产生废气,既安全又卫生。目前市场上销售的电热水器多数还带有防触电装置。干净卫生,不必分室安装,调温方便。随着技术的成熟,今后将朝着保温层整体发泡技术、温控器置入内胆、加热管下潜式设计、节能免更换几个方面发展。
热水器是一种可供浴室,洗手间及厨房使用的家用电器。据国务院发展研究中心市场经济研究所统计数据表明:近年来我国热水器的销量每年以 25%的速度上升,在未来五年内,销售额每年可达近500亿以上。众所周知,燃气热水器因其安全隐患及越来越高的使用成本正渐渐淡出热水器市场,而太阳能热水器也因其严格受天气气候及安装条件影响而很难占据更大的市场份额,所以电热水器迅速崛起而不断壮大。为了满足人们对现代电器的智能化的要求,利用目前电子技术的最新成果改善电热水器的性能已经完全可能和必要。本课题将以单片机为控制核心,实现对热水器的自动控制,设计出一款具有自动化、智能化、易于操作、控制精度高、性价比高的电热水器控制系统。

1.4本文研究内容

1)本文所研究的电热水器控制系统由7个部分组成:单片机以及外部电路、电源电路、按键输入电路、LED数码管及指示灯电路、报警电路、加热控制电路和温度采集电路。
2)作为最重要的主控芯片,我们选用51系列单片机作为核心来进行此次的设计。单片机作为微型计算机的一种,是嵌入式微机系统,是作为其他系统的组成部分使用的,在物理结构上嵌于其它系统之中,英文为Embedded Systems。嵌入式系统将计算机硬件和软件结合起来,构成一个专门的计算装置,实现特定的功能。它是一个大系统或大的电子设备中的一部分,工作在一个与外界发生交互并受时间约束的环境中,在没有人工干预的情况下进行实时控制。自从20世纪70年代以来,单片机经历了初级、发展、高速发展三个阶段。单片机性能不断地完善,性能价格比显著提高,种类和型号快速增加。从性能和用途上看,单片机正朝着面向多层次用户的多品种多规格方向发展,哪一个应用领域前景广阔,就有这个领域的特殊单片机出现。近几年来,单片机以其集成度和性价比高、体积小等优点,在工业自动化、过程控制、数字仪器仪表、通信系统以及家用电器产品中有着不可替代的作用。
3)220V交流电加热装置的通断由继电器控制,其中继电器中的保险丝会在温度过高的情况下会熔断,防止加热管干烧,并且在单片机上还加上发光二极管显示加热电路的工作情况。

1.5本文结构

本文以对单片机的研究作为基础,对DS18B20及单片机控制显示,输入输出等方面进行了研究,全文分为6章,各章内容如下:
第一章主要介绍了电热水器控制系统的基本概念、特点研究现状,阐述了电热水器的研究背景以及研究意义,概括的阐述了本次设计的主要内容。
第二章表明了本次设计的技术指标要求,主要介绍了采用的几个设计方案与各自的优缺点,并在最后表明了本次设计最终所采用的方案。
第三章阐述所选择的几个重要元件的特点与性能第四章主要介绍了电热水器控制系统的硬件电路的设计,主要介绍了各模块的设计方案。
第四章对系统的硬件模块的设计进行阐述,对各硬件的原理及主要参数进行了描述。
第五章对系统的软件设计进行阐述,以流程图为线索对各个模块的软件程序的设计方案进行了介绍。
第六章总结了全文的研究工作,给出了存在的问题与进一步的研究方向。


第二章 电热水器控制系统设计方案

2.1系统功能说明

本设计采用AT89S52单片机作为主控芯片,利用数字式温度传感器DS18B20作为温度采集装置采集温度,将温度信号传送给单片机后通过一片液晶显示屏显示出来。
系统工作的温度可以通过电路板上的按键自主进行设定。
系统采用了一个继电器,用单片机为主的控制系统控制继电器触电的吸合,来控制交流电加热电路,达到以弱电控制强电的目的。
系统必须设置温度报警系统,即达到设定温度的上限时扬声器报警,系统自动断电,当温度恢复时,系统重新恢复工作。

2.2系统主要实现功能

系统主要功能如下:
1)测量热水器内的温度,并通过显示屏实时显示温度值,显示范围为0℃~70℃。
2)正常状态下显示系统时钟。
3)可手动设定时钟时间即对时钟进行校准。
4)可以人工设定热水器内的烧水温度,范围在20℃~70℃之间,也可以无需设定,打开后自动烧水,温度上限为70℃。
5)具备定时功能,限定烧水时间。
6)可以立即开机或在24小时内任意设定开机时间。
7)当热水器内没有水时,有报警提示,并开关自动关闭,即有防止干烧功能。
8)要求热水器有一定的抗干扰的功能。

2.3系统整体设计方案

电热水器控制系统的整体设计方案包括硬件设计与软件设计方案,硬件方案主要是指以单片机为核心,包括外接的温度采集电路,实时时钟电路,键盘,热水器加热开关,液晶显示电路,报警电路以及复位电路。具体硬件框图如图2.1所示


2.4方案论证

按照前面的课题要求,我们首先确定运用单片机AT89S52作为本次设计的核心部件。
在温度采集方面有多种选择,常见的温度传感器分为以下几种:热敏电阻式温度传感器、热电阻式温度传感器、热电偶式温度传感器、模拟集成温度传感器、智能温度传感器。本次设计原本选择的是pt1000铂电阻温度传感器,其作为高精度的温度敏感元件,具有测温范围大,测温精度高,稳定性好,示值复现性高与耐氧化等特点,常被用作0℃~926℃温度区间内的标准温度计,其特性曲线为:-200°C~0°C时,Rt=R0[1+At+Bt2+c(t-100)t3];0°C~650°C时,Rt=R0[1+At+Bt2]。(Rt为温度为t°C时热电阻的阻值,R0为0°C时的阻值,A、B、C为实验测定的常数,A=3.90802×10-2,B=5.802×10-7,C=-4.22×10-7)本系统使用的R0为1000Ω。而要将pt1000作为本次设计的元件,还需要语气配套的传感器测量电路与放大电路两部分,具体电路如图2.2所示。[12]
但是在实际购买时发现pt1000电阻由于价格过高,所以在最终设计中并没有采用pt1000作为测温元件来使用,同时,在同组同学推荐下采用了另一种集成式温度传感器DS18B20作为测温元件,DS18B20虽然测温范围比pt1000小,但是在满足本设计要求的基础上,其价格不到pt1000的一半,并且其硬件电路由于舍去了普通传感器所需附带的A/D电路的设计,所以其硬件电路的设计更加简单,所以采用了DS18B20作为最终设计中的测温元件。[11]

本次设计的要求是选择51单片机作为核心的处理器,但是市场上做51单片机的厂商有很多家,其中比较著名的有STC公司、MICROCHIP公司、德州仪器公司、Intel公司、ATMEL公司、Philips公司、Siemens公司。[9]
其中STC公司的STC单片机主要是基于8051内核,是新一代增强型单片机,指令代码完全兼容传统8051,速度快8~12倍,带ADC,4路PWM,双串口,有全球唯一ID号,加密性好,抗干扰强。
还有MICROCHIP公司的PIC单片机,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片.
PHILIPS公司的PHLIPIS 51LPC系列单片机是基于80C51内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求。
ATMEl公司的8位单片机有AT89、AT90两个系列,AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单片机,也叫AVR单片机。
而作为第一次使用单片机做独立设计,我选用的是ATMEL公司的AT89S52单片机,AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 储存器。使用Atmel 公司高密度非易失性储存器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序编程器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。

众所周知,单片机的程序写入过程不是一帆风顺的,其常常需要多次的写入与调试的过程,这里采用AT89S52的优点就是AT89S52额外添加了8k在系统可编程(即ISP)Flash存储器,特意设计为方便在线编程,使得其下载线电路简单,且可实现并行和或者串行模式的在线编程,使得每一次的程序下载与调试不必将单片机从PCB板上拔下,这样不仅使程序调试变得更加方便,其次还会大大延长单片机与PCB板的寿命。
由于本次设计需要有定时开关机的功能,而单片机其内部时钟只能作为其内部程序运行的基准而不能满足设计的要求,所以外接了一个时钟芯片来满足本次设计的要求。[10]
市面上的主流的时钟芯片有DS1302、 DS1307、PCF8485、SB2068等等。这些芯片结构简单,价格低廉,而实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
在显示方面采用一个液晶显示屏来显示主要的参数,液晶显示屏相对于LED数码管虽然编程方面更加繁琐,但是相对的其还具有更多的优点,其除了可以顺利的显示数字之外,还可以对显示的数字进行简单的注释,使得人机操作界面变得更加友好,其次在有关网站上也可以顺利的查找到有关DS1302的信号显示程序,本次显示界面除了有温度的显示还需要有时间的显示,定时操作信号的显示,采用LCD显示屏使操作显得更加方便。[6]
在键盘的选择上,有两种选择:一是采用独立式按键键盘,第二种是采用矩阵式键盘。矩阵式一般键盘采用4*4式键盘,而本次设计中并不需要如此多的功能按键,所以本次设计,选择了独立式按键,本次总共使用了6个按键。其中按键1的功能是系统的复位,按键2的功能是实现实时时钟的时间校准功能,按键3实现的功能是实现烧水温度的设置功能,按键4实现的功能是烧水定时功能的设置,按键5与按键6分别是“+”“—”功能键。
然后本次设计中还加入了一个发光二极管与蜂鸣器。
发光二极管用来显示继电器的闭合状况,使得加热电路的通断能够被更直接的观察。
而加入蜂鸣器的作用是在进行某项操作时进行指示作用,还有在达到烧水温度或者定时时间到的时候起到报警作用。



第三章 主要元件介绍

3.1单片机系统模块介绍

AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K在线可编程Flash 存储器,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在线可编程,亦适于常规编程器。在一个芯片上,拥有灵巧的8 位CPU 和在线可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。[1]
AT89S52具有以下标准功能:8K字节的Flash,256字节的RAM,32 位I/O 口,看门狗定时器,2个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件,可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作;掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

3.1.1 AT89S52单片机的主要性能

与MCS-51单片机产品兼容
8K字节在系统可编程Flash存储器
1000次擦写周期
全静态操作:0Hz~33Hz
三级加密程序存储器
32个可编程I/O口线
三个16位定时器/计数器
八个中断源
全双工UART串行通道
低功耗空闲和掉电模式
掉电后中断可唤醒
看门狗定时器
双数据指针
掉电标识符

3.1.2 AT89S52管脚功能说明

AT89S52引脚如图3.1所示。


图3.1  AT89S52引脚结构图
VCC :电源
GND : 接地
P0口: P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用,在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节,在程序校验时,输出指令字节。程序校验时,P0口需要外部上拉电阻。
表3.1 P1口第二功能


P1口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如表3.1所示。在flash编程和校验时,P1口接收低8位地址字节。
P2口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:P3 口是一个有内部上拉电阻的8 位双向I/O 口,P3 输出缓冲器能驱动4个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如表3.2所示。在flash编程和校验时,P3口也接收一些控制信号。
表3.2  P3口第二功能


RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置 “1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND.为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12V的VPP电压。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。[7]

3.1.3单片机的最小系统

单片机的最小系统是指运用最少的元件使单片机运行的系统,一般包括一下的几个部分:晶振电路、复位电路、电源电路和串口电路。
晶振是电路中常用用的时钟元件,全称是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。[2]
晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
而晶振由于会与单片机的XTAL1与XTAL2脚构成的振荡电路中会产生谐波,从而降低电路时钟振荡器的稳定性,所以一般会匹配两个30pf的电容来消减谐波对于电路稳定性的影响。
晶振电路如图3.2所示:,XTAL1 和XTAL2 分别是放大器的输入、输出端
图3.2 晶振电路

系统复位有两种方式:上电复位与手动复位。[3]
上电复位:上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。

手动复位:首先经过上电复位,当按下按键时,RST直接与VCC相连,为
图3.3复位电路


高电平形成复位,同时电解电容被短路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,正常工作。[5]
一般采用手动复位,其对于上电复位方式更加方便,不需要切断电源便可对系统进行复位,复位电路如图3.3所示

3.2温度检测模块

3.2.1 DS18B20的主要功能及特点

DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。[8]
DS18B20具有以下特性:
独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线。
每个设备都有一个唯一的64位序列码,存储在ROM中。
简单的多点分布式测温应用。
在使用中不需要任何外围元件。
可以从数据线供电。电源范围为3.0V~ 5.5V。
测温范围 -55℃~+125℃。
在—10℃~+85℃间,测温分辨率为0.5℃。
温度计分辨率可由用户选择,9至12位之间。
在750毫秒内将温度转换为12位字。
用户可自定义非易失性报警的设置。
报警搜索命令定义和存储的设备,其温度不收程序限制(温度报警状态)。
采用8引脚SOP和3引脚TO- 92封装。
软件与DS1822兼容。
其引脚如图3.4所示:





图3.4 DS18B20引脚图
引脚说明:
GND - 接地
DQ  - 输入/输出数据
VDD - 电源电压
NC  - 无连接

DS18B20的极限使用条件
各引脚对地电压: -0.5V~+0.6V
工作温度:  -55℃~125℃
储存温度:  -55℃~+125℃
焊接温度参见J-STD-020A的规格
*以上指出的器件在进行正常焊接操作时所需要的环境条件,可能还有部分为能说明但是在操作规格中已经暗示器件可正常运行的环境。长期工作在极限条件下可能会影响器件的可靠性。

3.2.2DS18B20的内部结构

DS18B20的内部存储资源分为8个字节的ROM,9个字节的高速暂存器RAM,3个字节的EEPROM。如图3.5所示。


图3.5  DS18B20内部结构图
每只DS18B20都有一个唯一存储在ROM中的64位编码。最前面8位是单线系列编码,接着的49位是唯一的序列号,最后8位是以上56位的CRC编码。当一条总线上皆有多个DS18B20时,就通过序列号对其加以区分。
主机操作ROM的指令有5种:
33H——读ROM。读DS18B20温度传感器ROM中的编码。
55H——匹配ROM。发出此命令后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20并使之做出响应,为下一步对该DS18B20的读写做准备。
F0H——搜索ROM。用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,位操作各期间做好准备。
CCH——跳过ROM。忽略64位ROM地址,直接向18B20发温度变换命令。
ECH——告警搜索命令。执行后只有温度超过设定值上限或下限的芯片才做出响应。
高速暂存器RAM由9个字节组成。其组成如图3.8所示。包括两个温度显示位,两个复制的TH和TL,一个配置寄存器和三个保留位,一个CRC校验值。可电擦E2PROM又包括温度触发器TH和TL,以及一个配置寄存器。

表3.3  高速暂存器RAM组成
寄存器内容
字节地址
温度值地位(LSB)
0
温度值高位(MSB)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8

操作RAM的指令主要有:
44H——温度转换。启动DS18B20进行温度转换,结果存入RAM。
BEH——读暂存器。读内部RAM中的温度数据。
4EH——写暂存器。发出像内部RAM写上、下限温度数据指令,紧跟该命令之后传送2字节的数据。
48H——复制暂存器。将RAM中的TH、TL复制到E2PROM中。
B8H——重调E2PROM。将E2PROM中内容恢复到中。
B4H——读供电方式。寄生供电时,DS18B20发送0,外界电源供电时,DS18B20发送1。

3.2.3 DS18B20的工作时序

DS18B20需要严格的单总线协议以确保数据的完整性,主要包括初始化系列,读序列,写序列,所有时序都是讲主机作为主设备,单总线设备作为从设备。每一次命令和数据的传输都是从主机启动写时序开始,如果要求单总线器件会送数据,在进行写命令后,主机需启动读时序写完数据将接受。数据和命令的传输都是地位在先。
初始化时序:
1)先将数据线置高电平1。
2)延时(该时间要求不是很严格,但是要尽可能短一点)。
3)数据线拉到低电平0。
4)延时750us(该时间范围可以在480~960us)。
5)数据线拉到高电平。
6)延时等待。如果初始化成功,则在15~60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。
7)若CPU读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起至少要480us.
8)将数据线再次拉到高电平1后结束。如图3.6所示。



图3.6  初始化时序图

写时序:
1)数据线先置低电平0。
2)延时确定的时间为15us。
3)按从低位到高位的顺序发送数据。
4)延时时间为45us。
5)将数据线拉到高电平1。
6)重复1)~5)步骤,直到发送完整个字节。
7)最后将数据线拉高到1。如图3.7所示。

图3.7  写数据时序图
读时序:
1)将数据线拉高到1。
2)延时2us。
3)将数据线拉低到0。
4)延时6 us。
5)将数据线拉高到1。
6)延时4 us。
7)读数据线的状态得到一个状态位,并进行数据处理。
8)延时30us。
9)重复1~7步骤,直到读取完一个字节。如图3.8所示。

图3.8  读数据时序图



第四章 硬件模块的设计

在第二章已经提到硬件件模块的设计主要是指以单片机为核心,包括外接的温度采集电路,实时时钟电路,键盘,热水器加热开关,液晶显示电路,报警电路以及复位电路的设计。

图4.1 硬件模块设计框图

4.1 温度采集模块

首先我们选择DS18B20作为本次设计的测温元件。
由第三章有关内容可知DS18B20温度传感器可以将温度这一模拟信号转化为数字信号供处理器进行处理,从而省去了电阻电感式传统温度传感器的信号运放模块与A/D转换模块。
DS18B20只有三根外引线:单线数据传输总线端口DQ (2),外供电源线VDD(3),共用地线GND(1)。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。

在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,具体的接口电路如图4.2所示。
图4.2温度传感器接口电路

4.2实时时钟电路模块

本次设计采用的外接时钟模块芯片是美国DALLAS公司的DS1302时钟芯片。

4.2.1 DS1302的介绍

其作为一款高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2DS1302供电,当Vcc2< Vcc1时,由Vcc1DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,
CE提供结束单字节或多字节数据传输的方法。
具体引脚图如图4.3所示

图4.3 DS1302引脚图

图4.4 DS1302内部结构图

4.2.2实时时钟模块原理图

电路原理图如图4.5所示,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接12MHz晶振,为芯片提供计时脉冲。


图4.5 DS1302实时时钟电路接线电路

4.3键盘输入模块

键盘输入原理图如图4.6所示:
P3.3~P3.7分别接按键S1~S6
按键的功能分别是:
S1时间调整按钮
S3烧水开始按钮与烧水温度调整按钮
S4烧水时间设定按钮
S5“+”功能键
S6“—”功能键


图4.6键盘输入模块原理图

4.4继电器加热模块

继电器的定义是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器,它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
本设计所用的为型号SRD-05VDC-SL-C的继电器。线圈电压为直流5V,为一单刀双掷继电器,其引脚结构如图4.7所示。


图4.7 继电器引脚图
除线圈外,另三个引脚构成一个单刀双掷开关,当线圈通电时,开关达到另一边,原来的开触点吸和,闭触点断开。本设计中,目的是用继电器吸和,接通外接的以加热设备,从而起到温度控制的作用,只需用到一组常开触点,则另一端空置。
本次继电器模块的设计原理图如图4.8所示:

图4.8 继电器设计原理图

4.5 LCD显示模块设计

4.5.1 LCD模块概述

本次设计采用的是一块1602LCD液晶模块,其共可以显示2 行×16 个字符,每个字符是由5×8点阵组成的字符块集。字符型液晶显示模块由字符型液晶显示屏(LCD),控制驱动主芯片SPLC780C 及其扩展驱动芯片SPLC1OO,配以少量外围阻﹑容元件结构件等装配在PCB 板上而成。YB1602A 采用COB 工艺制作,结构稳定,使用寿命长。
其主要特性如下:
8位并行数据串口,适配M6800系列时序;
可选为并行数据方式;
具有字符发生器ROM,含10880位;
192中5*8点字符
64种5*10点字体字符
低功耗,高可靠性;

4.5.2 LCD模块硬件说明

1)接口说明
表4.1 LCD1602接口说明
管脚序
名称
电平
功能描述
1
VSS
0V
电源地
2
VCC
5.0V
电源输入
3
V0
LCD驱动电压输入
4
RS
H/L
RS=H,表示DB0-DB7 为显示数据
RS=L,表示DB0-DB7 为指令
5
R/W
H,H→L
R/W=H,数据被读到DB9-DB7
R/W=L, 数据被写到DB9-DB7
6
E
H/L
使能信号
7
DB0
H/L
数据线
8
DB1
H/L
数据线
9
DB2
H/L
数据线
10
DB3
H/L
数据线
11
DB4
H/L
数据线
12
DB5
H/L
数据线
13
DB6
H/L
数据线
14
DB7
H/L
数据线
15
BLA
5.0V
背光正极(LEDK﹑BLK)
16
BLK
0V
背光负极(LEDA﹑BLA)

备注:第3 脚V0 用来调节对比度,LCD 的驱动电压Vop=VDD-V0,YB1602 的Vop是4.8V,此时显示最佳对比度,故在5.0V 供电模式下,可以在V0 与电源地(0V)之间接一个10K 的可调电位器来调节对比度。
2)最大工作范围
逻辑工作电压(VDD):4.5V~5.5V
电源地(VSS):0V
LCD驱动电压(Vop):-0.2V~+0.3V

4.5.3 内部控制指令

表4.2 LCD内部指令表
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容

4.5.4显示硬件设计原理图


根据设计要求与液晶控制方式,采用并行工作方式,将单片机的P0口作为数据传输口,而又由于单片机的P0口内部没有上拉功能,P0口作为I/O口输出的时候时 输出低电平为0 输出高电平为高组态(并非5V,相当于悬空状态)。也就是说P0 口不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻[4](即外接一排阻连接到VCC上,如图4-8所示)。其硬件显示模块如图4.9所示。[16]



图4.9 液晶显示模块原理图

4.6其余硬件模块设计



蜂鸣器电路在输入为低电平时导通,作为某些按键按下的指示音。
LED灯在继电器断开即加热工作时亮,在加热电路断开时,LED灯熄灭。



第五章系统软件设计
根据系统所需要实现的功能,软件设计主要分为如下的几个模块:主程序、温度读取模块设计、实时时钟模块设计、LCD显示模块设计、键盘扫描程序以及按键消抖程序。
本系统的工作流程是:系统上电后,对电路板上的各部分初始化;然后按下按键2,对时间进行设定;按下按键3之后,对烧水温度进行设定;按下按键4后,对烧水时间进行设定,当温度超过设定的温度之后,蜂鸣器工作,系统停止工作;在系统受到较强干扰时,按下按键1可以对单片机进行复位。

5.1主程序模块

主程序主要完成的是对个全局变量进行定义,对时钟与时间的初始化,调用子函数功能。
具体流程图如图5.1所示。
主程序清单如下:
void main()
{
              bit bz=0;
              float ttt;         
              char we[6];
              unsigned int i;
              int te;
              delayms(1);
              chushishizhong();                //初始时钟
              chushishijian();                 //初始时间

              //writetime();
kaishi:
    writecom(0x01);      //清零
              while(1)
              {
                            readtime();              //读取时间
                            t[0]=shijian[4]/10+0x30;              //时间数据处理
                            t[1]=shijian[4]%10+0x30;


5.2 DS18B20测温模块

此模块主要任务是对DS18B20进行初始化,然后再进行读字节、写字节的工作,最后将读得的16进制温度传送到处理器内进行处理。
DS18B20测温流程图如图5.2所示

具体程序如下:

(具体程序详见附件)

5.3实时时钟模块

实时时钟模块完成时间的设定与时间的读取,包括年、月、日、时、分、秒。
具体流程图如图5.3所示

具体程序如下:
#define uchar unsigned char

sbit  res=                              P2^0;    //数据命令口选择
sbit clo=              P2^2;        //脉冲信号口选择
sbit io=P2^1;            //数据口选择

#define miao               0x80//秒


5.4 LCD显示模块

LCD显示模块主要实现各个数据的显示功能,包括时间的显示与温度以及提示字的显示。
显示模块的流程图如图5.4所示。




具体程序如下:

#define port P0
#define uchar unsigned char
#define uint unsigned int

sbit rs=P2^7;        //将P2.0设置为数据选择口
sbit rw=              P2^6;    //将P2.6设置为读写选择口
sbit en=                            P2^5;   //将P2.5设置为使能信号口
(具体程序详见附件)

5.5键址返回程序

键盘扫描程序的功能是逐个扫描各个功能键和“+”“—”键是否被按下,若按下某个按键,则返回相应的键址。
其按键扫描程序如下:
sbit k1=P3^3;    //定义每个按键的数据口 P3.3为S1按键
sbit k2=P3^4;    //P3.4对应S2按键
sbit k3=P3^5;    //P3.5对应S3按键
sbit k4=P3^6;    //P3.6对应S4按键
sbit k5=P3^7;   //P3.7对应S5按键

unsigned char keyscan()    //定义键址返回程序
{
    if(k1==0)     //当按键1按下
                 {
                 delayms(10);   //消抖 延时
                   if(k1==0)  
                            {
                            while(k1==0);
                            return 1;    //返回键址1
                            }
                 }
    else if(k2==0)  //当按键2按下
                 {
                 delayms(10);
                   if(k2==0)
                            {
                            while(k2==0);
                            return 2;   //返回键址2
                            }
                 }
    else if(k3==0)    //当按键3按下
                 {
                 delayms(10);
                   if(k3==0)
                            {
                            while(k3==0);
                            return 3;      //返回键址3
                            }
                 }
    else if(k4==0)    //当按键4按下
                 {
                 delayms(10);
                   if(k4==0)
                            {
                            while(k4==0);
                            return 4;      //返回键址4
                            }
                 }
    else if(k5==0)    //当按键5按下
                 {
                 delayms(10);
                   if(k5==0)
                            {
                            while(k5==0);
                            return 5;       //返回键址5
                            }
                 }
                 else
              return 0;        //若没有按键按下则返回0

}

5.6测试及性能分析

实际硬件测试图如下:
1)接通电源,系统正常显示时钟,如图5.5所示
图5.5
实时时钟显示
2)按下按键2,,光标闪烁,进入时钟校准模式,如图5.6所示
图5.6
时钟校准
3)按下按键3,系统显示当前温度,按下按键5,按键6调节烧水温度,当水箱内温度低于目标温度时,LED灯亮,表示继电器断开,加热电路工作。,如图5.7所示。
图5 .7加热模式
4)当水箱内温度达到加热温度时,LED灯熄灭,加热电路停止工作,在温度降到设定温度以下,继电器断开,继续加热。如图5.8所示

图5.8 继续烧水
5)按下按键4,进入加热时间设定,再按下按键4则进入定时烧水模式。如图5.9所示

图5.9 定时烧水

6)按下按键1,则对系统进行复位操作,系统初始化到时间显示画面,如图5.10所示
图5.10 复位操作

结论:成品经实际测试,基本达到本次设计的各项要求。


第六章 结论
本文主要阐述了以51系列单片机为核心处理器完成电热水器控制系统的设计。
本次设计主要完成的任务有:
1)51单片机最小系统的研究,了解了51系列单片机的两种复位方式;
2)本文研究了两种方式键盘设计的优劣,并且了解了如何运用软件对抖动现象的消除;
3)本文阐述了LCD液晶显示屏的显示原理,并且研究了液晶显示屏的动态数字的显示方式;
4)本次设计详细阐述了DS18B20温度采集芯片的详细参数,工作原理与和单片机的连接电路,以及如何对其进行软件编程以完成所需要的操作编程方法。
本次设计在初期时曾由于设计经验的不足,而导致在初步设计完成之后,编程与购买各芯片进行硬件组装,制作实物时,发现很多芯片价格过于昂贵,或者某些芯片由于型号过老而难以购买,同时在对某些芯片进行软件模块编程时发现某些芯片的编程相对有些困难,于是在后期又进行一次设计方案的改变,但是由于时间过紧,此次设计还有定时开关机功能没有实现。并且由于设计经验的不足,单片机在某些时候会由于不确定因素出现死机的状况,在复位之后又能进行正常的工作。
本次设计使我自己对所学的专业知识得到了进一步的巩固,也让我发现了在之前的课程学习中所未掌握的部分,从而使得自己在专业知识方面得到了一次提高,同时也让对自己的专业有了一个全新的认识,此次的设计,不仅锻炼了自己分析问题与处理问题的能力,还提高了自己的动手能力,这次设计对于现在即将走上工作岗位的大学生来说,是一个十分宝贵的经验。


附录A 硬件设计原理图与PCB图



附录B软件程序清单
附录C 实物图

源码:

  1. //ds1302 shuju shuru wei 0
  2. //数据输出 最后一位为0
  3. //上升沿和下降沿的制造
  4. //写数据,数据输入是从低位开始 0位
  5. //读数据从高位开始

  6. #include<reg52.h>
  7. #include<stdio.h>
  8. #include"delay.h"
  9. #include"lcd.h"
  10. #include"dsds1302.h"
  11. #include"key.h"
  12. #include"ds18b20.h"

  13. sbit fm=P1^3;
  14. sbit jd=P1^2;
  15. sbit de=P1^1;

  16. unsigned char tt[]="2012-01-01";
  17. unsigned char  t[]="00:00:00";
  18. unsigned char fw[]="70 c    -> 00:30";
  19. unsigned char sj=70;
  20. unsigned char dfen,dmiao=30;


  21. unsigned char aj=0;                //按键返回值
  22. unsigned char gb=0;   //显示光标


  23. void main()
  24. {
  25.               bit bz=0;
  26.               float ttt;
  27.               char we[6];
  28.               unsigned int i;
  29.               int te;
  30.               delayms(1);
  31.               chushishizhong();                //初始时钟
  32.               chushishijian();                    //初始时间

  33.               //writetime();
  34. kaishi:
  35.     writecom(0x01);
  36.               while(1)
  37.               {
  38.                             readtime();              //读取时间
  39.                             t[0]=shijian[4]/10+0x30;              //时间数据处理
  40.                             t[1]=shijian[4]%10+0x30;
  41.                             t[3]=shijian[5]/10+0x30;
  42.                             t[4]=shijian[5]%10+0x30;
  43.                             t[6]=shijian[6]/10+0x30;
  44.                             t[7]=shijian[6]%10+0x30;
  45.                             tt[2]=shijian[1]/10+0x30;
  46.                             tt[3]=shijian[1]%10+0x30;
  47.                             tt[5]=shijian[2]/10+0x30;
  48.                             tt[6]=shijian[2]%10+0x30;
  49.                             tt[8]=shijian[3]/10+0x30;
  50.                             tt[9]=shijian[3]%10+0x30;
  51.                             writestr(0,0,tt);                              //显示时间 处理
  52.                             writestr(0,10," >data");
  53.                             writestr(1,0,t);
  54.                             writestr(1,10," >time");



  55.                             aj=keyscan();                            //检测按键函数
  56. /**********************按键2 按下表示进入加热控制模式*******************************/
  57.                               if(aj==2)
  58.                               {
  59.                                fm=0;   // 0  表示闭合继电器 闭合
  60.                                de=0;
  61.                                delayms(100);
  62.                                fm=1;
  63.                                jd=0;   //打开自动烧水

  64.                                writecom(0x01);                 //清除屏幕
  65.                                while(1)
  66.                                  {
  67.                                              if(i==500)
  68.                                              {
  69.                                                 i=0;                                                        //温度读取函数  以及 温度的处理
  70.                                                           te=duwendu();
  71.                                                           ttt=(float)te*0.0625;
  72.                                                           sprintf(we,"%6.2f",ttt);
  73.                                                           writestr(0,0,"Temp:");  //显示 温度值
  74.                                                           writestr(0,5,we);
  75.                                                           writestr(1,0,fw);
  76.                                              }
  77.                                                           i++;

  78.                                              aj=keyscan();                              //检测按键

  79.                   if(aj==2)
  80.                                               {
  81.                                                            de=1; //熄灭led灯
  82.                                                            jd=1;//断开继电器
  83.                                                            fm=0;
  84.                                                            delayms(100);                //蜂鸣器响一声
  85.                                                            fm=1;
  86.                                                            writecom(0x01);

  87.                                                                       break;                 //用于 退出当前的模式
  88.                                                         }

  89.                             if(aj==3)                                            //调节设定的温度值
  90.                                     {
  91.                                              fm=0;
  92.                                              delayms(100);
  93.                                              fm=1;
  94.                                                                          jd=1;
  95.                                                                          de=1;
  96.                                                                          delayms(20);
  97.                                              writecom(0x0f);
  98.                                              writecom(0xc0+12);              //光标显示位子
  99.                                              while(1)
  100.                                                {
  101.                                                                         aj=keyscan();
  102.                                                                         if(aj==3)
  103.                                                                           {
  104.                                                                          writecom(0x0c);
  105.                                                                          delayms(20);
  106.                                                                          writecom(0x01);                                                                                                                                                
  107.                                                                          fm=0;
  108.                                                                          delayms(100);
  109.                                                                          fm=1;

  110.                                                                          jd=0;
  111.                                                                          de=0;
  112.                                                                          delayms(20);                                                                        
  113.                                                                                       while(1)      //开始进行倒计时 烧水
  114.                                                                                       {
  115.                                                                                                   if(dfen==0 && dmiao==0)
  116.                                                                                                   {
  117.                                                                                                      for(i=10;i;i--)
  118.                                                                                                       {
  119.                                                                                                                 fm=~fm;
  120.                                                                                                                 de=~de;
  121.                                                                                                                 delayms(100);
  122.                                                                                                                 }
  123.                                                                                                                 jd=1;
  124.                                                                                                                 de=1;
  125.                                                                                                                 writecom(0x80);
  126.                                                                                                                 delayms(20);
  127.                                                                                                                 writecom(0x01);delayms(20);
  128.                                                                                                                 writestr(0,0,"ALL ok");
  129.                                                                                                                 writestr(1,0,"press KEY3 back ");
  130.                                                                                                                 delayms(200);
  131.                                                                                                       while(1)
  132.                                                                                                                 {                              
  133.                                                                                                                               aj=keyscan();
  134.                                                                                                                               if(aj==3)
  135.                                                                                                                                  {
  136.                                                                                                                                  fm=0;
  137.                                                                                                                                  delayms(100);
  138.                                                                                                                                  fm=1;
  139.                                                                                                                                  goto  kaishi;              //返回函数开始
  140.                                                                                                                 }                 }
  141.                                                                                                   }
  142.                                                                                                   delayms(200);delayms(200);delayms(200);delayms(200);  //1s
  143.                                                                                                 
  144.                                                                                                   if(dmiao==0)
  145.                                                                                                     {
  146.                                                                                                     if(dfen!=0)
  147.                                                                                                       {
  148.                                                                                                                 dfen--;
  149.                                                                                                                 dmiao=60;
  150.                                                                                                                 }
  151.                                                                                                     }
  152.                                                                                                     dmiao--;
  153.                                                                                                     fw[11]=dfen/10+0x30;
  154.                                                                                                     fw[12]=dfen%10+0x30;
  155.                                                                                                     fw[14]=dmiao/10+0x30;
  156.                                                                                                     fw[15]=dmiao%10+0x30;
  157.                                                                                                     writestr(0,0," ** boiling **  ");
  158.                                                                                                     writestr(1,0,fw);
  159.                                                                                                     writestr(1,0,"     ");
  160.                                                                                       }//开始进行倒计时 烧水

  161.                                                                                     }

  162.                                                                          if(aj==4)              //时间调节
  163.                                                                           {
  164.                                                                                     if(gb==0)
  165.                                                                                     if(dfen<60)
  166.                                                                                        dfen++;
  167.                                                                                     else
  168.                                                                                        {
  169.                                                                                                   fm=0;
  170.                                                                                                   delayms(100);
  171.                                                                                                   fm=1;
  172.                                                                                        }
  173.                                                                         fw[11]=dfen/10+0x30;              //显示时间处理
  174.                                                                         fw[12]=dfen%10+0x30;
  175.                                                                         writestr(1,0,fw);
  176.                                                                         writecom(0xc0+12);
  177.                                                                                     }

  178.                                                                          if(aj==5)
  179.                                                                           {
  180.                                                                                     if(dfen>0)
  181.                                                                                        dfen--;
  182.                                                                                     else
  183.                                                                                        {
  184.                                                                                                   fm=0;
  185.                                                                                                   delayms(100);
  186.                                                                                                   fm=1;
  187.                                                                                        }
  188.                                                                         fw[11]=dfen/10+0x30;
  189.                                                                         fw[12]=dfen%10+0x30;
  190.                                                                         writestr(1,0,fw);

  191. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

完整文档下载(word格式 可编辑):
基于51单片机的电热水器控制系统设计.doc (6.57 MB, 下载次数: 270)



评分

参与人数 3黑币 +63 收起 理由
ZONE-9 + 8 共享资料的黑币奖励!
Eleven_1ing + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:23303 发表于 2017-6-16 08:42 | 只看该作者
谢谢楼主分享!
回复

使用道具 举报

板凳
ID:23303 发表于 2017-6-16 08:45 | 只看该作者
谢谢楼主分享!学习C程序
回复

使用道具 举报

地板
ID:212410 发表于 2017-6-19 00:58 | 只看该作者
本帖最后由 djnodt 于 2017-6-22 22:11 编辑

请问楼主,串口通讯模块是用什么元件的,起什么作用
回复

使用道具 举报

5#
ID:159139 发表于 2017-6-20 06:46 来自手机 | 只看该作者
下载研究一下,谢谢楼主分享。
回复

使用道具 举报

6#
ID:95509 发表于 2017-12-18 13:29 | 只看该作者
谢谢楼主分享!学习!
回复

使用道具 举报

7#
ID:263148 发表于 2017-12-18 15:31 | 只看该作者
谢谢楼主
回复

使用道具 举报

8#
ID:241772 发表于 2018-4-16 22:34 | 只看该作者
谢谢楼主分享!
回复

使用道具 举报

9#
ID:241772 发表于 2018-4-17 21:47 | 只看该作者
厉害!!学习了
回复

使用道具 举报

10#
ID:241772 发表于 2018-4-17 21:52 | 只看该作者
不过好像没办法下载哦~
回复

使用道具 举报

11#
ID:344887 发表于 2018-6-4 20:42 | 只看该作者
挺不错的,就是没有仿真
回复

使用道具 举报

12#
ID:376301 发表于 2018-7-21 19:32 | 只看该作者
楼主太强大了,刚好借鉴一下,谢谢楼主
回复

使用道具 举报

13#
ID:443101 发表于 2018-12-10 10:26 | 只看该作者
不错的
回复

使用道具 举报

14#
ID:483909 发表于 2019-4-19 21:07 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

15#
ID:375715 发表于 2019-4-26 23:43 来自手机 | 只看该作者
谢谢分享谢谢分享
回复

使用道具 举报

16#
ID:770243 发表于 2020-6-16 13:42 | 只看该作者
201730645473 发表于 2018-4-17 21:52
不过好像没办法下载哦~

能下载吗?我这下载了一半不动了
回复

使用道具 举报

17#
ID:788871 发表于 2020-6-26 22:41 | 只看该作者
可以下载嘛
回复

使用道具 举报

18#
ID:875228 发表于 2021-3-28 17:03 | 只看该作者
谢谢大佬分享,我这个好难,还要预约定时加热,自动记录主人使用习惯
回复

使用道具 举报

19#
ID:385637 发表于 2021-3-29 11:34 | 只看该作者
谢谢大佬分享,很齐全的资料
回复

使用道具 举报

20#
ID:537743 发表于 2021-3-29 13:35 | 只看该作者
楼主厉害,谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表