随着社会的进步,人类文明在不断提高的同时,却面临着一个非常严峻的问题:世界上的不可再生能源——煤炭、石油、天然气的存储量在以极快的速度减少,在不久的将来,这些宝贵的资源将逐渐从地球上消失。与此同时,使用这些能源给我们周围的环境带来了巨大的破坏。蓝藻爆发、臭氧空洞、二噁英事件等环境问题在不断的出现,生态平衡遭到了严重的破坏。所以,人类急需发现更多无污染的可再生资源,在这时,太阳能这个无穷无尽的绿色资源得到了人们的青睐。使用它不仅可以解决能源短缺的问题,而且不用担心它会消耗尽,只要太阳 升起,人们就可以得到储量丰富的太阳能;另外,太阳能的使用不会产生CO2等有害气体,绝对不会对环境产生任何的污染,有效地缓解了现存的环境问题。太阳能技术也因此得到了飞速的发展,太阳能汽车、太阳能电池、太阳能热水器等新型产品不断出现在市场上,其中,以太阳能热水器发展的最为广泛,也得到了大众的认可。根据不完全统计,太阳能热水器的销售量已远远超过了其他种类的热水器。随着太阳能技术的不断改革,此款热水器会有一个更广阔、更长远的发展。
太阳能热水器给人们提供着安全、绿色、节能的热水,而且造价比较低廉,在技术上也比较成熟,因此受到人们的喜爱。在整个太阳能热水器系统中,除了热水器本身之外,还有一个系统也起到了及其重要的作用,即控制器。它是用户与热水器之间的交流介质,通过控制器,可以将热水器的水位水温信息及时反馈给用户,而用户也可以通过控制器对热水器进行操作,比如,当热水器的水箱没水时,用户可以选择自动上水功能来加水,当雨雪天气时,没有足够的热量来满足水的温度,用户就可以启动辅助加热功能,通过加热棒来加热水,这样,无论何时用户都可以使用到热水。
1.2 现状分析
太阳能热水器的销量一直成增长趋势,十几年前,市场的主导还是电加热型的热水器,太阳能热水器寥寥无几,而如今,几乎每家每户都在使用太阳能热水器,以其廉价、节能、环保的优势占领了绝大部分市场。随着人们越来越浓厚的环保意识,对这种绿色的太阳能热水器的需求会越来越大。但是与之配套的控制器却一直没有达到成熟的阶段。目前,大多数控制器只具有简单的检测、显示功能,还需要人为的上水,当水温达不到满意的温度时,用户束手无策。因此,一个多功能的控制器一旦问世,一定会得到人们的喜爱。这种控制器的市场前景非常广阔。
这种控制器以单片机为核心器件,单片机的价格低廉、工作稳定、设计简单,非常适合这种控制器的生产,智能化的单片机还能够根据不同的需求作出相应的调整,满足了不同用户的多方面需求。另外,单片机系统耗能较少,能够最大程度的节约能源,保护设备,增加设备的使用寿命。它适用于各个地方的各种需求,且安装快捷,使用方便,所以它的市场前景广阔,是目前市面上其他热水器种类的升级产品。总之,无论从价格还是技术来说,太阳能热水器及其控制器都具有很大的优势。
太阳能热水器的组成很简单,包括存储热水的保温水箱、用于吸收太阳光能量并把它转换为热量的集热器、冷水和热水循环流动的水管,再加上几个阀门,用来控制水的流向。其结构图如下所示:
图2-1太阳能热水器结构原理图
太阳能热水器产生热水的过程也非常简单,利用冷热水密度不同的原理就可以完成水循环,集热器可以很好的保留太阳光的能量,从而将其转换为水的热量,当有水从集热器中流过时,冷水被加热为热水,再流向保温水箱储存起来,以供用户随时使用,直到水温达到设定值,循环阀门关闭。水循环过程如下图所示:
图2-2太阳能热水器水循环原理图
2.2 控制器结构及工作原理控制器的核心器件为SST89E58单片机,下图中T1代表保温水箱中的温度传感器DS18B20,由它负责实时温度值的检测,再发送给单片机进行显示;T2负责水位的检测,并完成自动上水功能;F1、F4分别代表冷水阀门和热水阀门;冷水和热水分别经F2、F3循环流动,最终存储在保温水箱中;电加热系统负责在雨雪天气进行加热,来达到设定温度;控制器还应有报警功能,当数据超过了正常范围,报警器启动,提醒用户。
图2-3控制系统结构简图
工作原理:
白天集热器工作时,打开阀门F2、F3,冷水从水箱流向集热器,经过加热后的热水经F3流向保温水箱。温度传感器T1实时检测水温,当温度达到设定值时,关闭阀门F2,F3。用户使用水时,打开阀门F4。没有水时,打开阀门F1上水。当阳光不足的阴雨天气时,水温达不到设定值,可以启动辅助加热系统。
控制器通过显示电路能够及时的反映出热水器的实时状态,包括水的温度、水箱中剩余的水量,它的辅助加热系统使人们在阴雨天气也能够使用到热水,报警功能能够督促人们去改变热水器的状态,使之处于正常的工作范围。总之,控制器为人们使用太阳能热水器带来了方便。对本课题进行分析之后,拟出了三个方案,如下所示:
方案一:以FPGA为基础设计系统
本方案以VHDL语言和EDA技术为基础,设计了一款太阳能热水器控制器,该系统的实现基于FPGA,控制器的硬件电路和软件程序相结合,完成了对水箱中的水温、水位等信息的采集和显示。
方案二:以CPLD为基础设计系统
本方案以芯片EPMl270作为核心器件,将控制器的外接电路检测得到的水温水位信息进行处理和分析,并从LCD液晶显示屏上展示给用户,有效地解决了使用太阳能热水器过程中遇到的问题。
方案三:以单片机SST89E58为基础设计太阳能热水器控制系统
本方案以SST89E58作为中心环节,它与80C51完全兼容,选择DS18B20为温度传感器、8155作为接口芯片,再加上键盘、显示电路,实现了对太能热水器的水温水位的检测和控制。控制器还有一套辅助加热的从系统,以继电器作为启动从系统的开关。
通过对以上三个方案的优缺点的分析,从实际的可行度,个人的知识掌握情况以及节约成本考虑,本设计选用第三种方案。
本设计的核心器件为SST89E58单片机,由它控制所有的功能完成运行,温度的检测需要用到温度传感器,这里选用DS18B20,水位的检测需要用到水位传感器,为了方便实验,本设计中用四个按键来模拟不同的水位,不同的按键按下会得到相应的水位信息,显示用到数码管,并由芯片8155作为接口电路,还需要由蜂鸣器和LED组成的报警电路来实现声光报警,辅助加热系统必须要用到继电器,以此来控制开关。根据以上设计,得到控制系统方框图如下:
图3-1 控制系统方框图
3.2 单片机及其外围电路
基于单片机设计的电路简单,I/O口扩展方便,因此可以外接多个电路,完全满足了控制器的需求,对单片机的编程也可使用汇编和C语言,编程方便;此外,单片机价格低廉、工作稳定、耗能较少,非常适合实验使用。
3.2.1 单片机简介单片机是一个集成在芯片上的计算机,SST89E58与80C51完全兼容,编程方便,程序被保存在ROM中,因此具有掉电保存功能,单片机拥有大量的I/O口和外扩I/O口,可以基于单片机设计很多电路,它的总线结构负责片内所有部件的通信,提高了工作过程中的可靠程度。片内有256个数据存储空间,绝对能够满足控制器的需求。在本设计中只使用到了单片机的某些引脚,例如外接石英晶体和电容的X1、X2等,单片机引脚图如下所示:
图3-2 单片机引脚排列图
部分引脚功能介绍:
表3-1 芯片引脚介绍
时钟电路提供了系统所需要的时钟信号,控制着单片机的工作节奏。其电路图如下所示,图中X1为石英晶体振荡器,C1、C2是两个值为30pF的反馈电容,它们构成的外部电路从XTAL1 、XTAL2端输入,与片内的反相器相结合,产生震荡脉冲,再经过分频电路,得到需要的时钟信号,以供单片机使用。本设计中晶振的频率为11.0592MHz。
图3-3 晶振电路
3.2.3 手动复位电路
单片机的复位电路用于产生复位信号,并从RST端输入,当单片机检测到RST端有超过2个周期的高电平后,系统进行复位,本设计采用手动复位,如图3-4所示,当按下图中的按键时,RST电平变高,单片机复位。
图3-4 手动复位电路
3.3 显示电路控制器的显示电路可以显示水箱中水的剩余量以及水的温度,使人们及时的了解热水器的工作状态,采用数码管与8155的结合来显示,这样便有效的节省了大量的I/O端口,功耗低,应用非常广泛,且设计方便,硬件电路也较为简单。
3.3.1 数码管简介为了对采集到的水温和水位的进行显示,要用到4个数码管。其中2个用来显示水位的高低,另外2个用来显示实时的水温。
发光二极管的缩写字母是LED,它是能够将电信号转换为光信号的发光器件。数码管就是由多个LED按照数字8的形状排列而成的。本设计中使用的是8段数码管,其发光二极管的排列形状如图3-5(a)。
图3-5 8段LED显示器
在使用过程中,为了给发光二极管提供电压使其发光,会把8个二极管的一端相连,给予高电平或是接地,连接方式有以下2种:
?共阳极。此方法给8个发光二极管的阳极端提供高电平,如图3-5(b)所示,另一端提供低电平的二极管会被点亮,否则灭。
?共阴极。此方法将8个发光二极管的阴极端接地,如图3-5(c)所示,另一端提供高电平的二极管会被点亮,否则灭。
本设计中用到的是共阴极接法,所以给阳极引脚加上高电平二极管就会发光。
3.3.2 8155简介
本设计中用8155作4位数码管的接口芯片。如图3-6所示,其中PA口为位码输出口,PA4~PA7为输出位控线,由于8155的高电平输出电流很小,数码管会很暗,所以在每个数码管的位控线上要加入一个三极管来放大电流。PB口控制段码的输出值。
图3-6 显示电路
使用8155作数码管的接口芯片时,8155只能输出显示的段码,而不能够控制输出的内容,动态控制的实现要依靠软件程序。在程序设计的时候,需要设置一个显示缓冲区,将要显示的数值存放到这个区域,本设计中用到4个数码管,因此设置了4个单元,地址为30H~33H。在每一个数码管被点亮之后,应加一段延时程序,以保证该数码管有足够的显示亮度。
3.4温度检测电路温度检测电路可以实时的反映出当前的水温,选择DS18B20主要由于其硬件电路简单,只需一条数据线与单片机相连即可,成本较低,误差小,非常适用于热水器温度的检测。
3.4.1 温度传感器DS18B20简介DS18B20的主要特征如下表所示:
表3-2 DS18B20的主要特征
DS18B20芯片封装结构:
图3-7 DS18B20芯片封装
DS18B20引脚功能:
·引脚1:GND 电压地 ·引脚2:DQ 单数据总线 ·引脚3:VDD 电源电压
DS18B20的工作原理:
DS18B20一个芯片即可完成温度的检测和数字数据的输出, 增强了其抗干扰能力。它的一个工作周期可分为温度检测和数据处理这两个部分。18B20共有三种存储器,它们分别是:ROM 、RAM 和EEPROM。
控制器对18B20操作流程:
在DS18B20工作之前,先要进行一段时间的复位。复位结束后,单片机给出高电平,以便接收一个存在脉冲。至此,单片机和18B20达成了基本的通信协议,接下来将完成两者间的数据通信。之后控制器发送ROM指令,一共有5条指令,由5个工作周期完成,当单片机只外接一个DS18B20时,可以跳过ROM指令,在本设计中就跳过了ROM指令。接下来控制器发送存储器操作指令,该指令包括写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。当存储器操作指令结束后,将执行温度转换指令或读数据指令。
若要读出实时的水温数据则需要执行两个工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。接下来执行第二个周期,为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据。至此,DS18B20的工作完成,之后单片机便可以对数据做相应的处理。
3.4.2 温度检测电路设计
单片机和温度传感器的电路图:
图3-8 温度检测电路
如上图所示,DS18B20的数据端口与单片机的P1.0相连,硬件电路非常简单,温度数据经过处理后会送到数码管显示。
3.5 水位检测电路及自动上水3.5.1 水位检测电路设计
蓄水箱的水位也是控制器需要检测的一个重要数据,最好是采用连续液位传感器,这样测得的数据可以准确的反映出蓄水箱的真实水位,但是为了简化实验,本设计采用分段式液位传感器,并用四个按键来代替水位。由于单片机实验板上独立按键个数有限,这里采用矩阵键盘中的部分按键来设计电路。KEY1按下代表水位为0%,KEY5按下代表水位为30%,KEY9按下代表水位为60%,KEY13按下代表水位为90%。键盘上有行线和列线之分,本矩阵电路有4条列线4条行线。在行线和列线的交点处放置了一个按键,由于行线和列线分别连接着按键的不同端,当按钮没有被按下时,行线和列线是不相通的。当有按键按下时,对应的行线变为低电平。这样就能采集到是哪个键按下。矩阵键盘原理图如下:
图3-9 矩阵键盘电路
将图中P2.0~P2.4连接到单片机后,在软件编程时,只需将P2.4清0,水位检测电路就完成了,当按键1按下时,数码管会显示00,当按键5按下时,数码管会显示30,当按键9按下时,数码管会显示60,当按键13按下时,数码管会显示90。
3.5.2 自动上水设计
当蓄水箱没水时,希望通过一个按键的控制来实现自动上水。在实际应用中,应用一个按键来控制电磁阀的开闭,以调整水位的多少,而在实验中,电磁阀的开闭难以实现,只能通过数码管显示水位来假设水位的上升。在软件设计时,需要用到外部中断1,并由INT1引脚引入中断请求。当芯片检测到有中断信号时,进入中断程序,数码管自动显示为“00→30→60→90”,然后退出中断,返回到主程序,自动上水功能至此完成。
3.6 温度设定及报警电路
温度的设定是利用单片机的计数中断功能,按键按下,进入相应的中断,温度值相应改变。声光报警电路利用LED灯和蜂鸣器的组合,成本低廉,设计方便,电路简单。
3.6.1 温度设定在太阳能热水器控制器使用过程中,用户会根据自身需求设定一个温度值,当处于加热状态时,达到这个温度就会停止加热,温度不再上升。温度设定需要用到2个定时器中断,分别用来完成温度的加1和温度的减1。这样用户就可以根据实际需求来设定0~99中的任意一个数。
将4个定时器TL0、TH0、TL1、TH1的初始值设置为FFH,这样,当有按键按下时,相当于从T0或T1中输入了脉冲,对应的定时器的值加1,进入中断服务程序,完成中断工作后,返回到主程序。在软件设计时,只需将定时器方式选择寄存器(TMOD)中的C/设置为1即表示在计数工作方式,计数脉冲由2个按键负责提供。那么当采集到一个按键按下时就会进入相应的中断,对温度值进行加减。
3.6.2 报警电路设计
当水温、水位过高或过低时,系统应该发出警告信号来提醒用户,考虑到自然水本身温度只有几度,如果设置低温报警,那么一上水系统就会报警,这是不希望出现的状况,所以本设计只设置一个高温报警值,这个值可以由用户随意设定。水位报警值分别为没水时的00%和溢水时的90%。在控制器的工作过程中,单片机会不断的将实时水温和水位与报警设定值进行比较,一旦到达这个值,报警灯会启动,蜂鸣器响,当实时数据下降到正常范围内,报警灯会灭掉,蜂鸣器不响。此部分电路设计非常简单,只需由P1.1和P1.2引脚分别控制一个蜂鸣器和1个LED灯,当需要报警时,将对应的引脚设置成需要的值即可。报警电路图如下所示:
图3-10 报警电路图
辅助加热由继电器来控制,继电器是一种很好的控制开关,价格低,控制方便,配合一个LED灯来模拟加热过程,使电路简单易行。
当天气晴朗时,阳光很充足,热水器水箱中的水能够被加热到满意温度,但是当雨雪天气,集热器吸收的能量无法使温度达到设定值,所以控制器还需要一套辅助加热系统,当水温满足不了用户的需求时,可以通过按键开启加热系统,水箱中的加热棒便开始发热工作,当水被加热到设定值时,加热系统自动关闭。
本设计中使用的继电器的型号是SRD-05VDC-SL-C。电磁继电器一般由衔铁、线圈、铁芯、触点簧片等几部分组成。当给继电器两端加上一个电压时,电磁效应就此产生,开关打到常开触点。当线圈断电后,电磁的吸力也随之消失,开关打到常闭触点。
辅助加热的电路图如下所示:
在仿真时,由于软件中没有SRD-05VDC-SL-C型号的继电器,所以用G2R-14-AC120型号的继电器代替,两者的工作原理相似。
图3-11 辅助加热电路图
辅助加热功能由外部中断0实现,当采集到按键按下时,进入中断。当辅助加热时,单片机的P2.6口输出的是高电平,三极管导通,开关打到常开状态,发光二极管被点亮,当不需要辅助加热时,P2.6口输出的是低电平,三极管未导通,开关在常闭状态,发光二极管不亮。图中的D1为一个续流二极管,当线圈突然断电后,电流不会立刻消失,剩余的能量会损坏线圈,为了防止这种现象发生,用一个二极管构成一个回路,使能量慢慢释放完,保护了线圈,增加了它的寿命。
当蓄水箱中没水时,是严禁启动辅助加热的,否则加热器会烧坏。在软件设计的时候,当进入辅助加热中断后,应先判断是否有水,即33H中的值是否为0,当为0时,跳出中断,不对P2.6的状态做任何改变,当不为0时,P2.6输出高电平,即开启辅助加热系统。
控制器的功能比较多,代码也有几百行,为了方便修改和设计,这里采用模块化结构,包括主程序、温度检测子程序、水位检测子程序、报警子程序、显示子程序以及4个中断程序:辅助加热子程序、自动上水子程序和温度设定子程序。由主程序调用不同的子程序来实现控制器的所有功能。
在编写系统初始化程序时需要注意以下几点:
?设置4个单元的显示缓冲区30H~33H,数码管显示的数字存放在这里。
?在50H、51H中存放温度设定的初始值。
?程序会使用到中断,所以在初始化时必须对与中断相关的寄存器进行一些设置。
主程序流程图如下所示:
图4-1 主程序流程图
将采集到的温度值转换成数字数据后送到单片机进行处理,得到一个3位数的值,由于实际生活中显示的温度只需要2位就可以满足,这里放弃了百位值的显示,处理后的数据送到33H、32H保存并通过数码管显示。
4.3 水位检测子程序
4个按键的一端分别接到P2口的4个引脚,当按键按下时,对应的引脚电平变低。判断出哪个按键按下后数码管会显示出对应的值。流程图如下所示:
图4-2 水位检测流程图
4.4 报警子程序
将检测到的水温、水位与报警值进行比较,当超出范围时,报警灯亮,当又回到正常范围内时,报警灯暗。报警子程序流程图如下所示:
图4-3 报警流程图
4.5 显示子程序
当采集到水温水位的数据后,被保存在30H~33H中,然后调用显示子程序,在每个时间点被点亮的数码管只有一个,但是时间间隔太短,人眼无法分辨出,所以平时看到的都是4个数码管同时亮着。
4.6 辅助加热子程序
辅助加热功能由外部中断0实现,当采集到按键按下时,进入中断。进入中断后首先判断是否有水,没水就退出,不需要加热;如果有水,开启加热,当加热到设定值后,停止加热。辅助加热流程图如下:
图4-4 辅助加热流程图
4.7 自动上水子程序
自动上水功能需要用到外部中断1,当检测到相应按键按下时,进入中断,然后控制数码管从00到30到60到90的显示,完成后退出中断。
4.8 温度设定子程序
温度设定需要用到2个定时器中断,定时器中断0用来完成温度加1度,定时器中1用来完成温度减1度。当进入温度加1中断后,判断当前值的个位是否为9,若为9,则十位加1,个位清0;若不为9,则INC 50H即可。调用显示后返回主程序。当进入温度减1中断后,判断当前值的个位是否为0,若为0,则十位减1,个位变为9;若不为0,则DEC 50H即可。调用显示后返回主程序。
程序编译的目的是为了检测编写的程序是否成功,或找出其中错误,以便更好的改善,保证能够正确的实现系统的软件功能。本设计用的开发工具是KeilC,并使用汇编语言进行编程,程序编译后的结果如下图所示:
图5-1 编译后的结果
程序编译正确之后,即可用仿真电路图进行调试。仿真电路图如下所示,由于矩阵键盘的效果与独立按键的效果一样,为了方便仿真,在此仿真时用独立按键代替矩阵键盘,并用80C51代替SST89E58进行仿真:
图5-2 仿真电路图
点击开始按钮,程序开始运行,以下选取几种仿真结果:
数码管显示应为3022,如下所示:
图5-3 仿真结果显示
(2)当按键3按下时,代表水位为60%,改变DS18B20的值,使之为40。数码管显示应为6040,如下所示:
图5-4 仿真结果显示
(3)当按键4按下时,代表水位为90%,达到报警值,此时不管温度值为多少,系统都会报警,蜂鸣器会响,LED灯D1亮,如下所示:
图5-5 仿真结果显示
图5-6 仿真结果显示
图5-7 仿真结果显示
(6)当按键7按下时,温度的设定值加1,由25变为26,如下所示:
→→
图5-8 仿真结果显示
→→
图5-9 仿真结果显示
硬件实物图如下所示:
图5-10 硬件实物图
提供外部电源后硬件便开始工作,这里选取几种结果演示:
图5-11硬件结果显示
(2)当KEY5按下时,代表水位为60%,此时水温为30,则数码管显示结果为:
图5-12硬件结果显示
(3)当KEY1按下时,代表水位为90%,此时达到报警值,不管水温为多少,系统都会报警,蜂鸣器响,LED灯被点亮,结果如下所示:
图5-13硬件结果显示
→
图5-14 硬件结果显示
→
图5-15 硬件结果显示
5.3 调试过程中遇到的问题
通过设计之前所学的知识都得到了广泛的应用,加深了理论与实际的联系。提高了本人的动手能力,自己的创新意识也得到了培养,使自己对单片机的了解更加的全面了。一开始接触这个课题的时候,完全没有思路,虽然很熟悉太阳能热水器,控制器的功能也理解,但要自己动手用软件和硬件来实现,却无从下手。从网上找了很多资料,也借鉴了其他人设计的控制器,在一番深入的了解之后终于得到了一个初步的设计思路,并在之后的代码编写和硬件焊接过程中,不断的完善,最终完成了本次设计。
在这次设计中,接触到了温度传感器,这款芯片是本人从来没有使用过的,虽然它与单片机的连接非常简单,但是硬件的简化导致了软件的开销,所以在软件编程时,温度检测这一模块的代码困扰了本人很久,查了很多资料,对传感器的工作原理也了解了很多,可是编写的代码始终不能运行,经过了三周左右的努力,终于发现了代码中的错误,原因是因为没有给复位足够的时间导致18B20不能工作,修改后成功的将温度检测模块编写完成。设计中另外一个难点是温度设定中断代码的编写,在一开始的设计思路中,进入中断后没有PUSH、POP的内容,在中断子程序中修改温度后回到主程序时发生了冲突,意识到这一点后修改了代码,完成了中断子程序的编写。至于其他模块的代码编写比较简单,过程中并未遇到什么挫折。
硬件电路的焊接也不是非常顺利,设计初的报警电路是由LED灯和蜂鸣器组成的,但是在下程序的过程中不小心把蜂鸣器弄坏了,所以在耽搁了一周之后才完成。本次硬件电路是基于之前课程设计中用过的单片机实验板,因此布局布线比较简单,这为硬件的搭建省了很多事,也为此次设计提供了很多方便。
三个多月的时间很快就过去了,在这段时间里,本人各方面的能力都得到了提升,总之,这次设计让本人学到了很多。
经过几个月的努力,本人的设计已经完成。回想这几个月的学习,从开题到论文的顺利完成,得到了老师和同学们的很多帮助。
首先要感谢本人的指导老师,在设计的过程中,从选题,设计方案,论文修改直至成稿一直给予了很多的指导和帮助,同时也提供了相关的参考资料,为本人解答疑惑,提供了很多关键性的建议。她严谨细致,一丝不苟的作风一直是本人学习、工作中的榜样,他循循善诱的教导和不拘一格的思路给本人无尽的启迪。
还有本人的室友和很多同学也给了很多的帮助,他们给予鼓励与意见,让本人度过了这段艰辛的时期。特别要感谢寝室的同学们,一直以来都在鼓励本人,在做仿真时一直都在帮助本人,如果没有她们的热心帮忙,此次设计的完成将变得非常困难。
对于这次设计中给予本人帮助的老师和同学致以感谢!
附录
附录1:程序
GE_BIT EQU 40H
SHI_BIT EQU 41H
DI_8BIT EQU 43H
GAO_8BIT EQU 44H
DQ EQU P1.0 ;温度传感器I/O口
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP HEAT ;辅助加热
ORG 000BH
LJMP PLUS ;温度加1
ORG 0013H
LJMP RISE ;自动加水
ORG 001BH
LJMP MINUS ;温度减1
ORG 0020H
MAIN:MOV SP,#60H
MOV 30H,#0 ;30H-33H显示缓冲区
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 50H,#5 ;存放温度设定值
MOV 51H,#2
MOV DPTR,#07100H ;选中8155
MOV A,#3H
MOVX @DPTR,A
MOV IP,#0FH ;中断优先级
MOV TCON,#05H ;外部中断脉冲触发有效
MOV IE,#8FH ;中断总允许,允许定时器和外部中断
MOV TMOD,#55H ;接通外部技术引脚T0T1
MOV TH0,#0FFH
MOV TL0,#0FFH
MOV TH1,#0FFH
MOV TL1,#0FFH
SETB TR0 ;启动定时器
SETB TR1
CLR P2.4
CLR P2.6
TURN:
LCALL WATER
LCALL ZHUANHUAN ;调用读温度子程序
LCALL DISPLAY
LCALL WARN ;水温水位报警
AJMP TURN
WATER: ;水位按键判断
JNB P2.3 ,LOOP5
JNB P2.2,LOOP4
JNB P2.1,LOOP3
JNB P2.0,LOOP2
LCALL DISP
RET
LOOP2:MOV 32H,#0
MOV 33H,#0
LCALL DISP
RET
LOOP3:MOV 32H,#0
MOV 33H,#3
LCALL DISP
RET
LOOP4:MOV 32H,#0
MOV 33H,#6
LCALL DISP
RET
LOOP5:MOV 32H,#0
MOV 33H,#9
LCALL DISP
RET
WARN:MOV A,51H ;水温报警
SWAP A
ORL A,50H
MOV 52H,A ;50H和51H 合并
MOV A,31H
SWAP A ;30H和51H合并
ORL A,30H
CJNE A,52H,PD ;检测到的温度与设定温度比较
CLR P2.6
CLR P1.2
SETB P1.1
LJMP EXIT
PD:JC BBB ;温度<设定值则 跳到BBB
CLR P2.6
CLR P1.2
SETB P1.1
SJMP EXIT
BBB:LCALL WARNING
EXIT:RET
WARNING:MOV A,#0 ;水位报警
CJNE A,33H,PD1 ;没水时报警
CLR P1.2
SETB P1.1
AJMP OUT1
PD1:MOV A,#9
CJNE A,33H,BB ;水满时报警
CLR P1.2
SETB P1.1
AJMP OUT1
BB:SETB P1.2
CLR P1.1
OUT1:RET
/*4个中断*/
PLUS: ;温度加1中断
PUSH 30H
PUSH 31H
MOV TH0,#0FFH
MOV TL0,#0FFH
MOV A,50H
CJNE A,#9,CC
MOV 50H,#0
INC 51H
AJMP CC1
CC:INC 50H
CC1:
MOV 30H,50H
MOV 31H,51H
MOV R1,#07FH
CFU:LCALL DISP1 ;将设定值显示一段时间
DJNZ R1,CFU
POP 30H
POP 31H
RETI
MINUS: ;温度减1中断
PUSH 30H
PUSH 31H
MOV TH1,#0FFH
MOV TL1,#0FFH
MOV A,50H
CJNE A,#0,CC2
MOV 50H,#9
DEC 51H
AJMP CC3
CC2:DEC 50H
CC3:
MOV 30H,50H
MOV 31H,51H
MOV R1,#07FH
CFU1:LCALL DISP1
DJNZ R1,CFU1
POP 30H
POP 31H
RETI
HEAT: ;辅助加热中断
MOV A,33H
JZ OUT ;没水时不能打开继电器,JZ累加器判0转移
SETB P2.6
OUT:RETI
RISE: MOV 32H,#0 ;自动上水
MOV 33H,#0
MOV R1,#0FFH
CFU2:LCALL DISP
DJNZ R1,CFU2
MOV 33H,#3
MOV R1,#0FFH
CFU3:LCALL DISP
DJNZ R1,CFU3
MOV 33H,#6
MOV R1,#0FFH
CFU4:LCALL DISP
DJNZ R1,CFU4
MOV 33H,#9
MOV R1,#0FFH
CFU5:LCALL DISP
DJNZ R1,CFU5
RETI
/***显示程序***/
DISP:
MOV A,#40H ;水位显示子程序
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,32H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY00
MOV A,#80H
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,33H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY
RET
DISP1:
MOV A,#10H ;温度显示子程序
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY00
MOV A,#20H
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,31H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY
RET
/*---------------------延时子程序-------------------- */
DELAY: MOV R5,#0FH
DELAY4: MOV R4,#0FH
DELAY5: DJNZ R4,DELAY5
DJNZ R5,DELAY4
RET
DELAY00:MOV R6,#0AH
DELAY8: MOV R7,#0AFH
DELAY9: DJNZ R7,DELAY9
DJNZ R6,DELAY8
RET
;这是DS18B20复位初始化子程序
INIT_1820:
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
DU_1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,DU_1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DU_2:JNB DQ,DU_3 ;等待DS18B20回应
DJNZ R0,DU_2
LJMP DU_4 ;延时
DU_3:SETB F0 ;置标志位,表示DS1820存在
LJMP DU_5
DU_4:CLR F0 ;清标志位
LJMP DU_7
DU_5:MOV R0,#117
DU_6:DJNZ R0,DU_6
DU_7:SETB DQ
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的子程序,
READ_1820:MOV R4,#2
MOV R1,#DI_8BIT ;低位存入DI_8BIT,高位存入GAO_8BIT
RE0:MOV R2,#8
RE1:CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE2:DJNZ R3,RE2
MOV C,DQ
MOV R3,#23
RE3:DJNZ R3,RE3
RRC A
DJNZ R2,RE1
MOV @R1,A
INC R1
DJNZ R4,RE0
RET
;-------------------------------------------------
;读出后转换的温度值
ZHUANHUAN:
LCALL INIT_1820 ;先复位DS18B20
JB F0,ZH1
RET
ZH1:MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H
LCALL WRITE_1820
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_1820
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
;CHULI
MOV A,GAO_8BIT
MOV A,DI_8BIT
MOV B,#16
DIV AB
MOV 35H,A ;将DI_8BIT的高四位右移四位,存入35H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 36H,A ;将小数后一位数.存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入温度值的整数部分
MOV B,#10
DIV AB
MOV GE_BIT,B ;个位存入40H中
MOV B,#10 ;
DIV AB ;
MOV SHI_BIT,B ;十位存入41H中
RET
;-------------------------------------------------
DISPLAY:
MOV A,SHI_BIT //显示温度十位
MOV 31H,A
MOV A,GE_BIT //显示温度个位
MOV 30H,A
LCALL DISP1
RET
/*************** 段码缓冲区 **********************************/
TABLE: DB 0fcH,60H,0daH,0f2H,66H,0b6H,0beH,0e0H,0feH,0f6H
End
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |