设计与仿真基于单片机的太阳能热水器控制系统

目录

摘要 3
Controling system design and simulation of the solar water heater based on single chip microcomputer 4
第一章 前言 5
1.1设计背景和意义 5
1.2国内外的发展趋势 5
第二章 系统设计总览 7
2.1控制中心 7
2.2外围设备 7
第三章 系统硬件设计 8
3.1 总硬件的设计原理与框图 8
3.2 温度传感器DS18B20模块 9
3.3水位传感器模块 10
3.4电磁阀原理及电路 12
3.4.1光电隔离器原理 12
3.4.2继电器的原理 13
3.5显示模块 13
3.6键盘模块 14
3.7报警器 15
3.8 CPU模块 16
第四章 软件设计 19
4.1 DS18B20的调试与驱动 21
4.1.1 DS18B20的驱动程序 21
4.1.2 DS18B20的工作协议 21
4.1.3 DS18B20的图时序 22
4.2 按键电路模块的程序设计 23
4.3 LED显示模块程序 26
第五章 系统的仿真 29
5.1 仿真软件的介绍 29
5.2 温度的仿真 31
5.3 水位的仿真 32
总结 34
参考文献 35
附录1 37
附录2 40

基于单片机的太阳能热水器控制系统设计与仿真
摘要
跟着社会科技迅速的发展,人们的生活水平的快速提升。在热水器这方面从以前的锅炉成为现在的太阳能热水器仅仅只是用了几十年的时间。
本设计主要采用单片机系统针对太阳能热水器的控制系统展开研究工作。其功能主要是设计和实现太阳能与热能混合为热源提供的热水器控制,可在节能具有做出贡献。
本文设计的系统采用AT89C52单片机为控制中心,在温度控制与检测模块是采用DS18B20。DS18B20具有价格低廉,它的精度有0.5度,十分满足对此控制系统的要求。在水位检测与控制方面是用自制的三条导线,是利用水的导电性良好来决定的。能对水位有三档的检测,最低位、有水位、水满位,实现对水箱的水位检测。
关键字:单片机、太阳能、热水器、DS18B20

Controling system design and simulation of the solar water heater based on single chip microcomputer
Abstract
With rapid development of science and technology society, the improvement of human life is fast. In this respect from the previous water heater, boiler and is now the solar water heater is only use for decades.
The control system is to control the solar energy and electrical energy water heater as heat source provided. There is a great contribution in terms of energy saving.
This system uses AT89C52 single chip microcomputer as the control center, and the temperature control and detection module is used DS18B20. DS18B20 with low price, its precision is 0.5 degrees, which meets the requirements of this control system. In the aspect of water level detection and control, three homemade wires with good electrical conductivity of water are used, with which, can water level three gears, its lowest level, water level, water, full implementation of water tank water level be detected.
Key words: single chip microcomputer, solar, water heater, DS18B20

第一章 前言

1.1设计背景和意义
跟着社会的发展,人类的生活水平的提升,热水器成为了大家的必须品,传统的锅炉热水器主要用煤来进行给水加热,对环境造成了很大的破坏,用继电器来进行控制,给使用带来不便和效率较低。所以传统的热水器已经不适合于当今社会人们的需求。现在市场上出现的大部分都是用电来给热水器加热,这让效率很大程度上提高了。可是由于电的产生对坏境的污染越来越严重,不管是水能发电还是直接用煤来发电都对环境进行了一定程度上的破坏,所以电热水器的使用间接的导致了环境的破坏。所以此设计采用电和太阳能的集合形式的热水器,最小程度减少在使用热水器的过程中对环境的污染。在太阳能充足的情况下直接采用太阳能来给热水器进行加热,在太阳能不是充足的情况下才采用电热的方式给热水器的水加热。用单片机为控制中心,结合温度传感器和水位传感器实现对水温和水量的检查和控制,让热水器的效率更高更智能化。随着科技的发展单片机的造价是越来越低,用单片机来对热水器的控制,让热水器的价格更低。因此此设计具有价格低廉、使用方便、对环境有一定的保护、智能化等优点。从而满足现代人们的对热水器的需求。
1.2国内外的发展趋势
从总的来说,热水器的使用受到居住的环境,面积的大小和能源的限制。主要从两个方面来讲,1、是从技术的层面上来说:对环境污染小,体积小,维护成本低,使用寿命长,操作简单,智能化和加热快等;2、是从外观设计上来讲:主要还是喜欢欧美的风格,潮流前卫,时尚高雅的外形设计;当然在它的主要研究中,最重要的还是温度、液面的测量检测与控制系统技术。
1)国外最新研究动向:欧美国家关于液面和温度控制的相关技术的研究起于20世纪70年代,相对于中国来说比较早。首先是选用模拟式的组合仪表,收集现场信息并进行指示、记载和控制。80年代末出现了分布式控制系统。当前正在对计算机数据采集控制系统的多因子综合控制系统进行研制和开发。目前当下,在液面和温度测量和控制技术的成长得非常的快,在每一个国家中,然而,很多的国家在不断努力地实现从自动控制到没有人和完全自动的目标。
2)国内最新研究动向:在中国,在1980年,才开始在液面、温度测量和控制技术的研究和开发, 我国对于温度和液面测控技术的研究较晚,在我们国家的在这方面的科技研究科学家们,在不断的学习其他的先进国家的相关科学技术的基础上,才能把在室内的温度和湿度的微机对它们的控制技巧,这项技术,它是只有在温度和湿度上面的单项环境因子的控制应用;国内在温度、湿度和水位的测量和控制措施计算机的应用,从总的来说,应用温度、湿度和水位的测量和控制设备在中国一般都是从吸收和简单应用阶段的实践与综合应用阶段的过度和发展。
从技术上来说,都是用单片机的控制的单参数单回路系统比较多一点,并没有实际上的多参数的综合控制系统,在这方面,和其他的在这方面走在前面的国家来说,是有着一定的距离的;在我们国家还离对液面和温度的检测控制工厂化有非常远的距离,在工厂生产的过程中,还是有许许多的难题还等着我们去解决,但是一些是我们现在还不能解决的问题,比如:产业水平较低、环境控制的水准还达不到、相关配套的装备比较差,在很多的资源上还是不能够进行去分享和共用,可靠性的差等很多缺点。
今年来,国内和国际水平和温度传感器的测量系统向集成化、智能化的发展,随着研究人员的不断努力,类型系统取得了很大的成就,随着社会不断地发展,我们的生活水平的提升,在提升我们的生活水平的高度中,扮演着重要的角色;现在市面上出现的热水器的类型愈来愈多,电加热式、太阳能加热式、煤气加热式的热水器、、观其,它们只是加热的形式不一样,不管是怎么样的,它们的主要参数:温度和水位的都有对它们进行测量和控制,从而让热水器变得智能化。

第二章 系统设计总览

2.1控制中心
要实现本设计,首先是要对设计要达到的目的进行概括。本设计要实现:要用单片机来进行总的控制,来协调各个模块之间的动作,以期望能对温度和水位传感器的检测与控制,本控制中心采用的是单片机AT89C52,是用来对外围设备的检测与控制,让外围设备能工作起来,从而来达到本设计的要求,AT89C52将会在下一章详细的介绍。
2.2外围设备
在本设计中,外围设备起着十分的巨大作用,如果说控制中心是人的大脑,那么外围设备就是人的四支,它在本设计中是起到,收集数据、执行结果,外围设备包括显示模块、按键模块、温度模块、水位模块、温度补偿模块、水位补偿模块。这些模块都将在下一章进行详细的介绍。本设计温度模块采用DS18B20位温度传感器来进行对水温的检测与控制,用自制的导线来成为水位检测器件。用4个按键来作为键盘模块,1按键作为菜单选择、2和3按键作为加减设定、4按键为确定按键,LED为显示器,循环来显示温度和水位状况。用两个光电隔离器来实现对上水、温度加热的控制。

第三章 系统硬件设计

3.1 总硬件的设计原理与框图
对设计的预期目标要求分析可以得到如下框图3—1

                     图3.1 系统设计总框图
在框图中系统的工作原理为:以单片机AT89C52为整体的处理器,温度传感器选择为DS18B20,由于DS18B20输出是数字量,所以就直接传给AT89C52进行处理,AT89C52得到DS18B20的温度数据就送到LED显示器进行当前温度的显示。水位的检测是自制的三根导线对当前水位的检测,通过电平转换,把高电平转为低电平,输入到单片机的P1口,然后再由单片机送到显示器进行对当前水位的显示。当然,检测出了温度和水位,当太阳能不能及时满足对水温的加热时,就进行用电加热方式对水加热,为了减少加热负载对单片机的影响,采用一个光电隔离器,让后通过电池阀来控制是加热还是不加热。当水位检测到当前的水位不能满足当前的需求时,通一个抽水泵来就行进对其上水,让水能满足当前的要求,当然,为了减小负载对电路的影响同样用一个光电隔离器来实现,再通过一个电池阀来选择到底是上水还是不上。在满足这些的同时,需要一个报警器来对错处和危险的提醒,报警器是采用一个发光二极管和一个蜂鸣器来实现听觉和视觉的提醒。然后用四个按键来实现对系统的设置,1按键为菜单选择,2和3按键为上下选择和加减,4按键为确认按键[1]。

3.2 温度传感器DS18B20模块
DS18B20温度传感器是有达拉斯生产的数字温度传感器,他有9个数字的温度,0.5最小的分辨率,能够最大程度地对满足对温度检测的需求。它有三个引脚,一个引脚为接地用的,一个引脚是用来接电源的,当然它也是可以通过数据引脚进行对它来电源供应,所以的电源引脚可以不用,最后一个引脚用与单片机进行通信;DS18B20的各有其独特的序列号,所以在一条线上可以挂很多的DS18B20,实现对不同位置的温度检测,它的序列号包括唯一的一个64位的号,在它的内部有一个ROM和两个RAM,它的序列号就是存放在它的ROM中的前8位都一样的产品类型编码都是10H,接下来的48是唯一的号码DS18B20,最后8是CRC码的前面。接下来的48位是DS18B20的唯一的号,最后的8位是前面的CRC码。它测得的温度是放在它的两个RAM中的,一号RAM是存放符号的,也就是说如果它的值是负的及一号RAM存的都是1,相反都是0。0号RAM是用来存储补充温度值,最低位的1表示为0.5度,的二进制数转十进制的RAM被分为两种,并计算出测量的温度值,而DS18B20的测量范围为-55到125度,完全能满足本设计的需求。如果要他的测量速度快得话就得外接一根电源线,它的速度能达到1s左右,是非常的快的。

                          图3.2封装和引脚图

DS18B20的测量原理是:在它的内部采用了一种很是独特的温度采集技术,用一个时钟来进行对它的温度值计数的,能实现加减,当温度太低时,振荡器发出的脉冲无法通过大门,以满足在温度变化时的温度值,可以修改内部计数是由于温度的影响,所以计数器设置成为-55度,当计算器复位在现在的温度时,对振荡器的温度系数进行补偿,从而让计数器能开始计数计数到0为止,如果这样门电路还没有关闭时,就重复上面讲得过程直到门电路关闭。
DS18B20的内部主要有非易失性温度报警触触发器TH和TL、64位的激光ROM和温度传感器,前面说过DS18B20是可以不需要再接电源都可以的,它是用当通讯线上是高电平的时候,就把电存在电容中,当从高电平变位低电平后,电容就开始放电,用来提供电源。它的内部电路图为如下:

图3.3 内部图
由于它的数据和地址都一条线,所以它有着严格的时序来对相应的操作,以便于能让它能好的工作,不会出乱。它的工作流程是:初始化时它发出一个复位脉冲、发一个ROM功能命令、处理数据、发一个存储器命令进行数据处理。它使用时一般都是与单片机来进行数据的采集,把它连到单片机的一个输出与输入线相连即可,而且可以连多个,能对要进行温度采集的物体进行多点采集能得到更多的数据,能进行更好的分析,而且它的有效距离为50米,能满足本设计的需求[2]。
3.3水位传感器模块
在现在的水位传感器中,有很多种类,比如谐振式压力传感器、电感式压力传感器、及电容式加速度传感器、电阻应变片式压力传感器、电容式压力传感器、半导体应变片式压力传感器、半导体应变片式压力传感器、压阻式压力传感器、等,但是本设计使用了价格更加低廉的自制的水位传感器,是采用三根导线放在三个不同的位置,利用水有良好的导电性,从而实现对水位信息的采集。
在底部放一个+5v的电源导线,在底部的另一边放一根导线,然后再水位的百分之19处放一根导线,最后在水位的百分之92处放一根导线,然后把三导线接上电平转换模块,把高电平转为低电平,如下图所示,

                      图3.4 水箱水位传感器


图3.5 电平转换电路
电平转换电路中电容是为了减小干扰信号,当w1口有信号进来时,经过电阻分压,再通过三极管Q4输入到P2口,下面是水位与数据信号对应表:
表3.1水位与数据信号对应表
07H 92
06H 19
04 0

3.4电磁阀原理及电路
自动控制的实现,就是要让开关能够自己的闭合与打开,本设计是用的是一般常规用到的电磁开关就是所谓的继电器,当继电器的线圈上有电流流过是就会产生电磁场,有电磁力去作用弹片,让外部的电路能够导通,从而实现自动开关的控制,但是有一个问题是,先要在继电器的线圈上有稳定的电流进过,那么在前面就得有相关的控制,能让电流稳定下来,光电隔离器是个很好得选择,它是用光来实现对电流的控制,能够隔离一些不稳定的因素,但是让光电隔离器有稳定的电流来让其发光稳定,那么就再光电隔离器的前面就得加一个驱动,让它能提供稳定的电流信号。
控制电路的工作原理:单片机根据要求处理得到的结果,从一个控制端口发出低电平的控制信号,通过积极推动稳定电路可以得到,让光电隔离器能够发出稳定的光,后面的光感应器就可以感知到光稳定,电路经过电阻分压器,三极管链接,继电器,弹片是吸引,该开关可以打开,开始工作。

图3.6 电磁阀工作电路图
3.4.1光电隔离器原理
光电隔离器通常称为光电耦合器或电光耦合器,它是作为传输介质的光来实现光与电的转换,是由于光电转换,因此它具有良好的隔振效果。能最大程度地减少负载电路对电路的影响。光电耦合器在不同的电路中都有着十分广泛的应用,在目前,它已经是种类最繁多,用得最多的光电器件之一。它一般都有着3部分:光的感应器(光的接收)、电信号的放大、发光二极管(光的发射),当光电耦合器有信号进入时,二极管被输入的电流驱动发光,二极管就发出特定的波长的光,从而能让光感应器能接收到二极管发的光,光感应器感应到后就会产生光电流,然后光电信号经过放大,最后才是输出,从而完整的完成了从光信号转换为电信号的过程,实现了把输入与输出隔离开来的功能[3]。光电耦合器有着下面几个优点:
(1)信号传输的单向性。由于是把光转换为电流的,所以它是不可逆的,不能反向的进行信号的传输。
(2)输出电流与输入信号有很好线性。由于是再发光二极管上是接了一个电压然后是经过一个电阻耦合得到的电流来让二极管来发光的,光感应器收到的光是随偏置的电流而变化的,所以输出与输入信号是有很好的线性变化的。
(3)有很强的共模抑制能力,是因为光电耦合器的输入端是电流型工作的低电阻元件。
(4)的输出信号对输入信号的干扰完全消除,并具有较强的抗干扰能力,而且使用寿命长
3.4.2继电器的原理
继电器是一种使用电流控制的元件,它的主要组成分为两部分:控制系统和被控制系统,就是输入回路和输出回路,由于是用电流去控制的,因此它被广泛应用于自动控制电路。在开始还没有继电器的时候是用手动去代替控制的,在工业控制和其他的地方都带来不便,所以继电器的出现让自动开关控制带来很大的便利。继电器其实就是一个被电流控制的开关,它能自动的开和关,所以它能通过小电流去控制大电流,所以它在电路中起着电路转换、安全保护、自动开关、的作用;继电器它的部件由铁芯,线圈,弹簧片和衔铁组成,继电器的工作原理:当电流通过线圈的时候,在线圈中就会产生电磁场,从而在弹簧片上产生一个磁矩力让弹簧片与衔铁并合在一起产生通或者断。继电器分为3种,一种是常开的,也就是说弹簧片一直都是和衔铁断开的;一种是常闭的,就是弹簧片一直都是和衔铁是闭合的,电路是通的;最后一种是出于闭合与开的循环状态。最后种由分为两种情况,就是先闭合后断开和先断开后闭合的两种形式[4]。
3.5显示模块
显示模块是用的是用的4个LED数码管显示的,数码管有两种一种是共阳的和共阴的。所谓的共阳就是把数码管的所有的段的(就是a、b、c、d、e、f、g、dp段)都接在一起接在电源上;而共阴的就是把所有的段的一段也是都接在一起,然后再一起接地。

                        图3.7 7段数码管图

