找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 43079|回复: 19
收起左侧

基于单片机的太阳能热水器控制系统 带仿真 源码下载

  [复制链接]
ID:137190 发表于 2016-9-3 19:31 | 显示全部楼层 |阅读模式
仿真原理图如下:
51hei.gif

下面是文档的部分内容预览:
目录
摘要
ABSTRACT
第一章  概述
1.1  设计背景
1.2  设计任务
第二章  太阳能热水器及控制系统简介
2.1  热水器及系统工作原理
2.2  控制系统设计原则
2.3  主控方案
2.4  温度检测方案
2.5  水位检测方案
2.6  显示方案
2.7  时钟方案
第三章  控制系统硬件设计
3.1  总体设计
3.2  主控模块
3.2.1  单片机接口配置
3.2.2  复位电路
3.2.3  时钟电路
3.3  温度测量模块
3.3.1  DS18B20简介
3.3.2 温度测量电路接线图
3.4  水位检测模块
3.5  显示模块
3.5.1  LCD1602电气接线图
3.5.2  LCD1602技术参数及接口说明
3.6  实时时钟
3.6.1  DS1302简介
3.6.2  时钟电路电气原理图
3.7  驱动模块
3.6.1  上水电磁阀驱动电路
3.6.2  自动加热驱动电路
3.8  按键模块
3.8.1 按键模块简介
3.8.2 按键抖动处理
第四章  控制系统软件设计
4.1  实时时钟软件设计
4.1.1  DS1302时钟地址及数据格式
4.1.3  DS1302软件流程
4.1.4  时间读取子程序
4.1.5  时间设置子程序
4.1.6  日期BCD转字符程序
4.1.7  时间BCD转字符程序
4.2  水温检测软件设计
4.2.1  传感器操作指令
·4.2.2  DS18B20软件流程
4.2.3  获取温度子程序
4.3  显示模块软件设计
4.3.1  LCD1602指令及说明
4.3.2  LCD1602RAM地址映射
4.3.3  初始化过程
4.3.4  显示子程序
4.4  水位检测软件设计
4.5  按键模块软件设计
4.5.1  读取键值子程序
4.5.2  键值处理子程序
第五章  控制系统调试与仿真
5.1 总体仿真结果展示
5.2  自动加热仿真
5.3  水位检测及上水仿真
第六章  总结与展望
参考文献

摘要

随着社会的发展和科技的不断进步,人们的生活水平也在逐渐提高。与之而来的问题也很多,例如能源危机与环境污染,绿色环保理念因而开始深入人心。太阳能作为新兴的清洁能源得到了大家的普遍认可,首先太阳能取之不尽、用之不竭,其次干净无污染又是一大特点,因此积极推广太阳能的应用具有重大意义。本设计将研发一款高性能的太阳能热水器控制系统,产品具有智能化的特点。本篇文档的设计可以作为单独的控制系统销售也可以安装在普通的太阳能热水器上使之作为智能型热水器来出售。这一设计会更广泛地推动太阳能的使用,在将来还可以与物联网系统结合,吸引消费者的眼球,同时符合国家当前的发展理念。

本文档在介绍单片机、传感器、实时时钟的特点基础之上,详尽地说明了太阳能热水器控制系统的工作原理与方案设计。根据本设计的要求,采用STC89C52作为主控芯片。其他硬件部分包括:水温采集模块、水位监测模块、按键输入部分、LCD显示窗口及继电器控制模组,继电器控制模组有自动上水和程控加热部分构成。在软件方面,本设计采用模块化方式对系统进行分组设计,使得设计工作稳步展开,并且经过仿真验证,本系统的各个模块均正常工作,符合设计要求


ABSTRACT

With the development of society and the progress of science and technology, people's living standards are gradually improving. However, problems come with it, such as the energy crisis and environmental pollution, thus green development ideas gained ground. Solar energy as a new clean energy has been widely recognized, due to that it’s inexhaustible and clean, and followed by a major feature. So, promoting the use of solar energy actively is of great significance. This article will set out to design an intelligent, high-performance solar water heater control system which was designed with intelligent automation features. This design can be used as a separate control system sales also it can be installed on ordinary solar water heater to make it as a smart water heater to sell. The design will be more beneficial to promote the use of solar energy. Combined with the internet of things will attract the attention of consumers in the future and be in line with the country's current development concept.

This paper describes the basic features of the microcontroller, sensors, real-time clock, and a detailed illustration of the working principle and design of solar water heater control system. According to the design requirements, STC89C52 used here as a master chip. Other hardware includes: temperature acquisition module, water level monitoring module, key input section, LCD display window and relay control module, relay control module has automatic pumping water part and programming heating part. On the software side, using modular design makes the works steady progress. After simulation, each module of the system is working properly, which meeting to the design requirements.



第一章  概述

1.1  设计背景

能源对于人类的发展至关重要。每一次人类文明的进步,都可以看到旧能源的落幕与新能源的成长。近代工业起源于英国,当时蒸汽机的发明与改进使得煤炭资源取代了木材,成为主导能源。到20世纪初,石油得到大规模开采与使用,全世界对石油的需求激增,石油逐步取代煤炭成为主导能源。根据Statistical Review of World Energy 2015[3]估算,在2014年的能源消费结构中,石油仍然是主导燃料,约占全球能源消费的33.3%;煤炭和天然气资源分别占全球能源消费的30.1%和24.0%。作为化石燃料,三者合计达到全球能源消费的87.4%,传统燃料依然支撑起现代商业文明主导力量。