静态显示和动态显示是LED显示工作的两种不同的方式,静态显示就是把每一个数码管的脚都接在cpu上,或者是用138译码器来进行驱动,如果用138译码器来进行驱动则就是每一个数码管都是要一个138译码器来进行驱动,而这样做的缺点就是占用的资源较大,用的cpu的脚就比较多,但是有个好处是编程相对来说要简单一点,而且数码管会比较亮。动态显示就是把多个数码管的脚直接或者间接的接在cpu的I/O脚上,而这样做的优点比较与静态显示来时是很明显的,那就是占用的资源比较少,所用到的cpu的口就比较少,但是相对的来说,在数码管的亮度上和对其进行编程上来说就没有静态显示的那么好,亮度没有那么亮,编程难度要大一点。
3.6键盘模块
键盘模块用的是只有四个按键来进行组合的,第一个按键是用来进行菜单选择的,选择的是水位菜单还是温度菜单,第二个和第三个是用来进行加减的,就是当在设置水的温度的时候用来进行对当前温度的设定的,第四个按键是用进行确认的,当第一个按键选好菜单和第二个和第三个把温度设置好后,但是这时候只是我们看见我们设定的,但是cpu还是没确定我们是不是要选定的,用第四个按键来确定,就是让cpu能确定我们所设定的值和选定的菜单。
当然实际的按键的时候,会出现一些误操作的时候,比如,当你的其中一个按键被无意的碰到的时候,会让cpu出现误识别,识别出是按过该按键的,所以为了消除这种误操作,就采用了一种消除抖动的方法,而消除的方法有两方面,一种是以硬件来进行消除抖动,另一种就是用软件来消除抖动。
硬件消除抖动的原理:图3.6-1是用硬件来消除抖动的按键电路图,当是S1没有被按下时,电路由于没有被接通,所以电容C1两端的电压为零(因为电容有一端是接地的)与非门输出为1;当S1被按下时,被接上了电源,电容C1的两端电压将会慢慢的发生变化,而在这时候只要选对 了R1、R2和C1的值就会让电容充电的时间合适,从而起到了一定的延时作用,就会给按键按下争取到一定的时间,从而来识别是人为的把按键按下还是误操作造成的。实现了硬件消除抖动的功能,下面是硬件消除按键抖动的按键电路图:

                   图3.8 按键的电路图

另一种就是软件进行消除抖动,用软件来进行延时,当cpu识别到第一次有按键按下时,程序就开始延时10ms到70ms,然后再去检查按键还是不是高电平,当是高电平时,就说明了有按键按下,如果不是,那就说明没有按键按下,是误操作,从而来实现消除抖动影响。
3.7报警器
报警器是采用从听觉和视觉来提醒的,听觉是采用一个蜂鸣器,来进行发出声音的,从而当人的视线没有在太阳能热水器上的时候,会用声音来提示你,你的热水器出现了故障了,就不用什么时候都要人去守着太阳能热水器了。视觉是采用一个二极管来发光来刺激的,就是当你人在它的旁边的时候,会用光的形式来提醒你,出现了问题,而只是蜂鸣器响的时候,有时候会误判成是其他的东西发出的声音,而不管热水器的事,所以,发光二极管的设计能更加进一步的确认了是热水器出现了问题。图3.7-1是报警器的电路图。

                         图3.9 报警器的电路图

当p0.5口有信号过来时,三极管Q1导通,蜂鸣器响,而C21电容的作用是让蜂鸣器响的时间加长,而不是就只是响一下就不响了,从而就让这个报警器的设计失去了意义。 当p0.6有个低电平过来时,LED灯导通,就会发光,电阻R4的作用是限流,就是对发光二极管的保护,不让电流过大而损坏了发光二极管,从而实现报警功能。
3.8 CPU模块
本设计采用的CPU是PIC18F4620,它是一种低功耗的八位的微型处理器,它跟其他的单片机一样,有一个512k的内部存储器RAM,一个4k的片内程序存储器,有4个八位的输出输入口(p0口到p3口)中断控制系统有5个,一个外接的脉冲信号,一般都是接一个11.095MHz的晶振,还有一个全双工的uart的串行输出输入口,它们相互的连在一起就构成了一个完整的微处理器。当然还有些其他的口。单片机的复位方式有两种,一种是手动的复位,一种是自动的复位,图3.8-1是手动复位电路,3.8-2是自动复位电路:

图 3.10手动复位电路                             图3.11自动复位电路

下面是外接为11.095M的晶振电路:

图3,12 外接的晶振电路
AT89C52里面置有8KB能在线编程的闪存,那是因为高密度非易失性的存储技术被Atmel公司所应用在这方面上,所以它是可以在线编程的,它的指令是与8051的相兼容的,它的应运是十分的广泛的,可以用在很复杂的控制上,并且它的成本和其他同类型的来比是比较低的。下面是它的PDIP封装图:

图3.13 CPU的封装图和引脚
它有32个p0到p3的输出输入口,用来进行与其他元件进行数据和地址通讯的,一个接电源和一个接地口,用来给单片机进行供电源的,一个复位口,只要同时有两个高电平输入到复位口单片机就进行复位,两个晶振输入口,使用与外接时钟脉冲的,是一个访问外部程序存储器的控制信号;而他是低电平有效,也就是说,当它接的是低电平时,它才是让处理器的与外部程序存储器接的口读外部程序存储器的程序,当它接的是高电平时,它选择的是内部自己带的程序存储器,因为AT89C52内部是带有4K的程序存储器的。它是外部存储器选通信号,就是用来进行选择到底是不是要和外部存储器进行通信不,如果外部程序存储器在运行外部的程序是,就会在每一个机械周期都被激活2次,然而,时间当访问外部数据存储器未被激活,P3口本来它们也是一个双向输入输出的地址与数据口,但是它不止有这个功能,他还是有着第二功能的,它的第二功能不光是有串行输入与输出,他还是有着能接2个外部中断和两个定时器的输入,最后他还有着两个分别为对外部数据存储器写脉冲和外部数据存储器读脉冲。它的第二功为:P3.0是RXD(串行输入口)引脚口为10;P3.1是TXD(串行输出口)引脚口为11;P3.2是INT0(外部中断0)引脚12;P3.3是INT1(外部中断1)引脚口为13;P3.4是T0(定时器0外部输入)引脚14;P3.5是T1(定时器1外部输入)引脚15;P3.6是WR(外部数据存储器写脉冲)引脚16;P3.7是RD(外部数据存储器读脉冲)引脚17[5]。