自从传统能源作为主导能源以来,两大安全问题便显现出来。一是传统化石燃料的供应问题,其越来越难以满足市场的需要。因为化石燃料是不可再生的能源,有限的储量却要应付世界经济和人口的飞速增长。二是传统能源的安全问题。一方面,由于开采技术的问题,煤矿事故频繁发生;再者,资源的肆意无须开采,对地下水、地表生态环境造成了难以恢复的破坏。另一方面,传统能源的使用还会产生废气废渣,特别是燃烧未经处理的煤炭会排放SO2、粉尘等污染物。

应对传统化石能源日益严峻的安全形势,世界各国开始调整战略政策,采取多元化供应策略,积极引导开发新能源,以降低对传统能源的依赖性。

就我国的发展来说,积极推广新能源,以节约和代替部分化石能源,这是保障我国能源安全、优化能源结构、促进社会与经济可持续发展、保护环境、应对气候生态变化、调整产业结构的战略部署。近年来,新能源的发展受到政府的大力支持。自2011年起,可再生能源发展的脉络日渐清晰,我国政府将在推广新能源和提高传统能源效率两方面加速能源结构调整。未来新兴能源开发利用的战略定位是:到2020年,核能、风能、太阳能等新兴能源要成为能源总需求中增量部分的主力军,加上水能共提供约6亿吨标准煤,占一次能源消费总量的15%;到2030年,新兴能源要成为主流能源之一,加上水能共提供20%以上的一次能源消费量[1]。

作为一个幅员辽阔的国家,中国有着丰富的太阳能资源。虽然我国在太阳能热水器累计安装量居世界第一位,但是由于中国庞大的人口数量,意味着中国人均占有的太阳能热水器还少于像塞浦路斯、以色列、希腊和奥地利等国家。

根据我国可再生能源发展规划,太阳能热水器累计安装应在2010年达3亿平方米和在2020年达到1亿7000万平方米,每千人拥有量达128平方米到203平方米。根据这一计划,在2020年中国太阳能热水器的持有率只相当于2000年奥地利的水平,仍远低于2000年的塞浦路斯和以色列的太阳能热水器安装量[2]。

目前,中国正处于快速发展阶段,城乡居民对生活热水的需求急剧增加[5]。而在农村地区和中小城市,太阳能热水器已经成为提高人民生活质量、全面建设小康社会的一个快捷的技术方法[2]。随着传统能源价格的持续上涨,社会上的环保意识日益提高。另外由于太阳能热水器产业的升级改进和太阳能热水器与建筑一体化技术的发展,使得太阳能热水器将保持增长势头。中国太阳热水器市场自上世纪90年代以来,保持了十多年的快速增长。我国太阳能热水器的年铺设量由2000年的610万平方米,快速增长到2009年的4200万平方米,年平均增长速度24%[6]。太阳能热水器运行保有量由2000年的2600万平方米,增长至2009年的14500万平方米,年平均增长速度为21%[6]。尤其是2006年《可再生能源法》实施以来,国家可再生能源开发政策进一步加强,更是由于新农村建设的开展和地方政府开始实施新建建筑强制安装政策,对太阳能热水器的应用和推广起到了极大的推动作用。2006年至2009年太阳能热水器销售量年均增长率为33%,总保有量年均增长率为17%,太阳能热水器应用又进入了一个新的高潮[2]。

面对巨大的市场,对太阳能热水器也提出了新的技术要求。目前太阳能热水器普遍都没有自动控制系统,这让太阳能的推广工作达到了技术瓶颈。因此设计一个智能化的太阳能热水器控制系统迫在眉睫。


1.2  设计任务

本课题旨在设计一个小成本、低功耗、多用途的太阳能热水器控制系统。热水系统采用单片机芯片作为微型控制器,该系统是设计目标有:

  • 通过传感器,将水位水温采样信号传送给单片机进行处理,并进行水位及温度的显示;
  • 当水位到达低限,系统自动上水,高限停止上水;
  • 可调预置水温设计,用户可以自主设置温度保持范围,以应对不同地区不同季节;
  • 可以设定时段监控温度,如果在时段内,温度过低系统将循环加热;
  • 允许自动/手动进行上水、加热设置。

在设计系统的过程中,同时学习了单片机的开发与程序编制以及电路的设计与仿真等操作。本科阶段的知识得到了进一步提高,另外有自学了Proteus和Keil等软件的使用。在下文,提供了不同满足设计要求的方案,最终选择最优设计。


第二章  太阳能热水器及控制系统简介

2.1  热水器及系统工作原理

目前市场上太阳能热水器的主要分类有:玻璃真空管热水器、平板型热水器、陶瓷中空平板型热水器以及热管式热水器等。而在国内,太阳能热水器市场份额的90%是全玻璃真空管太阳能[2],因此本设计采用真空管太阳能热水器作为控制对象。太阳能热水器基本构造如图所示,包括有:水箱、集热管、进出水接口、排气孔、安装架等组件。阳光照射在真空式的集热管上,集热管吸收热量,管内冷水被加热成热水。由于热水比重低于冷水,热水上浮冷水下沉进行冷热交替加热,最终热水被收集到储水箱内,以上是太阳能热水器的基本原理。

0.002.jpg 图2.1  太阳能原理图

在光照良好的情况下,上述过程比较顺利。如果遇到连续阴雨天气,则不能收集热水,因此需要加热电辅加热功能。当单片机采集到温度低于设定值,并且在预设时间段内,将开启加热,保持水温在程序设置的范围内。水位监测模块安装在水箱中,监测水位的变化并发出水位报警信息。当水位低于设定位置,单片机发出指令停止加热同时开始上水;水位被监测到达高水位时,停止上水。实时时钟为系统提供时间信息,既可以显示日期时间等信息,又能让用户自主设置水温保持时间段。在该时间段内开启辅助加热功能,其他时间只显示温度而不加热以节约能源。系统还提供有手动按钮,允许用户自主控制上水电磁阀、加热器等器件。在手动模式下系统依然监控水位水温信息,防止发生上水溢出、干烧等事故。


2.2 控制系统设计原则

本控制系统将单片机及外围电路与太阳能热水器结合起来。运用温度、水位监测技术,将水温、水位信息进行处理、控制。该系统设计遵循的原则如下:

1)可靠性。本太阳能热水器控制系统是基于单片机的系统,在设计单片机的硬件与软件方案时,要考虑到各种因素了来保证系统的高可靠性。例如在测量温度时,如何保持温度数据地准确传输;如何保证单片机工作不被电磁干扰等等。因此系统需要综合考虑,保证采集、传输以及处理过程中的可靠性,才能使得系统能够应对各种复杂的环境与使用习惯。

2)准确性。本系统使用的测量电路较为先进,能够精确地反映被测量的变化。

3)经济性。本设计针对的是广大民用客户,所以在选用电路器件时要考察其性价比如何,尽可能控制成本以提高竞争力。

4)人性化。由于本系统要面向广大客户,所以在进行软硬件设计时,要充分考虑诸多因素。

2.3  主控方案

选择单片机芯片有以下两种方案:

方案一: 选用STC89C52芯片作为主控制器。

STC89C52RC单片机是STC宏晶电子公司生产的兼容MCS-51的高性能/低功耗单片机。该型号单片机性价比高、抗干扰能力强,工作电压:5.5V~3.3V(5V 单片机)/3.8V~2.0V(3V 单片机)。工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作频率可达48MHz。用户应用程序空间为8K 字节,片上集成512 字节RAM。

方案二:采用AT89S52。

AT89S52是Atmel 公司制造,也和MCS-51系列单片机兼容,片内具有8K字节程序存储空间,256字节的数据存储空间,具有在线编程可擦除技术。

两种单片机都完全能够满足设计需要,STC89C52相对ATS89C52价格便宜,且抗干扰能力强。考虑到成本因素,因此选用STC89C52。


2.4 温度检测方案

温度是整个太阳能热水器工作状态的核心指标,系统根据采集到的储水箱温度判断接下来的动作,温度测量的准确性直接关系到控制系统能否正常工作。

设计温度测量方案时,有以下备选方案:热敏电阻+模数转换器,数字式温度测量器件。其中第一个方案从设计角度考虑较为复杂,测量过程如图3.4所示[4]。而后一方案有众多的温度传感器芯片可供选择,常见的有LM355Z、DS18B20等等,使用方便。 0.003.jpg

图3.4 温度测量流程图

其中DS18B20是一款高性能的数字式温度测量芯片,可以将温度量直接转化为数字量,因此单片机可以方便的通过总线读取数据。综上,本设计采用DS18B20传感器。

2.5  水位检测方案

              在考虑水位检测模块时,有以下几种传感器可以实现:超声波传感器、液压传感器、电容液位传感器、以及电子液位检测器。具体如表所示:

表 水位检测传感器

分类

超声波

液压式

电容式

电子式

器件

超声波探测器

压力传感器

电容液位器

电极式液位器

描述

价格贵

使用不便,价格贵

抗干扰性差

使用方便精度不高


电极式水位检测电路结构简单,其精度也足够控制系统的使用。利用导电液体开关电路的原理,适用于单片机等逻辑控制器。当水漫过电极,电路接通,电平发生改变,主控芯片依靠电平的状态判断液位。采用电极式液位检测电路控制了成本,降低了系统复杂度,也方便自主选择安装位置。这里注意电极在水箱中容易生锈或被电化学腐蚀,影响检测的准确性。为了防止这种现象发生,本设计拟采用石墨涂层包裹电极,这样既不影响检测,也不会发生腐蚀等不良结果。

压敏式传感器精度高,与此同时带来成本的问题;电容式传感器具有精度高的特点但是热水箱内极易产生水垢,会影响测量精度;电极式电路成本低、应用方便、适用性强,是本次设计控制系统所采用的。

2.6 显示方案

显示输出模块要求能够显示水温、水位,日期、时间以及以上信息的设置选项。有如下三种方案可供选择:一、LED指示灯显示水位,占用4个I/O口,数码管显示水温以及时间等信息,占用12个I/O口;二、LCD1602显示以上全部信息,但是不能同时显示,占用11个I/O口;三、采用LCD12864液晶,可以同时输出全部设计要求的信息,但是成本较高。

本设计显示的信息量较多但是实时更新速度要求较低,并因此选取LCD1602液晶屏作为显示输出器件。

2.7  时钟方案

本控制系统需要时间信息进行控制驱动电路,目前市场上有多种时钟芯片可供选择,而且单片机本身也有定时功能,因此考虑以下两种方案:

一是直接使用单片机的定时计数器提供信号:用程序计算年、月、日、星期、时、分、秒等计数信息。此种方案虽然减少芯片的使用,成本低,但是,实现的时间误差较大。二是采用DS1302时钟芯片:DS1302是一款高性能的时钟芯片,其特点有:计时准确、接口简单、使用方便以及功耗较低。所以采用DS1302芯片提供时钟信息具有较多的优点。


第三章  控制系统硬件设计

3.1  总体设计

太阳能热水器控制系统主要功能的实现有STC89C52RC单片机控制水温、水位等信息的采集与输出、控制继电器开通与关断,进而使用户在消耗少量能源的情况下获取更多的热水。如图3.1所示,控制系统主要包括温度检测模块、水位检测模块、实时时钟模块、按键输入模块、LCD显示模块以及继电器驱动电路,驱动电路包括有辅助加热模块和自动上水模块。

0.004.jpg 0.005.jpg 0.006.jpg