第四章 软件设计

如果说硬件设计像人的身体,而软件设计就像是人的思想一样,人的身体是由人的思维支配的,而硬件到底要完成什么样的功能,完全是由软件去支配的。软件便就是硬件的驱动程序,每一个硬件都有它的时序图,只有完全配合它的时序图才能把一个硬件驱动起来,才能让它产生作用。而写程序得有它相应的流程图,下面4-1图就是系统总的控制流程图。它的流程就是,先是开始,就是打开电源,打开开关,让系统进入初始化阶段,而初始化就是检查各个部分是不是都是好,如果都是好的就是打开中断,然后开始显示当前的温度状况和水位情况,首先,要去根据水位传感器传出来的信息就行计算和转换,来判断水位是不是到了最低的底线,如果是到了最低的底线,那么就由处理器,发出控制上水信号,然后经过光电耦合器再到电池阀控制器,来控制小型的抽水泵给太阳能热水器的水箱加水,然后又开始检查水位到没有,如果到了,就再由主机发出一个停止上水的信号,同样的经过光电耦合器到继电器来断开小型的抽水泵让其停止给太阳能热水器的水箱加热;然后开始检查,温度是不是到达了设定的温度,如果是没有到达的,从处理器就发出一个加热的信号,进过光电耦合器,然后经过电池阀来控制加热器给热水器的水加热,然后再去检查到达设定的温度没有,如果没有到就重复上述的过程,如果到了,就由主机发出一个停止加热的信号,经过光电耦合器再由电池阀来控制加热器的断开,让其停止给太阳能热水器加热,然后再返回去显示温度和水位,重复上述所有过程。这样就是实现了当太阳能不能及时给热水器加热的时候,用电来给水加热,实现了双加热系统的控制,更能满足用户对当今太阳能热水器的需求。

图4.1 系统总控制流程图

4.1 DS18B20的调试与驱动
4.1.1 DS18B20的驱动程序
DS18B20是一个有九位的二进制的温度读数的数字温度计,测量了元件的温度,测得的温度信息通过一条通讯线(DQ)传给处理器,或者从处理器进过DQ传指令给DS18B20,让其完成相关的工作,而它只有三个引脚,一个DQ,一个VCC,一个GND。VCC是提供电源的,GND是接地的,但是它是可以不接外部电源的,直接通过DQ来进行供电。它可以测量温度55度+125度。其测量精度为0.5度。
它有2个存储器RAM,是0号和1号,1号存储器放的符号,如果全为0就是正,反之,全为1就是负。0号放的是温度值的补码,最低位表明的是0.5度,它是用9位存的[1],存储表如下:

表4.1 DS18B20温度存储
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
LSB
Bit15 Bit14 Bit13 Bit12 Bit11 Bit10 Bit9 Bit8
MSB S S S S S S S S

4.1.2 DS18B20的工作协议

  1. 初始化
    单片机总线上的所有处理均从初始化开始。
  2. ROM操作指令
    当主机检测到DS18B20的存在的时候,就可以发出ROM操作命令之一,这些命令如
    指令 代码
    Read ROM(读ROM) [33H]
    Match ROM(匹配ROM) [55H]
    Skip ROM(跳过ROM] [CCH]
    Search ROM(搜索ROM) [F0H]
    Alarm search(告警搜索) [ECH]
  3. 存储器操作命令
    指令 代码
    Write Scratchpad(写暂存存储器) [4EH]
    Read Scratchpad(读暂存存储器) [BEH]
    Copy Scratchpad(复制暂存存储器) [48H]
    Convert Temperature(温度变换) [44H]
    Recall EPROM(重新调出) [B8H]
    Read Power supply(读电源) [B4H]
    4.1.3 DS18B20的图时序
    处理器用时间间歇来读写它的数据和命令,
    (1)初始化
    处理器在T0的时候发出了一个复位的信号脉冲,然后再T1的时候释放总线开始进行接收状态,当它检测总线上的上升沿的时候,它有一个低电平脉冲信号的持续60us到240us后15us到60us,如图所示:

图4.2初始化时序图

(2)写时间隙
当处理器总线从T0的高电平变成低电平是产生了些时间隙,在15us的时间间隔中从T0开始就开始计时,在其时间时间间隔中就将所有需要的位传送到总线上,它在T后的15us到60us中对总线的采样写入的时低电平,见图4.2-2,如果写入的是高电平位写的位是1见图4.2-3

    图4.3  写0时序图                  图4.4  写1时序图

(3)处理器的总线从高电平变到低电平的时候,保持了17us,然后总线由低电平变成高电平,就产生读时间隙,如读时序图所示,当在T1后和T3前的这段时间里都是有效的,而T2与T0的时间长度为15us,在T2前处理器就必须把位给读完,而且要在一定的时间间隔里释放总线,这个时间间隔为60us到120us

图4.5 读时序图

4.2 按键电路模块的程序设计
在这控制系统中,按键就是人机交流的通道,也是一种手段。按键分为触摸式的和有弹簧的,而本设计就是用的是有弹片的,选他主要还是从成本上考虑的,触摸式的价格相对于它来说是比较高的。按键完成动作的整个过程为, 从按键没有按下,然后按键按下最后到释放按键。而这个过程是重复的。当一个按键按下时,cpu是不能识别出到底是误按还是真的有按下,因此有时就产生误按也是被识别了,为了解决这种情况的发生,所以就用延迟来消除来消除这种情况,从而让cpu识别按键的效率变高。而解决种情况的有两种方法,一种是硬件另一种是软件,而硬件的设计就增加了电路的复杂度,从而增加了成本,而用软件就可以避免这些问题,但是同样也能达到预想到的效果,但是,在给编程带来了一些困难,不过相对来说这种方法是比较好的,所以本设计是采用软件来消除抖动。在实际和理想的按键波形图如下:

图4.6 理想图 图4.7 实际图
在两个图中就能看出,在实际图中,它有一些抖动,这是因为按键都机械的,在按键的中间它有个弹簧,这个弹簧的作用是,当你按下去后还能自动的弹回来,但是同时它有带来了一个问题,那就是当按键被按下时,不能立即进行良好的接触,而是在不停来回的抖动的,所以就会产生抖动的波形。关键字:先检查一下是不是按下一个按钮,如果不返回检测,如果要延迟抖动的消除,和延迟时间为10ms,然后确定键是不是还压,如果没有说明就是误按,如果有说明是真的有按键按下;那就开始进行按键处理,然后就是等着按键的释放,先判断按键是不是真的断开了,如果没有,那就在进入等待,如果有那就按键被断开了,但是怕是抖动,还不是真的断开了,所以还是要延迟10ms,然后再进行判断按键是不是真的被释放了,如是那就是按键真的被释放了,就完成了一次按键的工作。

图4.8 按键工作程序图
下面是按键的处理程序:
void delay(uchar z) //延时程序
{
uchar x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
void main()
{
if(up_key0) //有按键按下吗
{
delay(10); //延时10ms
if(up_key
0) //确认键按下它
temp=temp+10; //执行操作
while(!up_key); //按键放开了吗
delay(10); //延时10ms
while(!up_key); //确认按键放开
}
else if(down_key0)
{
delay(10);
if(down_key
0)
temp–;
while(!down_key);
delay(10);
while(!down_key);
}

4.3 LED显示模块程序
LED有分为两种,一种是共阳,一种是共阴,共阳就是把所有段的一端都接到电源端,共阴就是把所有段的一端都接在一起然后接地。数码管显示就是要把数据信号通过LED来进行表达出来,而显示出东西来就得与cpu的端口有一个对应的编码,如下表所示,就是10个数字(0到9)对应的相应的编码[7]。

表4.2 段LED的字型码
显示字符 共阳极字型码 显示字符 共阳极字型码
0 3FH 5 6DH
1 06H 6 7DH
2 5BH 7 07H
3 4FH 8 7FH
4 66H 9 6FH
P0口是来控制数码管的亮哪些段的,而P2口是用来选择数码管的,来选择哪一个数码管来进行工作。开始就要进行端口的定义:
(1)定义字位和字型口
#define sled_dm_port P0 /定义LED段码的控制脚/
#define sled_wm_port P2 /定义LED位码的控制脚/
(2)定义字型编码表(数字0~9)
uchar code du_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
(3)显示:当字体的地址和字地址得到的显示功能,实现了对不同LED数据
(4)动态扫描:动态扫描就是不停的扫描字位,从而选择不同的数码管,当选择一个数码管时就把数据输入到这个数码管进行显示,然后就扫下一个数码管,把下一个所要显示的数据进行显示,然后就是重复这个动作,实现动态扫描显示。

图4.9 3.3-2 LED显示流程图
(5)数码管显示主程序
/1MS为单位的延时程序/
void delay_1ms(uchar z)
{
uchar x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
main()
{
uint temp_buff;
uchar i;
sled_dm_port=0;
while(1)
{
temp_buff=ReadTemperature(); /**/读取当前温度
sled_data[5] = du_char[temp_buff/100];
sled_data[6] = du_char[temp_buff%100/10];
sled_data[7] = du_char[temp_buff%10];
for(i=0;i<8;i++)
{
sled_wm_port = 0x00; /关闭显示/
sled_dm_port = sled_data[i]; /输出段码数据到数码管/
if(i==6) sled_dm_port = sled_dm_port&0x7f; /显示小数点/
sled_wm_port = we_table[i]; /输出位码数据到数码管/
delay_1ms(1);
}
}
}

第五章 系统的仿真

每一个系统的设计都是要经过仿真后才开始后做实物的,而系统的仿真是设计中不可缺少的一部分,只有硬件与软件的集合才能最大限度地模拟出在实际中出现的情况,本设计的仿真软件是用的是proteus.
5.1 仿真软件的介绍
Proteus是一种EAD仿真的软件,是由英国的Labcenter electronics公司进行推出的软件,但是,它不光有着仿真的功能,它有着能布原理图、调试代码、单片机与外围器件的同步仿真、一键式的进行PCB排版,它在中国的推广的时间比较迟,所以在中国用的还不是很流行,但是已经受到了电子相关工作者的强烈喜爱,proteus相对于其他的仿真软件,比如protel和其他的软件而言,在操作的风格上是有些微妙的不同的,如打开proteus,点击保存就可以把它默认的电路原理图进行保存,但在其他仿真软件,无论是建立一个项目或文件,才能开始进行画原理图和其他的后面设计。又比如它在放置元件的时候,它都是先把要得元件找出来,用一个列表进行列出来的,然后,再进行连线的时候,只要选中列表中的元件,然后单击左键就能拖出元件来,这个操作就和其他的不一样了。
如果要用proteus那就得对它先进行安装,它的安装,那就得先有它的安装包,由于现在网路的发展,在网上都是能找到它的安装包的,但是版本较多,但是它们的安装过程都是差不多的。把安装包下载到自己的电脑上后,先进行对其解压,一般都是选解压到当前文件夹,这样做的好处就是,解压好后能好找到安装的程序,然后点击安装程序,进行安装,选择路径,路径的选择要注意,这个安装路径就是把它安装在哪里,建议不要安装在系统盘,如果选择在系统盘的话,可能到时候会引起系统的崩溃,然后点击下一步,直到完成,但是在运行的时候是运行的isis,这是仿真软件。
Proteus的功能,变形的特点,它可以绘制图表,SPICE电路仿真,PCB自动或手动布线。它的特点有:电路仿真的互动,就是用户能够随时地采用其它的部件,比如电机、键盘、AD/DA、LCD、PIC、LED、ROM、RAM、以及部分器件、IIC部件;仿真处理器和外围设备,能够仿真AVR、ARM、51系列、等经常使用的主流单片机。它也可以直接根据原理图,编程的虚拟模型然后匹配的显示和输出,运行后可以看到输出的影响。虚拟逻辑分析仪和示波器所搭载的系统配置。它有很完整的电子设计环境。它的功能模块:实用的PCB设计平台、完善的电路仿真功能、智能原理图设计和单片机协调仿真功能。
智能原理图设计:(1)器件库是十分丰富的,它的元器件远远地大于27000件,而且是非常方面来创建新的元件,来满足个人的需要;器件搜索是非常的智能化的,它能进行模糊的搜索,当你对一个元器件的全称记得不是很清楚的时候,这个功能就能帮助到你,是十分的方便的;它的器件引脚之间的连线也是十分的智能化,这个功能他能自动的为你选择在那个地方有转折,线会自动选择最佳的路线连接,这样是很方便快捷的,能十分的有效地减少布线的时间;有总结结构,用总线结构或总线器件,能让你设计的电路图之间的连线就比较少,不会让你的设计图纸上全部都是连线,这样就能大大的简化了电路图的复杂程度,让人能更加的阅读;通过个性化的设置,就能够输出高质量的图纸,让其变成BMP图纸,能够让word、ppt等文档使用;(2)完美的电路仿真功能,模拟和数字电路的混合仿真能够实现,是因为ProSPICE混合仿真。27000模拟装置可以用来添加一些模拟装置,如从SPIC文件内部原型或制造商设计的模拟装置。多样的激励源,它包含了分段线性脉冲、音频、直流脉冲、等再有文件方式的信号输入。单频,数字时钟和码流。虚拟仪器的丰富化,它一共包含了13种虚拟仪器,面板的真实度跟实物是一样的,如数字图案发生器,交流电压/电流表如示波器,逻辑分析仪,直流电压/电流表,频率表/计数器,逻辑探头,虚拟终端SPI调试12C调试器。显示器的模拟非常逼真,利用颜色来显示数字引脚水平线,用不同的颜色来表示导线接地电压的大小,并与动力装置的使用,让模拟更加生动直观。电路的一些指标可以通过高级图形仿真功能来实现,,电路的指标包括传动,噪声,失真的特点,傅里叶谱分析的操作点,瞬态特性、频率特性,也是可以是一致的分析。(3)单片机协同仿真功能,它能够支持cpu的主流,而且版本的升级cpu的类型还在不断的在增加,通用外设模型的支持,(4)非常有用的pcb设计环境,原理图到PCB的快速通道,当你的原理图设计号以后,直接只要用一个键就能过进行pcb的设计,从而实现了从概念设计到完成PCB,自动布局和路由功能是非常方便和先进的3D可视化预览。它可以为多种文件格式输出,可以让很多文档识别,包括Gerber文件的导入或导出,可以让等PCB设计工具相互转换的设计更加方便快捷[6]。
5.2 温度的仿真
在温度的仿真中,只要先把原理图连好,然后进行代码调试,在温度传感器的设置中,因为,本设计用的是DS18B20,它有两个按钮,它能对它的温度值进行设置,左边的是减,右边的是加,只要调这两个按钮,就能对温度值进行设置,如此来进行温度传感器模块的仿真,这样就能最大程度地来模拟现实中情况,让仿真能最大的接近现实。水的加热方式又两种方式,一种是传统的只用电来加热方式,这种加热主要是在太阳能来加热不能满足的情况下选择的,另一种就是只用太阳能来加热,这种加热的方式会受到天气和气候的巨大影响,比如在阴天或者完全在下雨天,它能得到大的太阳能可能就不是那么的充足,不能来满足用户的需求,又比如如果热水器在晚上要用的话,那是就只能完全靠电加热的方式对它进行加热了,还有就是受到地域的影响,比如中国南方和中国北方,在中国的南方可能它能吸收到的太阳能就要充足一些,而在中国的北方,它能吸收到的太阳能可能就没有那么的充足,这时候就得选用电加热的方式。
当温度的设定值高于设定的值的时候,单片机就会发出一个信号,让信号通过继电器来控制加热棒停止加热;当温度低于设定的温度时,单片机就会发出一个控制信号通过继电器来控制加热棒进行加热,从实现了水温自动加热的目的。下面是温度高于设定温度和水温低于设定温度的仿真截图,

图5.1 温度高于设定时的仿真

图5.2温度低于设定温度时仿真
5.3 水位的仿真
水位的仿真,是显示当前太阳能热水器中水箱的水量,让人能知道,当前的水箱里的水还有多少,这个就会让用户进行判断,水箱里的水是不是干了,能最大程度上避免因为水量的少,而把热水器给烧坏了。
当水到第二根导线的时候,就说明了水量的不足,就会显示19,;当水位在第三根线的时候就说明水量是充足的,就会显示92,来实现对水位的显示,能让人知道当前的水是少了还是多了,下面的两幅图分别就是水量不足和水量充足的仿真图,

图5.3 当水量不足时的仿真

图5.4 当水量充足时的仿真

总结

从我们开始选题的时候开始,到了现在都过去了6个月了,在这段时间经历了开始的迷茫,然后才开始有思路,回想起这6个月的点点滴滴,须然觉得很辛苦,但是也学到了很多的东西,把以前的一些不懂的问题给想懂了,同时也对以前学习的知识进行了巩固和再学习。这套基于单片机的太阳能控系统设计与仿真,它主要是实现,能显示太阳能热水器的温度和水位,同时,也能对它的温度进行设置,而其,这个控制系统还有声音来提示的,那是里面包含了一个报警器,它主要是由一个蜂鸣器和一个二极管来组成的,当然为了增加蜂鸣器响的时间和二极管发光的时间,在这模块还采用了一个RC积分电路;在处理器,本设计选择了AT89C52来控制和协调整个控制系统,能让各个部件能完成其相关的工作,由于这个单片机是需要外接晶振的,所以就接了一个晶振,来对整个系统来进行提供时序,能让整个控制系统能动起来;而一个系统要运行,那它就必须要有个复位功能,这样才能随时进行复位,比如当系统要进行初始化时,如果没有复位功能,那么就只能把掉电源,而直接把电源对控制系统和整个设备不好,会造成不稳定性;而人机要进行双向进行交流,就得有系统对人输出信息,而本设计就是用的显示模块,显示模块用的是7段的LED显示,为了对LED的保护,在LED的各段(a、b、c、d、e、f、g和dg)都接一个电阻,让其分压,不让LED那么的容易损坏,而LED是接在AT89C52的P0口端的;按键那便是人对系统的输入通道,按键用的是4个按键,用按键来实现对温度的设定;控制系统,那么就得有对有对象进行控制,而本设计的控制对象就是电加热棒和小型的抽水泵,而对这两个的控制都是由主机发出有效电平通过光电耦合器来隔离它们电路对主机电路的影响,经过耦合器后,然后经过一个继电器,而继电器就是一个自动的控制开关,是实现对抽水泵和电加热棒的开和断的控制,从而实现了对温度和水位的控制。
在这个设计的过程中遇到过很多的问题,比如对软件的不会使用,对单片机的指令系统不熟悉,还有整个过程的构思都有着很大的艰难。不过都通过努力来克服了。

参考文献

[1]齐剑玲,曾玉红. 智能水位控制系统[J]. 海淀走读大学学报2003年第一期.2003:87-91.
[2]黄贤武,郑筱霞.传感器原理与应用[M].电子科技大学出版社,2004(3).
[3]孙德文.微型计算机技术[M].高等教育出版社,2010(7).
[4]刘乐善,李畅,刘学清.微型计算机接口技术及应用[M].华中科技大学出版社,2012(8).
[5]蔡美琴,张为民,何金儿,毛敏,陶正苏,毛义梅.MCS—51系列单片机系统及其应[M].高
等教育出版社,2004(6).
[5]刘瑞星,胡健等.Protel DXP 实用教程[M].机械工业出版社,2003(04).
[7]潘晓贝…基于单片机的水温水位控制器的设计[D].河南:,三门峡职业技术学院,2010.
[8]Yang. Y., Yi. J., Woo, Y.Y., and Kim. B.: ‘Optimum Design for Linearityand efficiency of
Efficiency of Microwave Doherty Amplifier Using a New LoadmatchingTechnique’, Microw.
J., 2001,44,(12),pp.20–36.
[9]康华光.电子技术基础 模拟部分[M]. 高等教育出版社 1998(08).
[10]于海生.计算机控制技术[M].机械工业出版社 2007(05).
[11]谭浩强.C程序设计[M].清华大学出版社,2010(6).
[12]徐龙坤. 辅助加热式太阳能热水器[J] .家用电器. 1997: 9-10.
[13]张景文,王震宏.基于单片机的太阳能热水器智能控制系统[J]. 西华大学学报( 自然科学
版) 第27卷第5期.2008.25-28.
[14]杨新华,郝晓弘,邵辉.基于89C51智能型太阳热水器的控制系统[J].甘肃科学学报.2001
(9):88-91.
[15]殷为民.太阳能水温水位仪[J] .家用电子. 1999 : 372-381.
[16]陆子明.单片机设计与应用基础教程[M].北京:国防工业出版社.2005:206-
210.
[17]何立民.单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版
社.2001:34-42.
[18]王俊杰.基于89C51单片机的太阳能热水器智能控制器的设计[J].郑州轻工业学院学报
( 自然科学版) 第20卷第3期.2005:67-68.
[19]陈家胜,朱小松,单学明.太阳能热水器辅助电加热控制器的研制[J].电子技
术,2000.10.
[20]鱼献荣.实用水位控制电路[J].家用电子,1998.5.

致谢

对于在这段时间对我提供帮助的人在这里表示深深的感谢,感谢您们对我的无私的帮助,在此,我要特别的感谢我的指导老师,感谢您对我提供了最大的无私的帮助,您严谨的学习精神深深的让人敬服,您时刻就在教导我学习态度,但是在我的眼中那不只是学习,那也是一种人生的道理。在此,再次向您表示感谢。在这次的本科毕业论文中还有一位师兄对我提供了无私的帮助,在此向师兄深深的感谢。还有还要感谢我们寝室的室友们对我提供的无私的帮助,在这里我深深的向你们表示感谢。

附录1
DS18B20的控制程序
VOID DELAY(uint i) //延时函数
{
while(i–);
}
Init_DS18B20(void) //初始化的函数
{
uchar x=0;
DQ = 1; //DQ复位
delay(8); //微做延时
DQ = 0; //dq被
delay(80); //精确延时 延迟时间比480us大
DQ = 1; // 把总线拉高
delay(14);
x=DQ; //微做延时后 如果x=0则初始化成功 反之初始化失败
delay(20);
}
Read(void) //读一个字节
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i–)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
Write(uchar dat) //写一个字节
{
uchar i=0;
for (i=8; i>0; i–)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
ReadTemperature(void) //它的读取温度
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
Init_DS18B20();
Write(0xCC); // 读编号列数操作跳过
Write(0x44); // 开动温度变换
Init_DS18B20();
Write(0xCC); //读编号列数操作跳过
Write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个便是温度
a=Read();
b=Read();
t=b;
t<<=8;
t=t|a;
tt=t0.0625; //高低温
t= tt
10+0.5; //结果是4至入加
return(t);
}

附录2

总原理电路图:

作者:QQ1928499906

物联沃分享整理
物联沃-IOTWORD物联网 » 设计与仿真基于单片机的太阳能热水器控制系统

发表评论