水温水位检测模块负责温度与水位的检测工作,温度检测传感器采用达拉斯半导体公司生产的DS18B20,通过与单片机的I/O口相连;水位检测电路采用电极式的测量方法;实时时钟为整个系统提供实时时间,用户可以设置自动加热的时间段,其他时间可以手动加入以节约能源;键盘输入模块实现对系统控制信息的输入;LCD显示模块采用LCD1602器件输出控制系统的信息;驱动电路有继电器负责通断电磁阀上水,用双向晶闸管接通加热器件电路可以避免继电器启动时产生电弧带来的危险。电气原理图如图3.2所示。

0.007.jpg
图3. 2控制系统电气原理图


3.2  主控模块

3.2.1 单片机接口配置

水温检测模块:P1.7;水位检测电路:P3.4~P3.7;键盘输入模块:P1.0~P1.6;实时时钟模块: P2.5~P2.7;自动上水模块:P2.3辅助加热模块:P2.4;水温水位显示模块:数据口P0、使能等等P2.0~P2.2(LCD1602)。

0.008.jpg

图3.3 单片机接口配置图

3.2.2  复位电路

单片机在运行时难免会遇到各种问题,快速的解决方案是进行系统复位,使CPU和其他器件处于初始状态。

0.009.jpg

图3.4 复位电路

3.2.3  时钟电路

时钟电路是单片机CPU的心脏,它控制着CPU的工作节拍,可以通过提高时钟频率来提高CPU的计算速度[5]。

0.010.jpg

图3.5 89C52时钟震荡电路

3.3  温度测量模块

3.3.1  DS18B20简介

本设计采用DALLAS (Maxim)公司出产的DS18B20芯片,该产品特点有:独特的1-Wire接口仅仅占用一个通信端口;内置温度传感器和EEPROM减少外部元件的数量;测量温度范围:-55°C至+125°C (-67°F至+257°F),-10°C至+85°C范围内测量精度为±0.5°C;9位至12位可编程分辨率;无需另接外部元件;寄生供电模式下只需要2个操作引脚(DQ和GND);多点通信以简化分布式温度测量工作;每个器件具有唯一64位序列号,存储在器件的ROM内;用户可以灵活地定义温度报警门限,通过报警搜索指令来找到温度超出门限的器件;提供8引脚SO,8引脚μSOP,3引脚TO-92多种封装形式,如图3-7展示了DS18B20.各种封装及引脚图。

0.011.jpg
图3.7 DS18B20封装形式
1



本设计中采用的是TO-92形式的封装,其尺寸形状便于安装在热水器中。通过屏蔽双绞线与单片机相连,可以实现长距离测量工作。各种封装的引脚定义见下表。

表3.1DS18B20管脚说明

SO*
SOP*
TO-92
符号
描述
备注:
NC引脚为悬空标识
标号
5
4
1
GND
接地引脚
4
1
2
DQ
数据输入输出引脚 单总线开漏引脚 当使用寄生电路供电模式时也可以为器件提供电力
3
8
3
VDD
可选电力引脚

3.3.2 温度测量电路接线图

DS18B20采用的独特的一线式结构,其仅需一根线就能够实现通信。温度传感器一共有三条线:电源线、电源底线及数据线,其电源即可通过电源供电如图3-5所示,但使用外部电源可以提高测量速度。以上所述特点表明DS18B20非常适合用于长距离多点温度检测系统。

0.012.jpg

图3.6 DS18B20外部供电电路图

温度测量模块的组成器件有:DS18B20和4.7k上拉电阻。注意在长距离传输时使用屏蔽类双绞线,应该适当减少上拉电阻阻值,以补偿线阻。

0.013.jpg

图 3.8  DS18B20接线图

DS18B20检测的温度经单片机处理、判断,可以进行LCD输出显示和控制加热器件工作。对于加热温度,我国目前没有相关行业标准。出于安全考虑,最高加热温度控制在55°C,最低加热温度为40°C。

3.4  水位检测模块

水位监测模块采用的电极式测量电路原理如图所示。电极A对应10%水位下限,电极B对应40%水位,电极C对应70%水位,电极D对应95%水位上限。水箱底部放置公共地线,每当水位到达某一个电极位置,比如在70%水位,水将电极A、B、C与公共地线短接。根据原理图所示,电极A、B、C接地,电信号经74LS04反相,P3.7 ,P3.6,P3.5将采集到高电平,P3.4保持低电平。此时单片机仅需查询数据便可判断出水位的信息。

对于水位监测模块的设计要注意电极在水箱中容易生锈或被电化学腐蚀,影响检测的准确性。为了防止这种现象发生,本设计拟采用石墨涂层包裹电极,这样既不影响检测,也不会发生腐蚀等不良结果。

0.014.jpg

图3.9水位检测模块电气原理图


3.5  显示模块

3.5.1  LCD1602电气接线图

显示电路有排阻、电位器以及LCD1602构成,电位器调节显示对比度。STC89C52的P0口和排阻、LCD1602的数据I/O口相连,P2^0接RS引脚,P2^1接R/W引脚,P2^2接E引脚。

0.015.jpg

图3.10 LCD1602电气原理图

3.5.2  LCD1602技术参数及接口说明

LCD1602主要性能指标有:16X2个字符显示容量;4.5~5.5V的工作电压;2.0mA工作电流;字符尺寸为2.95X4.35mm。引脚说明见下表

[td]
表3.2  LCD引脚说明

编号

符号

引脚说明

编号

符号

引脚说明

1

VS S

电源地

9

D2

数据I/O

2

VDD

电源正

10

D3

数据I/O

3

VL

液晶偏压信号

11

D4

数据I/O

4

RS

数据/命令选择(H/L)

12

D5

数据I/O

5

R/W

读/写选择(H/L)

13

D6

数据I/O

6

E

使能

14

D7

数据I/O

7

D0

数据I/O

15

BLA

背光灯正极

8

D1

数据I/O

16

BLK

背光灯负极


3.6  实时时钟

3.6.1  DS1302简介

DS1302 是DALLAS (Maxim)公司推出的涓流充电时钟芯片。片内包含有实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历提供秒、分、时、日、星期、月、年的信息,每月天数和闰年天数可实现自动调整,时钟操作可通过AM/PM 指示决定采用24或12小时格式。DS1302 与单片机之间采用同步串行的方式进行通讯,仅需用到三根线:RST复位、 I/O 数据线、 SCLK串行时钟。时钟/RAM 的读/写数据可以一个字节或多达31个字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW。

3.6.2  时钟电路电气原理图

实时时钟模块由电池、晶振、电容以及DS1302时钟芯片组成。RST引脚与单片机的P2.5相连,SCLK与P2.6相连,I/O与P2.7相连。

0.016.jpg

图3.11 实时时钟电路图

3.7  驱动模块

驱动模块包括上水电磁阀驱动电路和加热元件驱动电路。

3.6.1 上水电磁阀驱动电路

上水电磁阀驱动电路主要元件有:两个1k电阻、一个二极管1N4007、一个三极管2N3905,一个5V的LED以及继电器。

该驱动电路控制信号低电平有效,这时三极管导通,继电器工作,电磁阀开启实现低水位自动上水。当水位检测模块监测水位到达高水位时,P2.3置1,三极管关断,继电器停止工作,电磁阀闭合。 0.017.jpg

图3.11 自动上水驱动电路

3.6.2  自动加热驱动电路

自动加热驱动电路由双向晶闸管Q4015N5、光电耦合器件MOC3022、以及一个47欧姆的电阻构成。

该电路设计构想是:电热元件功率比较高,普通继电器在开通、关断瞬间会产生电弧。由于电弧会损坏器件,因而普通继电器难以胜任开关工作,即使可以,成本也比较高。这里采用固态继电器的原理,用双向晶闸管当作交流开关。双向晶闸管的门极控制电路的开通与关断:当单片机程序判断需要开启加热功能时,I/O口信号经光耦产生门极电流使晶闸管导通;当加热到指定温度,光耦关断门极电路,流过双向晶闸管的工作电流最多在一个周期内,就会低于晶闸管的最小导通电流,晶闸管关断。 0.018.jpg

图3.12 自动加热驱动电路


3.8  按键模块

3.8.1 按键模块简介

本热水器控制系统涉及到一些功能设置键和一个系统复位键,功能键分别是:“加”键、“减”键、“设置”键、“选项”键、“返回”键、“加热”键以及“上水”键。

0.019.jpg

图3.13  按键模块原理图

在显示模式中,按下设置键,进入设置模式;设置模式中按下返回键,退出到显示模式。在设置模式中,按下选项键选择设置选项。在特定选项中,由加、减键上下设置数值。加热键和上水键可以手动运行加热及上水功能,方便客户多样性地使用本控制系统。

3.8.2 按键抖动处理

按键模块是操作人员输入系统信息的入口,所以精确识别每个按键的动作是决定系统能否正常工作的关键。现在市场上的按键多采用机械弹性开关,电信号在机械触点的闭合和断开过程中,完成高低电平的转换。但是按键在闭合及断开瞬时间由于弹性作用,必然产生一连串的抖动。

0.020.jpg

图3.14  按键抖动示意图

为了稳定操作,我们要防止抖动的发生,为了消除抖动的影响,可以从硬件和软件两方面解决:1)硬件延时消抖:计算好电容放电时间,利用放电延时不失为一个方案。但本设计选用的单片机程序存储空间足够放下软件消抖的函数,且考虑到批量生产增加电容的成本,故采用下一方案。2)软件延时消抖:如果按键较多,常用软件延时的方法去抖动。流程如下:检测到按键闭合→延时5-10ms→再次检测按键状态,如果再次检测仍是闭合状态,则认为确实有按键按下。


第四章  控制系统软件设计

4.1  实时时钟软件设计

4.1.1  DS1302时钟地址及数据格式

对DS1302的时钟操作需要的数据地址及格式如下表所示[12]。

表4.1时钟地址及数据格式
1



0.021.jpg

下面介绍使用到的寄存器含义:

CH(时钟停止位):CH=0振荡器工作允许;CH=1振荡器停止。

寄存器2第5位(AM/PM定义):AP=0   上午模式;AP=1   下午模式。

WP(写保护位):WP=0数据能够写入;WP=1 数据不能写入。

寄存器2第7位 (12/24 小时标志):bit7=0:24 小时模式;bit7=1:12 小时模式。


4.1.3  DS1302软件流程

0.022.jpg

图4.1 DS1302软件控制流程图

4.1.4  时间读取子程序

void ds_get_time(systemtime *time)
{
              unsigned char readvalue;
              //second
              readvalue=dsread(dssecond);
              time->second=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //minute
              readvalue=dsread(dsminute);
              time->minute=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //hour
              readvalue=dsread(dshour);
              time->hour=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //day
              readvalue=dsread(dsday);
              time->day=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //week
              readvalue=dsread(dsweek);
              time->week=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //month
              readvalue=dsread(dsmonth);
              time->month=((readvalue&0x70)>>4)*10+(readvalue&0x0F);
              //year
              readvalue=dsread(dsyear);
              time->year=((readvalue&0x70)>>4)*10+(readvalue&0x0F);


}

4.1.5 时间设置子程序

voiddssettime(unsigned char addr,unsigned char byte)
{
              dsprotect(0);
              dswrite(addr,((byte/10)<<4|(byte%10)));
}

4.1.6  日期BCD转字符程序

voiddatezstr(systemtime *time,char *datestr)
{
              *datestr=time->year/10+'0';
              *(datestr+1)=time->year%10+'0';

              *(datestr+2)='-';

              *(datestr+3)=time->month/10+'0';
              *(datestr+4)=time->month%10+'0';

              *(datestr+5)='-';
              *(datestr+6)=time->day/10+'0';
              *(datestr+7)=time->day%10+'0';
              *(datestr+8)='';
}

4.1.7  时间BCD转字符程序

voidtimezstr(systemtime *time,char *timestr)
{
              *timestr=time->hour/10+'0';
              *(timestr+1)=time->hour%10+'0';

              *(timestr+2)='-';

              *(timestr+3)=time->minute/10+'0';
              *(timestr+4)=time->minute%10+'0';

              *(timestr+5)='-';
              *(timestr+6)=time->second/10+'0';
              *(timestr+7)=time->second%10+'0';
              *(timestr+8)='';
}


4.2  水温检测软件设计

4.2.1 传感器操作指令

本小节介绍DS18B20的数据操作指令,为程序设计提供原理性指导。首先要了解DS18B20的内部存储空间,内部存储器由一个高速暂存器和一个非易失性E2PROM构成,其原理如表3.2所示。

表4.2 DS18B20温度传感器内存空间


高速暂存器SCRATCHPAD




Byte 0
温度值低八位LSB
(85°C)




Byte 1
温度值高八位MSB


E2PROM

Byte 2
TH寄存器或用户数据1*
0.023.jpg
TH寄存器或用户数据1*
Byte 3
TL寄存器或用户数据2*
0.024.jpg
TL寄存器或用户数据2*
Byte 4
控制字寄存器*
控制字寄存器*
Byte 5
保留




Byte 6
保留




Byte 7
保留




Byte 8
CRC*





由于DS18B20的单总线设计,在数据传输是要满足一定格式要求的方能进行操作。根据芯片的通信协议,主机与DS18B20的通信要具有初始化、ROM操作指令、功能操作指令三个步骤。下表列出本设计需要使用的一些指令及其说明。


表4.3 ROM操作指令表和功能指令表

描述
指令字
备注
ROM操作指令
忽略ROM
忽略ROM命令允许主机不提供64位ROM编码以提高访问存储器的速度。
CCh
总线上只有一个DS18B20时方可使用,否则会发生冲突。
功能指令
温度转换
启动温度转换
44h
DS18B20发送温度转换状态给主机
读暂存器
读取整个暂存器包括CRC 字节
BEh
DS18B20发送最多9个字节的数据给主机,主机可以随时停止读取数据。
写暂存器
写数据到暂存器中的第二、第三、第四字节空间(TH,TL和控制字寄存器)
4Eh
主机发送三个字节的数据到DS18B20.
复制暂存器
复制暂存器中TH, TL和控制字寄存器的数据到E2PROM。
48h

调取E2PROM
复制E2PROM中的数据到暂存器的TH, TL和控制字寄存器。
B8h
DS18B20发送调取状态给主机

·4.2.2  DS18B20软件流程

0.025.jpg

图4.2  DS18B20软件流程

4.2.3  获取温度子程序

void dsgettemp(unsigned char *integer,unsigned char *decimal,unsigned char *symbol)
{
              unsigned char high,low,temp,tempth,temptl,tempconfig;
              sendChangeCmd();              //发送温度转换指令
              delay_ms(800);
              sendReadCmd();  //发送读取暂存器指令


              low=readByte();
              high=readByte();
              tempth=readByte();
temptl=readByte();
              tempconfig=readByte();
              sendChangeCmd(); //为下一次温度采集做准备

temp=high>>4;   //温度计算
              if(0==temp)
              {
                            (*symbol)=0;
                            (*integer)=(high<<4)|(low>>4);
                            (*decimal)=(low&0x0f)*0.625;

              }
              else
              {
                            (*symbol)=1;
                            (*integer)=~(high<<4)|(low>>4);
         (*decimal)=10-(low&0x0f)*0.625;
                            if(10==*decimal)
                            {
                                          (*integer) += 1;
                                          (*decimal) = 0;
                            }
              }
}


4.3  显示模块软件设计

4.3.1  LCD1602指令及说明

0.026.jpg

4.3.2 LCD1602RAM地址映射

LCD1602液晶控制器内部RAM有80x8的缓冲空间,注意数据地址还应与上0x80h。

0.027.jpg

4.3.3  初始化过程

延时15mS;
写指令38H(不检测忙信号);
延时5mS;
写指令38H(不检测忙信号);
延时5mS;
写指令38H(不检测忙信号);
以后每次写指令、读/写数据操作均需要检测忙信号;
写指令38H:显示模式设置;
写指令08H:显示关闭;
写指令01H:显示清屏;
写指令06H:显示光标移动设置;
写指令0CH:显示开及光标设置;

4.3.4  显示子程序

voidlcdoutput(unsigned char x,unsigned char y,unsigned char *str)
{
              if(y)//此由有坐标x,y值计算地址y=1则显示在第二行
                            x|=0x40;
              x|=0x80;//LCD1602存储地址第七位为1,所以地址要与上0x80

              lcdwrite(command,x);//写入地址

              while(*str!='')//写入数据
              {
                            lcdwrite(data,*str);
                            str++;

              }
}


4.4  水位检测软件设计

水位检测程序比较简单,有图3.9 水位检测模块电气原理图所示,仅需读取P3口,在屏蔽低四位就可判断水位信息。水位检测模块的原理是:读取水位检测接口,然后进行查表,再根据预设的关键水位信息操作继电器驱动电路。部分程序如下:
unsigned char depthprocess()
{

              unsigned char depth;
              unsigned char depthvalue;
              P3=0xff;
              depth=P3;
              depth&=0xf0;
              P3=0xff;
              switch(depth)
              {
                            case 0xf0:
                            {
                                          water=1;
                                          depthvalue=100;
                                          break;
                            }
                            case 0x70:
                            {

                                          depthvalue=70;
                                          break;
                            }
                            case 0x30:
                            {

                                          depthvalue=40;
                                          break;
                            }
                            case 0x00:
                            {
                                          water=0;
                                          depthvalue=10;
                                          break;
                            }
                            default:
                            break;
              }
              return depthvalue;
}

4.5  按键模块软件设计

4.5.1  读取键值子程序

unsigned char readkeys()
{
              unsigned char keystemp,keysvalue;
              do
              {
                            P1=0xff;
                            keystemp=P1;
                            delay_ms(8);
                            P1=0xff;
                            keysvalue=P1;

              }
              while(keystemp!=keysvalue);
              returnkeysvalue;
}

4.5.2  键值处理子程序

由于键值处理子程序较长,这里摘录一段修改日期的程序:

voidkeysprocess()
{

              unsigned char x;//零时变量
              chardatestring[9],timestring[9];
              charyearnum[1];
              charmonthnum[1];
              chardaynum[1];
              charhournum[1];
              charminnum[1];
              charthnum[1];
              chartlnum[1];
              systemtimedatetime;
              unsigned char keys;
              unsigned char pagcount=1;//计次移动
              charaddnum[7];            

              unsigned char set,add,sub,hea,wat,mov,sav;
              //设置,加键,减键,加热,上水,移动,保存
              keys=readkeys();
              set=keys&0x01;
              add=keys&0x02;
              sub=keys&0x04;
              hea=keys&0x08;
              wat=keys&0x10;
              mov=keys&0x20;
              sav=keys&0x40;

              if(set==0)
              {
                            dsgettime1(&datetime);
                  datezstr1(&datetime,datestring);//获取时间
                            timezstr1(&datetime,timestring);
                            if(mov==0)
                            {

                                          pagcount++;
                                          if(pagcount>8)//要设置的项目共有7个最后一次复使
                                          {
                                                        pagcount=1;
                                          }
                                          switch(pagcount)
                                          {
                                                        case 1:
                                                        {
                                                                      dssettime1(dssecond,0x80);//stop ds1302 CH置高
                                                                      lcdwrite1(command,0x80+6);//设置年闪烁
                                                                      lcdwrite1(command,0x0f);//闪烁

                                                                      if(add==0)
                                                                      {

                                                                                    yearnum[0]=datestring[0]+datestring[1];//年

                                                                                    yearnum[0]++;

                                                                                    if(yearnum[0]>99)
                                                                                    {yearnum[0]=0;}
                                                                                    lcdoutput1(5,0,yearnum);//显示修改结果
                                                                                    dssettime1(dsyear,numtobcd(yearnum[0],1));//写入年
                                                                      }
                                                                      if(sub==0)
                                                                      {
                                                                                    yearnum[0]=datestring[0]+datestring[1];//年

                                                                                    yearnum[0]--;

                                                                                    if(yearnum[0]<=0)
                                                                                    {
                                                                                                  if(yearnum[0]==0)
                                                                                                  {lcdoutput1(6,0,"0");}            
                                                                                                  else
                                                                                                  {yearnum[0]=99;}

                                                                          }
                                                                                    lcdoutput1(5,0,yearnum);//显示修改结果
                                                                                    dssettime1(dsyear,numtobcd(yearnum[0],1));//写入年

                                                                      }

                                                                      dssettime1(dssecond,0);//启动ds1302CH置低CH置低                                                      
                                                                      break;
                                                        }
                                                        case 2:
                                                        {
                                                        ……
                                                        }
                                          }


第五章  控制系统调试与仿真

0.028.jpg
5.1  总体仿真结果展示

图5.1  总体仿真效果图

5.2  自动加热仿真

由于在Proteus中双向晶闸管无法仿真,这里使用继电器驱动电路替代加热驱动电路,同样是低电平有效,程序不变。

0.029.jpg

图5.2  加热模块原理图

水温低于40°C开启加热:

0.030.jpg

图5.3开启加热仿真结果

水温高于55°C关闭加热:

0.031.jpg

图5.4  关闭加热仿真结果

0.032.jpg

图5.5  温度传感器状态

综上显示,模块正常工作


5.3  水位检测及上水仿真

水位检测模块原理如下。当水位出于电极3、4之间,电极1、2、3相当于开关闭合。此时P3口的状态为0xe0(用0xf0屏蔽低四位),LED4、5、6.灯亮。

0.033.jpg 0.034.jpg
图5.6  水位检测模块原理图及仿真

当水位低于10%,上水驱动电路动作,继电器打开电磁阀上水;水位到达高水位继电器关闭电磁阀,停止上水。

0.035.jpg
图5.7  低水位开始上水仿真结果
0.036.jpg
图5.8  高水位停止上水仿真结果


第六章  总结与展望

我国正处于“十三五”时期,在十三五规划中写到:深入推进能源革命,着力推动能源生产利用方式变革,优化能源供给结构,提高能源利用效率,建设清洁低碳、安全高效的现代能源体系,维护国家能源安全。为相应国家号召,应当积极开发和利用太阳能等清洁可再生能源。在生活中,太阳能热水器得到广泛而又普遍的运用。为方便用户的个性化、人性化使用太阳能热水器,积极推广太阳能的利用,开发一款控制系统的任务放在了我们的面前。本设计通过STC89C52作为核心主控制器,采用时钟芯片DS1302,温度传感器DS18B20组成控制系统              。制作了一款可以智能加热、自动上水等功能的热水器控制器,并且控制器有精度高、抗干扰性强等诸多优点。

通过大量阅览参考资料和历经半年的不断调试,控制系统终于达到了设计要求。本设计进行电路硬件设计、软件设计,通过了仿真调试。由于工作量较大,本系统的设计还有一些不足:

  • 温度测量反映速度较慢,有待进一步优化软件设计。
  • 按键的中断方式未完成调试,功能是通过查询方式实现的,效率较低。
  • 控制器与太阳能热水器结合的优化设计没有作进一步阐述。

部分源码如下:


  1. #include
  2. #include

  3. #include
  4. #include
  5. #include
  6. #include

  7. sbit heater = P2^3;

  8. unsigned char x;
  9. /************更新***************/
  10. void updatatime()
  11. {  systemtime datetime;
  12.    
  13.    
  14.    
  15.            lcdwrite(command,clear_screen);
  16.         dsgettime(&datetime);         //获取时间
  17.         lcdoutput(0,0,"DATE:");                    //日期
  18.         datezstr(&datetime,datestring);
  19.         lcdoutput(5,0,"20");
  20.         lcdoutput(7,0,datestring);
  21.         lcdoutput(0,1,"TIME:");
  22.         for(x=8;x>0;x--)                        //循环显示时间
  23.         {
  24.         converttemp();
  25.         dsgettime(&datetime);
  26.     timezstr(&datetime,timestring);
  27.     lcdoutput(5,1,timestring);
  28.         delay_ms(300);
  29.     }



  30. }
  31. void updatatemp()
  32. {

  33. lcdwrite(command,clear_screen);                 
  34. lcdoutput(0,0,"SWEN:");                        //水温
  35. lcdoutput(0,1,"SWEI:");                        //水位

  36. for(x=8;x>0;x--)                        //循环显示时间
  37.         {
  38.         converttemp();
  39.         lcdoutput(5,0,tempstr);
  40. depthprocess();
  41.         delay_ms(300);
  42.     }
  43. }


  44. /************主函数***************/
  45. void main()
  46. {        
  47.         unsigned char integer,symbol,decimal;
  48.         
  49.     ds1302init();
  50.         lcdini();
  51.         while(1)
  52.         {
  53.                  dsgettemp(&integer,&decimal,&symbol);        //获取温度
  54.                  if(integer<40)         //自动加热
  55.                          {
  56.                                  heater=0;
  57.                          }
  58.                          else if(integer>55)
  59.                          {
  60.                                  heater=1;
  61.                          }
  62.                   //关键显示部分
  63.                 updatatime();
  64.                 updatatemp();
  65.                         
  66.                         
  67.                                                                         
  68.         }         
  69.          
  70. }
复制代码
51hei.png
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬
显示部分已经调试好了,目前按键部分还没有加入,大家有时间可以自行补充完善:
仿真程序.7z (929.87 KB, 下载次数: 939)

评分

参与人数 2黑币 +10 收起 理由
光阴程序 + 5 回帖助人的奖励!
浪子knight + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:156776 发表于 2016-12-29 18:28 | 显示全部楼层
模块化的程序不会用啊 能不能给我一个综合的
回复

使用道具 举报

ID:315500 发表于 2018-4-24 16:52 | 显示全部楼层

键盘功能谁能补上去啊
回复

使用道具 举报

ID:325268 发表于 2018-5-8 18:31 | 显示全部楼层
大哥能给个源程序么
回复

使用道具 举报

ID:328659 发表于 2018-5-13 12:28 | 显示全部楼层
没有键值处理子程序啊  求分享
回复

使用道具 举报

ID:330599 发表于 2018-5-15 18:12 | 显示全部楼层
太厉害了啊
回复

使用道具 举报

ID:510728 发表于 2019-5-13 19:36 | 显示全部楼层
内容很详细 步骤很清晰 点赞
回复

使用道具 举报

ID:510728 发表于 2019-5-23 21:17 | 显示全部楼层
内容很详细 赞一个
回复

使用道具 举报

ID:630336 发表于 2019-11-1 13:18 来自手机 | 显示全部楼层
楼主,键程序谁弄好了啊,能发给大家学习一下吗?感谢
回复

使用道具 举报

ID:454639 发表于 2020-2-24 17:46 | 显示全部楼层
同求键盘处理程序
回复

使用道具 举报

ID:695166 发表于 2020-4-18 23:59 | 显示全部楼层
很好,有用,爱了
回复

使用道具 举报

ID:732695 发表于 2020-4-19 13:55 | 显示全部楼层
模块程序没有区分啊
回复

使用道具 举报

ID:620287 发表于 2020-5-8 12:50 来自手机 | 显示全部楼层
有整理好的原理图和hex程序吗?分享出来可以吗
回复

使用道具 举报

ID:921285 发表于 2021-5-30 20:02 | 显示全部楼层
22583596 发表于 2020-5-8 12:50
有整理好的原理图和hex程序吗?分享出来可以吗

你找到了吗
回复

使用道具 举报

ID:921285 发表于 2021-5-30 20:03 | 显示全部楼层

HEX文件有码
回复

使用道具 举报

ID:987436 发表于 2021-12-2 23:10 | 显示全部楼层
楼主可以发一下完整程序吗
回复

使用道具 举报

ID:987436 发表于 2021-12-4 17:12 来自手机 | 显示全部楼层
仿真不对,液晶屏不亮
回复

使用道具 举报

ID:137190 发表于 2021-12-4 18:39 | 显示全部楼层
啊S 发表于 2021-12-4 17:12
仿真不对,液晶屏不亮

重新下载,hex文件在objects目录里面,Keil工程已经重建了 原来那个工程缺文件,还有其他问题 大家一起研究改进
回复

使用道具 举报

ID:1024174 发表于 2022-5-26 05:42 | 显示全部楼层
51黑ff 发表于 2021-12-4 18:39
重新下载,hex文件在objects目录里面,Keil工程已经重建了 原来那个工程缺文件,还有其他问题 大家一起研究 ...

按键处理程序如何加上去?
回复

使用道具 举报

ID:1070414 发表于 2023-4-7 20:40 | 显示全部楼层
仿真图特别好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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