找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的电热地暖控制系统设计论文

[复制链接]
跳转到指定楼层
楼主
ID:304102 发表于 2018-4-8 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本科设计(论文)
题  目:基于单片机的电热地暖控制系统设计
院  系:     自动化工程学院   
专业年级:测控技术与仪器 2017届   
学生姓名:*** 学号:######  
指导教师:徐进

【摘要】

本文以电热地暖系统的具体原理和工作特点,分析了实际应用场合使用过程中所可能遇到的情景和问题,提出了一种电热地暖温度的自动控制系统。在研究该课题的过程中,通过查阅资料了解了电热地暖系统的硬件构成和原理,以及对应的软件。本设计以STC89C52单片机作为数据处理及控制核心,采用DS18B20作为温度传感器。本设计采用四路DS18B20进行测温,系统能够采集电热地暖不同部分的平均温度,从而使地板的整体温度的控制更加精确。可以通过LCD液晶显示屏实时显示当前温度,可以对温度设定值进行改变,系统将根据地热当前的温度值与设定值进行比较进行智能加热,使房屋温度维持在人体舒适的范围之内,从而到节约电力能源的目的。本设计可应用于单房间的地热分区控制,也可应用于双房间的地热联合控制。本次设计采用模块化设计,文中阐述了以STC89C52为中央处理器的加热控制处理功能、温度采集功能以及温度显示功能等各个功能模块的实现方法。


Abstract

This topic is mainly aimed at the study of the automatic temperature control of the electric floor heating systems. After the research and the study on the principle and the features of the electric floor heating systems, consider bout the scene that the system worked, an automatic electric floor heating control systemis proposed. Study hard while on the subject of automatic electric floor heating control system of hardware and corresponding software. This design uses STC89C52 single-chip computer as the processing and control core, DS18B20 as the temperature sensor. This design uses four-way DS18B20 to detect thetemperature. The system can collect the average temperature of different parts of the heating, so that the control of the temperature can be more accurate. Thecurrent temperature can be displayed through the LCD liquid crystal display, and the temperature settings can be changed. The system will heat the floorintelligently by the setting temperature, so that the housing temperature maintained within the scope of human comfort, thus to achieve the purpose of energy saving. The design can be applied to single room geothermal partition control, can also be applied to the double room of the geothermal joint control. This research mainly uses modular design. This paper expounds the STC89C52 as the central processor for heating control processing functions, temperature acquisition functions, temperature display functions and other functional modules method.

目录

1章 课题研究的背景

2章 系统分析与设计

2.1 系统整体分析

2.2设计内容与实现的功能

3章 系统硬件设计

3.1系统硬件构成

3.2系统主要电路

3.2.1单片机控制电路

3.2.2 地板温度采集电路

3.2.3  温度实时显示电路

3.2.4 温度越限/故障报警电路

3.2.5 设置按键电路

3.2.6 地板加热电路

4章 系统软件设计

4.1 系统主程序设计

4.2 系统子程序设计

4.2.1 LCD显示模块程序

4.2.2 按键功能程序

4.2.3 温度检测程序

4.2.4 温度数据处理程序

4.2.5 温度越限/故障报警程序

5章 系统调试与仿真

5.1 仿真软件

5.2 测试过程

5.3 测试结果

6章 结论与展望

致谢

参考文献

附录

附录一 :系统硬件仿真电路及原理图如下

附录二 :源程序如下



第1章 课题研究的背景

从远古的篝火取暖到现在的集中供暖和空调取暖,人类的取暖方式随着科技的进步而不断地演变创新。虽然在科技发达的现在取暖的方式多种多样,但是如何在不同的应用场合下选择最为环保经济的取暖方式也就成为了我们需要探讨的问题。

我国地域辽阔,南北跨越纬度近50度,这也就造成了我国南北气候的极大差别。在我国北方,由于冬季漫长并且气温寒冷所以采取了集中供热的取暖方式。而在南方如上海、重庆和湖南一类的地方,被称为夏热冬冷地区。夏热冬冷地区的气候特征主要表现为夏季高温酷热,冬季寒冷潮湿。虽然这类地区的冬季十分短暂,并且空气温度也并不是很低,但是给人的感觉却是寒气透骨的。这是因为我们对温度的实际感知由空气温度来决定的,而是取决于体感温度。而体感温度是由空气温度与湿度同时所决定的,所以在潮湿的夏热冬冷地区的冬季取暖也是很有必要的。南方的冬季需要采暖的总体时间并不长,然且并不连续。因此初期投入很大并且供暖时间连续的集中供暖并不适用于南方。此时独立采暖就成为了最佳的选择,一是弥补了无市政热力管网的先天条件,二是用户可以随时根据情况决定是否进行取暖。

目前我国南方的居民在冬天一般采用空调取暖的方式。冷暖空调的主要原理是通过热交换进行室温的加热或者降低,在一般情况下空调室内机都位于较高的位置,因此在制热的过程中,由于热空气比冷空气密度小的缘故,在整个房间很长的时间都会处于一个上部空气闷热而下部分房间的温度却依然很低,这就会给人们一种头部热而下半身却依然感觉寒冷的不适感,在保温不佳的房间内这中情况则更为严重。长时间待在这种状态的房间内就会使人感到头晕和呼吸困难。

因此近些年来越来越多的人们也开始采用电地暖的取暖方式。相较于空调通过热交换加热室内温度,地暖是通过低温辐射的原理加热房间的温度。热源处于房间下部缓慢地使房间空气的温度逐步升高,因此整个房间会使人有一种头凉脚暖的舒适感受。目前应用较广的电热地暖分为水地暖和电地暖,本文提出的设计的研究对象为以发热电缆为发热元件的电地暖,因此下文的介绍和研究将围绕电地暖进行展开。电地暖一般是将发热上限为65度的发热电缆在房屋装修时埋藏在铺设地面的水泥混凝土之中,然后再在混凝土层次之上进行地板的铺设,整个系统的加热控制使用控制器进控制,以辐射供暖的方式加热地面以达到加热室内空气温度的目标。

虽然说地暖在舒适度上有着很大的优势,但是使用发热电缆作为加热热源的电热地暖对电力的消耗还是很大的。近些年来随着人类经济的不断发展,全球的能源问题也越发明显。因此针对于电热地暖设计出一种节电智能,并且能够自动地完成室内温度调节的控制器有着很重要的意义。


第2章 系统分析与设计

2.1 系统整体分析

本设计所研究的电热地暖控制系统的设计,主要的问题就是提出一个可靠稳定的系统,能够地板准确加热到目标温度,并将此温度维持在一个最佳的范围之内。此外还要具有对系统故障警报与采取提前措施的功能。

目前市面上已有的电热地暖的控制方案一般采用单温度传感器进行地面温度的测量,通过测量值和预设值的对比,再控制铺设在地面下的单回路加热线缆进行加热。这种方法虽然已经实现了加热温度的自动控制,并且简单有效,但是依然还有一些不足。第一点是仅采用了单温度传感器进行温度的测量,相对于整个房间仅仅一只温度传感器很难完整地体现房间地面的整体温度情况,测量到的温度的误差进一步便会导致整个系统对温度的控制的不准确。第二点是没有完善的故障报警和处理环节,当加热电缆发生故障时有可能会发生系统无法加热或者加热无法停止的情况,进而导致系统失效或者引发安全问题。第三点是由于房间的布局,房屋靠近窗户的部位温度会更低一些,而由于家具的摆设也会导致地板的某些地方散热不佳,进而导致整个地板的温度不均匀,使用户不能得到最佳的产品体验。因此设计出一种可以更加精确地采集并控制地板温度、能够对几种常见的故障报警并进行预处理和均匀控制地板温度的电热地暖系统便变得具有意义。

    首先是决定电热地暖的预设温度值。经过查阅资料后我了解到当地板的温度为25°C到28°C时人体感觉最为舒适,而在这个温度范围内选择地板温度为28°C时对房间的加热效果最好,因此我选择28°C作为系统的预设温度值。同时用户也可以根据自己的需要进行温度设定。

为了解决地板温度不均匀的问题我将传统的单回路加热电缆分为内圈和外圈两个回路,分别承担房间外侧和内侧的加热任务。两个加热回路分别使用两颗温度传感器于选定的位置进行温度测量,之后将两只传感器测得的温度取均值作为该回路的温度,提高了测温的可靠性与精确度。

只有当地板温度低于设定值3°C时系统进行加热,当达到设定温度值时系统自动断开加热电缆从而达到节能的目的。

    对于系统故障的方面我设置了故障指示灯和声音报警的功能,当温度过低或者过高时进行报警提示用户排除故障,当温度过高时系统也将自动断开加热电缆防止意外的发生。

2.2设计内容与实现的功能

本课题设计以单片机为核心,制作了一套双回路的电热地暖的控制系统,并且使用proteus软件建立了一个相对应的仿真控制系统。本设计的主要设计构成包含了控制部分、显示部分和采集部分三大模块。在设计上选取了业界常用的ds18b20温度传感器作为地板温度的采集元件,总共使用了4颗感温元件来提高测温的总体性和准确性。每两颗温度传感器组成一组分别检测两个加热回路不同位置的温度,然后将采集到的每部分温度传送给处理核心STC89C52来进行求均值处理;使用继电器分别控制两回路加热电缆是否进行加热,进而使地板的温度维持在期望的范围之内。

本文中系统设计最终实现功能如下:

(1)温度初始设定值为28°C,可以通过键盘改变期望值,并且对温度期望值进行显示。两个加热回路的实时温度可以即时显示。

(2)在电热地暖加热系统刚刚启动之后,进入预加热与检测过程。系统会自动检测外界的温度,如果外界温度低于设定的温度期望值,系统将会接通继电器将地板温度加热至期望值,然后进入恒温保持模式;如果外界的温度高于设定的温度期望值,系统将不进行加热,直接进入恒温保持模式。

(3)预加热与检测过程结束后系统将进入恒温保持模式,将地板温度维持在期望值附近。两个加热回路分别由对应的继电器进行独立控制。假设回路1测得的平均温度为T1,回路2测得的温度为T2,具体的控制逻辑如下所示:

·当T1比设定值低3°C时接通继电器1进行加热;

·当T1达到设定值时断开继电器1;

·当T1比设定低大于5°C时接通继电器1并进行声光报警;

·当T1比设定高大于5°C时断开继电器1并进行声光报警;

·回路2 的控制逻辑同上。


第3章 系统硬件设计

3.1系统硬件构成

STC89C52单片机承担了本电热地暖控制系统的数据处理及控制核心的角色。整个系统控制的目标便是控制地板的温度。系统电路框图如图3-1所示。整个系统包含四大模块,分别为单片机控制模块、温度测量模块、显示模块和模块。

系统中由两路温度采集模块实时检测两个加热回路的温度,可以由按键改变加热温度的期望值,由LCD模块进行当前温度和设定温度的输出显示。当温度低于期望值时电磁继电器闭合由加热电缆进行加热,温度达到期望值则停止加热。当温度超过警报值时报警部分中的二极管亮起,同时激活蜂鸣器进行警示,提示故障的排查,越过上限的报警时继电器便会切断加热电缆电路以保证安全。

3.2系统主要电路3.2.1单片机控制电路

STC89C52作为本系统的控制和数据处理中心,图3-2表示的是单片机的最小系统单元。

STC89C52的具体性能与参数:作为8位8051微处理器的后续升级衍生产品,它的封装工艺为PDIP方式,使用了CMOS的集成电路工艺,外部引脚与ATC89C52完全相同,具有4组共32个通用I/O端口,RAM集成在芯片内部,具有512字节的容量,给予应用程序的空间有8k字节,定时器/计数器一共有三个,均为16位,它的编程代码完美兼容于传统的8051{15}。

图3-2 单片机最小系统单元

   单片机控制部分在整个电路中扮演着重要的角色,而单片机最小系统单元包含了单片机控制部分正常运作所必须的基本要素。时钟电路通过晶体振荡器振荡为单片机产生时钟,选用频率为12Mhz的晶体振荡器,这个时候单片机的运行速度即12Mhz/s,这时机器周期为1微秒,计算起来更加便捷并且此时的系统工作稳定。复位电路由电容电阻和一个开关构成,能够在系统上电时给予RST引脚一定时间的高电平,进而将单片机自动复位,预先烧录好的程序将从头开始执行,也可以通过闭合开关使程序复位重新载入运行。P0.0~P0.7接口在本系统中作为I/O接口与LCD显示屏相连接,因此必须加入上拉电阻。表3-1列举了本设计中单片机接口对应的连接和分配。

表3-1 单片机接口分配

单片机 I/O 端口

外部电路引脚

外部电路引脚说明

     p0.0~p0.7

D0~D7

LCD1602的数据接口

    p1.0~p1.3

       DQ1~DQ4

四路温度传感器的数据引脚

      p1.4~p1.5

两路加热回路的报警LED

      p1.6~p1.7

控制加热回路开关的继电器

        p2.0

      蜂鸣器报警电路

        p2.6

         RS

  LCD1602数据命令选择端

        p2.7

         E

    LCD1602读写选择端

        p3.3

         设置键

        p3.4

       温度增加键

        p3.5

       温度减少键

        p3.6

         确定键

3.2.2 地板温度采集电路

地板温度采集电路如图3-3所示。本次设计采用双回路加热电缆加热,因此使用四路温度传感器置于每个回路的对称最远端进行温度测量,之后取平均值作为当前加热回路的温度值,提高了测温的可靠性与精确度。系统中将温度传感器安装于地板下方测量温度,填埋在混凝土下方的发热电缆温度在50°C~60°C之间,热量传至上方地板时维持在21°C~28°C之间。根据应用场合,估计所测温度的范围为0°C~30°C,在此条件之上考虑到成本因素选用DS18B20作为温度采集元件。每只DS18B20单独占用一根I/O端口。

图3-3 地板温度采集电路

DS18B20温度传感器广泛应用于测温范围为-55°C~125°C的测量与控制系统中,通过编程可实现分辨率9~12位的高精度测温。它具有独特的单总线通信方式和小巧的体积使之可以应用于各种复杂的工作环境之中。该传感器对于供电的要求不高,在3.0V~5.5V的电压下均可正常工作,亦可采用在数据线直接取电的寄生电源方式工作。DS18B20内部由64位的光刻ROM 、温度传感器、非挥发的温度报警触发器TH、TL与配置寄存器构成。图3-4为DS18B20的内部结构组成示意图。表3-2为DS18B20的端口定义{16}。

图3-4 DS18B20的内部结构组成


表3-2 DS18B20端口定义

端口

   DQ

    GND

  VDD

定义

信号输入/输出

      接地端

电源输入

加热电缆与温度传感器的简单安装示意图如图3-4所示。其中两根黑色粗线分别代表两个加热回路,线缆的具体铺设应依据现场决定,这里仅作简单示意。白色和灰色区域为两个加热区域的范围表示,黑色圆形代表温度传感器ds18b20的安装位置。合理地布置加热区域和温度传感器便可以得到良好的加热控制与热量分布。如果将两个加热回路单独使用,本系统也可以应用于两个房间的独立加热。

图3-5 加热电缆与温度传感器安装示意图


3.2.3  温度实时显示电路

为了能够直观实时地显示两个加热回路的温度值,就需要一个显示电路来提供可视化的数值显示。考虑到本次设计中涉及到两个监测温度值和一个温度设定值的显示,显示的内容较多,所以没有选择数码管的显示方案,最终选择了LCD1602作为显示电路的核心元件。它的外部端口如图3-6所示。其端口释义如表3-3所示。

LCD1602液晶显示模块是根据液晶的物理特性制成的,通过给与对应点阵电压便能控制该点的显示,此液晶通过HD44780液晶芯片控制显示屏上的点阵进行显示。液晶控制器、液晶驱动器和液晶显示元件共同实现了LCD1602的基本功能。LCD1602具有两行显示区域,每行包含16个字符的显示位置。显示的字符由点阵组成,有5×7或5×11两种点阵的组成方法。点阵可以轻松地对符号数字和英文字母进行表达。作为通用的点阵显示控制器,HD44780内部预置了192个常用的点阵字符与图形,通过字符代码和字模我们便能查找和调用所需的点阵字符。该控制器内部具有指令寄存器和数据寄存器两个8位寄存器,它们的英文表示分别为IR和DR。LCD1602的第四根引脚RS端就是用来选择是使用IR还是DR的,从而决定是使用数据寄存器还是命令寄存器。

图3-6 LCD1602外部端口

表3-3 LCD1602端口释义

端口

端口功能

DB0-DB7

数据通讯端

VSS

地端

VCC

电源正向电压输入

BLA

显示背光正极

BLK

显示背光负极

V0

通过输入的电压可以调整显示的对比度效果

E

使能端口

RS

选择使用IR还是DR寄存器,高电平选中DR,低电平为IR

R/W

读写控制端

在本次设计中LCD1602的电路连接如图3-7所示。显示元件的通讯接口与单片机的P0相连接。而P0口作为输入输出接口使用时,内部为漏极开路型,所以要连接一个上拉电阻来得到高电平。外接的滑动变阻器可以改变电压使液晶的对比度变化。在本次设计中液晶上方第一行分别显示两个加热回路的实时温度值,第二行显示加热温度的期望值。

图3-7 LCD1602电路连接示意图

3.2.4 温度越限/故障报警电路

本系统中增加了声光报警电路。在系统使用过程中,当发热电缆或者其他元件故障时有可能引起两种情况。一是电缆的加热不受控制,加热的温度不断升高,这种情况下将有可能使用户感到不适甚至引发火灾事故;二是加热电缆自身发生断路或者老化,整个系统无法加热或者加热的效果达不到预期,这就会直接影响到加热的最终效果。于是我设置了能够辨别两个加热回路的故障LED显示,在发生故障时蜂鸣器也会同时响起,提醒用户及时排查故障,使系统处于一个良好的工作状态。

当温度传感器测得一个加热回路的温度低于预设值5度时可以认为加热电缆老化需要更换,此时对应的报警LED亮起同时蜂鸣器发出声音提示用户进行检查;当测得加热回路的温度高于预设值5度时,对应的报警LED亮起,蜂鸣器发出声音,同时单片机控制的继电器会自动断开对应的加热回路以防止事故的发生。

蜂鸣器控制方便,集成度高,应用于我们生活中的方方面面。我们常用的电脑、打印机、定时器中都能找到它的身影。为了防止两颗报警LED烧毁所以分别串联了两只150欧姆的电阻减小通过的电流。单片机I/O口的驱动能力难以满足蜂鸣器的工作要求,因此在三极管的基极连接了一个上拉电阻来驱动蜂鸣器。温度越限/故障报警电路的连接如图3-8所示,当温度超过设定的报警范围时,单片机的引脚发出低电平使PNP三极管导通,蜂鸣器响起报警。

图3-8 温度越限/故障报警电路

3.2.5 设置按键电路

本系统中温度期望值的设定功能由外设的四个按键达成,如图3-9所示。四个按键分别与单片机的P3.3~P3.6相连。按下设置键可以进入地板温度的设置界面,按下温度加/减按键可以修改地板加热温度的期望值,按下确定键可以保存修改的设置或退出设置界面。实现了用户自己根据需求进行温度更改,人机交互的功能。

图3-9 设置按键电路

3.2.6 地板加热电路

在整个设计中地板加热电路承担了发热源的角色。如图3-10所示,地板加热电路由220V市电接口、大电流继电器、PNP型三极管、电阻、二极管发热电缆和发光二极管组成。考虑到整个加热电路的负载我选择使用CLD-D24型号的继电器。因为proteus仿真软件中没有发热电缆相对应的元件,并且为了更直观的展示这里我用了发光二极管代替。对应的220V市电用电池组代替展示。发光二极管用来检测驱动电路中的电流,有电流通过时LED发光,没有电流通过时LED不发光。于是地板加热中的发热电缆就被LED发光二极管所代替。当系统中温度采集电路监测到的地板温度低于预先设置好的温度下限值3°C时,单片机对应引脚发出低电平使PNP三极管导通发光,继电器CLD-D24的磁感应线圈充磁,产生磁力,磁力吸引触点与闭路触点接触,发热电缆开始加热。当实时采集到的地板温度达到或者高于预先设置好的温度时,单片机不输出信号,PNP三极管不导通。LED发光二极管不发光,继电器CLD-D24磁感应线圈中没有磁力产生,触点在开关上的应力的作用下恢复到断路的位置,发热电缆停止对地板的加热。安装在PNP三极管基极端的发光二极管就起到了系统加热指示灯的作用。当加热电缆进行加热时加热指示灯亮;当加热电缆停止加热时加热指示灯不亮,可以让人们更为直观地得知系统的运行情况。在这里发光二极管连接在PNP三极管和5V供电端之间,并串联了限流电阻,通过的电流较小在三极管的承受范围之内,而且相对于继电器三极管的价格便宜,并且该三极管是继电器控制电路中必不可少的,使用三极管来控制指示发光二极管起到了一石二鸟的效果。控制发热电缆是否进行加热的电流很大,超出了三极管能够承受的范围,所以需要采用继电器作为开关,能够承受较高的电流。

图3-10 地板加热电路

第4章 系统软件设计4.1 系统主程序设计

本文中软件设计的主要内容由三个单元组成:地板温度采集模块、LCD1620液晶显示模块与数据处理模块组成。

主要的内容如下所示:系统接通电源后自动复位,进行初始化,程序从开头开始运行,在欢迎界面跳过后,系统会自动读取预先设置好的温度值T0,读取四路温度传感器测得的温度之后自动求均值计算出每一个加热回路的温度值T1、T2。首先进入系统的预加热阶段,将T1、T2与预设温度值与T0进行比较,当某回路测得温度值低于预设值T0时,闭合继电器对该回路进行加热,直到温度达到预设值后停止加热进入下一个工作模式(预加热阶段因为刚刚通电外界温度可能低于最低的报警温度,因此设定了预加热阶段,在此阶段系统不会报警)。系统的第二个阶段是恒温控制阶段。在这个阶段内首先读取采集的地板温度,当温度低于设定值3度时闭合继电器对相应的回路进行加热,直到达到预设值即停止加热。当采集到的温度高于或低于预设值超出5度时系统自动点亮对应回路的报警LED,同时接通蜂鸣器电路进行声音报警。

    系统的主程序流程图如图4-1所示。



图4-1 系统主程序流程图

4.2 系统子程序设计4.2.1 LCD显示模块程序

LCD显示模块主要承担了显示两个加热回路实时温度和温度设定值的显示的任务。两个加热回路的实时温度T1、T2是由对应位置的四路ds18b20测温元件测得的温度两两为一组,再由单片机求均值得来的,最后在LCD1620的第一行进行显示。温度设定值则由设定按键S1、S2、S3和S4来进行设定。LCD液晶的显示程序如下所示。

lcd1602_adr(0x02);

    if(wendua1>=0)

     {

                 lcd1602_writenumber('+');

                 lcd1602_writenumber(0x30+wendua1%1000/100);

                 lcd1602_writenumber(0x30+wendua1%100/10);

                 lcd1602_writenumber(0x30+wendua1%10);

                 lcd1602_writenumber(0xdf);

     }

   if(wendua1<0)

     {

                 lcd1602_writenumber('-');

                 lcd1602_writenumber(0x30+(0-wendua1)%1000/100);

                 lcd1602_writenumber(0x30+(0-wendua1)%100/10);

                 lcd1602_writenumber(0x30+(0-wendua1)%10);

                 lcd1602_writenumber(0xdf);

     }

    这里的程序段是LCD液晶用来显示第一个加热回路的温度T1的程序。它可以将单片机计算好的两只DS18B20温度的均值做出转换并显示在液晶屏上指定的位置,当送来的温度为负值时将会显示出带负号的温度值。第二个加热回路的温度T2和设定值T0的程序段与此相似,只是显示的位置做出了变化,这里就不再赘述。对于DS18B20温度数据的处理程序将在后面对应的部分进行说明。

4.2.2 按键功能程序

    按键模块承担了改变温度设定值的输入渠道的任务。按键控制的程序如下所示。

void key()

{

    if(key1==0){moshi=1;if(moshi==0)moshi=1;beerc();while(key1==0);}

if(moshi==1)

{

if(key2==0){if(wendux<100)wendux=wendux+1;while(key2==0);}

if(key3==0){if(wendux>(-50))  wendux=wendux-1;while(key3==0);}

              }

if(key4==0){moshi=0;while(key4==0);}

按键控制程序中分别定义了四颗按键构成了设定温度值的逻辑。Key1作为设定键,Key2作为温度加键,Key3作为温度减键,Key4作为确定键。首先我定义了系统的两个工作模式,以moshi作为控制参数,当moshi=0时为温度显示模式,当moshi=1时进入温度设置模式。当按下设定键后蜂鸣器会发出滴的响声提醒用户进入了设定模式,同时设定温度后面也会显示符号在视觉上提醒用户已进入设定模式。进入温度设定模式后按下温度加键可以增加温度设定值,按下温度减键可以减小温度设定值。当按下确定键后系统将退出温度设置模式返回温度显示模式。

4.2.3 温度检测程序

温度检测的硬件模块由DS18B20构成。下面是对应传感器的模块程序。

//传感器的数据线
sbit DQ=P1^0;
uchar z1;
//延时函数
void delay3(unsigned int i)
{
while(i--);
}
//初始化                                 
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
delay3(8);  //稍做延时
DQ = 0;    //单片机将DQ拉低
delay3(80); //精确延时 大于 480us
DQ = 1;    //拉高总线
delay3(10);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay3(5);
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay3(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay3(5);
DQ = 1;
dat>>=1;
}
delay3(5);
}
//读取温度
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay3(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
b<<=8;
t=a+b;
return(t);
}   
//数据处理
void   readds18()
{
unsigned  int  y=0;
unsigned  long x=0;
y=ReadTemperature();
if(!(y&0xf000))
{
z1=0;
x=y;
x=x*625/10000;
wendu1=x;
}
if(y&0xf000)
{
z1=1;
y=-y;
x=y;
x=x*625/10000;
wendu1=0-x;
}
}

4.2.4 温度数据处理程序

在4.2.1小节中介绍了LCD液晶将单片机处理后的温度数据显示出来的程序模块。下面的程序段就是单片机对四路温度值处理的过程。

  if(x==0)              {readds18(); wendu1=wendu1; }
  if(x==1)              {readds182();wendu2=wendu2; wendua1=(wendu1+wendu2)/2;}
  if(x==2)              {readds183();wendu3=wendu3; }
  if(x==3)              {readds184();wendu4=wendu4; wendua2=(wendu3+wendu4)/2;}
  x=(x+1)%4;

此段程序依次读取四个温度传感器所采集到的温度,然后使用了两个循环分别求得每一组温度传感器测得温度的均值,再次进行处理后将平均温度送至LCD液晶模块作为两个回路的实时温度进行显示。温度求均值的这一步骤使整个系统对温度的测量更为准确,进而提升了对温度的控制品质,地板的温度更加精确。

4.2.5 温度越限/故障报警程序

如下所示的程序段为温度超限/故障报警程序。

if(moshi==0)

{
if(wendua1<=(wendux-3)){r1=0;bz1=1;}else {r1=1;bz1=0;}
if((wendua1<=(wendux-5))||(wendua1>=(wendux+5)))led1=0;else led1=1;

    if(wendua2<=(wendux-3)){r2=0;bz2=1;}else {r2=1;bz2=0;}
if((wendua2<=(wendux-5))||(wendua2>=(wendux+5)))led2=0;else led2=1;
if(  (wendua1<=(wendux-5))||(wendua1>=(wendux+5)) ||(wendua2<=(wendux-5))||(wendua2>=(wendux+5)) ){beerc();}
}
  if(moshi==1)
{
    led1=1;
    led2=1;
    r1=1;
    r2=1;
  }

其中l1为第一个加热回路的报警LED,r1为第一个加热回路的加热电缆,bz为系统的报警蜂鸣器。l2、r2属于第二个加热回路,其功能与上文所述第一个加热回路中的定义相同。当系统处于预热阶段时报警程序不起作用。报警程序仅在系统处于恒温模式下有效。该程序的主要功能是将计算得到的两路温度均值与设定值进行比较,进而采取对应的动作。两个测温回路的报警功能彼此独立。以第一个加热回路为例,当T1<=T0-3时,r1接通对第一个加热回路进行加热;当T1<=T0-5或者T1>=T0+5时判定系统为故障,此时l1亮起,bz响起进行报警,当T1>=T0+5时也会断开r1以防止温度过高,进而发生危险。


第5章 系统调试与仿真5.1 仿真软件

本次仿真使用Proteus7软件对系统的硬件电路进行搭建与仿真过程,使用Keil uVision4软件对设计所需的程序进行编写与测试,最终生成hex文件供单片机执行。

5.2 测试过程

1.将编写的系统程序在Keil uVision4中进行测试,能否正常编译

2.在Proteus7软件中仿真过程中LCD液晶屏是否能够正常显示实时的两路温度平均值T1、T2以及设定值T0。

3.通过按键是否能够设置加热温度的设定值。

4.通过手动改变温度传感器的温度,观察LCD液晶屏是否能够实时显示T1、T2的温度值。

5.测试在系统刚刚开机进入预加热模式后改变温度传感器温度,测试自动加热功能和跳出功能能否实现。

6.手动模拟操控完成预加热模式,在系统进入恒温模式后改变温度传感器温度,测试上下限报警功能和自动加热功能能否实现。

5.3 测试结果

本设计的目标主要是要实现双路平均温度的测量与显示、双路加热回路的温度自动控制、温度越限故障报警的功能。经测试编写的系统程序成功通过Keil uVision4软件的编译。

系统开机后自动进入预热模式。观察LCD显示器可以发现T1、T2和T0均正常显示。手动操作温度传感器模拟南方地区在冬季的室内温度情况,此时T1=T2=17°C,低于恒温模式的最低报警温度值,可以看到系统没有报警,继电器闭合加热电缆R1、R2自动开始预加热过程。在proteus中的仿真结果如图5-1所示。接下来模拟当地板温度已经达到设定值的情况,这种情况有可能发生在用户在使用一段时间系统后再次打开的情况。此时系统开机后自动跳过预热模式进入恒温加热模式,并且没有进行加热,测试成功。


图5-1 预加热过程

手动操作温度传感器使T1、T2达到设定值,系统进入恒温加热模式。此时首先将温度手动降低,使T1=20°C,模拟加热电缆故障不能正常加热的状态,可以看到故障指示灯LED1亮起,同时蜂鸣器发出报警,测试成功。如图5-2所示。

图5-2 恒温模式触发下限报警

在恒温加热模式下,手动调节温度,模拟系统或者电缆故障导致温度越过上限的情况。使T2=35°C,可以看到第二条加热回路在超过上限的同时被切断,故障指示灯LED2亮起,同时蜂鸣器发出报警,测试成功。如图5-3所示。

图5-3 恒温模式触发上限报警

第6章 结论与展望

本次设计使用单片机作为核心控制元件,使用C语言进行编程,完成了课题各方面的控制要求。本电热地暖的控制系统使用四路传感器对室内温度进行采集,采用STC89C52单片机作为核心对采集的数据进行处理,控制外围电路的自动开闭,进而实现室内温度的智能控制。系统具有的报警功能能够使用户及时得知系统的故障所在,及时进行维护,避免事故的发生。系统的整个设计从用户的易用性与智能化进行考量,多点测温的设计更好地反映了室内不同位置的温度,采用了分区域测量温度的方法,使整个温度的控制过程更加精确,进而给用户带来更好的体验。

因为本系统为初步仿真,在实际应用于采暖方案时要充分考虑房间的构造和用户对采暖的要求,对设计进行适当的调整与增强。加热电缆的铺设要根据情况选择合适的铺设方式。根据房间的大小和布局增加温度传感器的数量和加热区域的数量,实现一个更为精密的温度控制过程。当然本系统在简易调整后也可以直接应用于多房间单控制器的温度控制,整合的控制面板不仅降低了系统成本,也方便了用户的使用。

在系统的设计过程中,我首先对电热地暖工程进行了一个初步的调查,了解了加热的原理和具体的安装模式。根据这些我模拟出了一个应用的具体环境,采用了思考在整个温度控制环节中所有可能遇到的问题,最后提出解决的方法的设计思路。

51型单片机作为单片机家族中最为经典的一款在各大教材中被广泛介绍,学习它是每个单片机初学者的必经之路。在设计整个系统的过程中,开始的时候我走了不少弯路,因为急于求成,设计出的程序与期望的功能产生了很大的出入。在分析错误的过程中我逐渐地冷静了下来,发现有很多知识并没有完全理解。于是我借阅了单片机开发的教程从头一步步地进行了系统的复习,理解了很多过去忽略的知识点。特别是刚开始我对程序的书写比较凌乱,这直接导致了多次程序编译的失败。在系统的学习之后我静下心来根据系统的结构从头重新编写了程序,解决了之前的问题。在智能化家居已经成为热点的今天我设计的这个系统可能显得微不足道,但是通过本次毕业设计我深深体验到了单片机开发过程中的乐趣,理解到严谨的态度对一个设计的重要性。通过本次设计我体验了一个产品开发的流程,掌握了51单片机的基本设计方法,也对设计过程中所涉及到的外围电路的功能与设计有了深刻的了解,积累了重要的经验。

致谢

经过大四学年的努力,至此我的毕业设计终于完成了。我的指导导师徐进老师在设计的过程之中给予了我重要的帮助。每当我遇到设计中的问题时徐老师都会不留余力地来和我探讨解决思路。当我们向徐老师寻求帮助时他往往引领我们去剖析问题,教给了我们思考的方法,然后提供一个解决思路让我们能够自由地发挥。每次和徐老师请教之后我都能获得新的启发与思考。和徐老师一同探讨的过程中我不仅学到了重要的知识,更培养了良好的思考方式。徐老师严谨的思考方式,求真务实的态度深深地影响了我,同时也教会了我为人处世的道理。在我的设计过程中遇到了许许多多的问题,在徐老师的悉心指导下我逐一解决了这些问题,熟练掌握了设计中各方面的知识。通过本次设计,我认为我最大的收获就是面对问题时我们要踏踏实实地去面对,认真的态度才能决定一切。

同时我也要感谢在程序编写过程中帮助过我的同学。感谢四年来所有指导过我的任课老师,每位老师都十分用心地教会了我专业方面的知识,教会了我如何学习,教会了我如何做人。

参考文献

[1]兰羽,万可顺.基于AT89C51的无线温度采集系统设计[J].国外电子测量技术,2013,06
[2]程世田,李娟,于艳,郭亭亭.基于单片机与工控软件的多点测温系统研发[J].共有人仪表与自动化装置,2014,01
[3]周甦旸.基于单片机的温度采集系统的研究分析[J].信息通信,2014,04
[4]胡同花,周维龙.温室大棚多点温度采集系统的设计与实现[J].电子设计工程,2014,13
[5]胡军.基于无线传输多点温度采集系统的设计探讨[J].通信电源技术,2014,04
[6]张克.一种基于单片机的高精度无线温度采集系统[j].工业加热,201,03
[7]杨丹丹,杨风,马慧卿.基于单片机的温度采集系统设计[J].山西电子技术,2014.03
[8]张锐,沈大伟,马铁华,吕鹏飞.基于单片机多回路温度采集系统设计[J].电子世界,2014,09
[9]杨振东.多点远程温度采集系统[J].黑龙江科技信息,2014,03
[10]顾涵,吴晓婷,李天福,张俊龙.基于51单片机的小型温度采集系统设计[J].科技传播,2013,10
[11] Zhang H F,Zhao A L,Hou J. Design of fumigation temperature control system based on single-chip microcontroller. Physics Procedia,2011,11: 246-250
[12] Marty Hall,Larry Brown著,赵学良译. Servlet与JSP核心编程(第2版)[M]. 北
京:清华大学出版社,2004.
[13] 张萌,和湘,姜斌.《单片机应用系统开发综合实例》.清华大学出版社,2007.7
[14] 孙育才,王荣兴,孙华芳.《ATMEL新型AT89S52系列单片机及其应用》.清华大学出版
社,2005.1
[15] 程启明,黄云峰,徐进,赵永熹. 基于汇编与C语言的单片机原理及应用[M]. 北京:
中国水利水电出版社,2012.10.
[16] DS18B20中文手册


附录附录一 :系统硬件仿真电路及原理图如下


附录二 :源程序如下
  1. /*********************主程序***********************/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #include <math.h>
  5. #define uchar   unsigned char
  6. #define uint    unsigned int
  7. uchar code zifux[] ="0123456789abcdef";
  8. uchar code zifu0[]="T1: 000^ T2: 000^";
  9. uchar code zifu1[]="   SET: 000^     ";
  10. #include "1602.H"
  11. int  wendua1=0;            
  12. int  wendua2=0;            
  13. int  wendu1=0;
  14. int  wendu2=0;
  15. int  wendu3=0;
  16. int  wendu4=0;
  17. #include "ds18.h"
  18. #include "ds182.h"
  19. #include "ds183.h"
  20. #include "ds184.h"
  21. sbit key1=P3^3;
  22. sbit key2=P3^4;
  23. sbit key3=P3^5;
  24. sbit key4=P3^6;            
  25. sbit key5=P3^7;            
  26. sbit led1=P1^4;
  27. sbit led2=P1^5;            
  28. sbit led3=P1^6;
  29. sbit led4=P1^7;            
  30. uchar bz1=0;
  31. uchar bz2=0;
  32. uchar bz3=0;
  33. uchar bz4=0;
  34. uint  moshi=0;            
  35. uchar x=0;
  36. int  wendux=28;  
  37. sbit  beer=P2^0;            
  38. void beerc()
  39. {
  40.   beer=0;_delay_ms(70);beer=1;_delay_ms(50);
  41. }
  42. void dis()
  43. {
  44.   if(x==0)              {readds18(); wendu1=wendu1; }
  45.   if(x==1)              {readds182();wendu2=wendu2; wendua1=(wendu1+wendu2)/2;}
  46.   if(x==2)              {readds183();wendu3=wendu3; }
  47.   if(x==3)              {readds184();wendu4=wendu4; wendua2=(wendu3+wendu4)/2;}
  48.   x=(x+1)%4;
  49.     lcd1602_adr(0x02);
  50.     if(wendua1>=0)
  51.      {
  52.                  lcd1602_writenumber('+');
  53.                  lcd1602_writenumber(0x30+wendua1%1000/100);
  54.                  lcd1602_writenumber(0x30+wendua1%100/10);
  55.                  lcd1602_writenumber(0x30+wendua1%10);
  56.                  lcd1602_writenumber(0xdf);
  57.      }
  58.    if(wendua1<0)
  59.      {
  60.                  lcd1602_writenumber('-');
  61.                  lcd1602_writenumber(0x30+(0-wendua1)%1000/100);
  62.                  lcd1602_writenumber(0x30+(0-wendua1)%100/10);
  63.                  lcd1602_writenumber(0x30+(0-wendua1)%10);
  64.                  lcd1602_writenumber(0xdf);
  65.      }
  66.     lcd1602_adr(0x0b);
  67.     if(wendua2>=0)
  68.      {
  69.                  lcd1602_writenumber('+');
  70.                  lcd1602_writenumber(0x30+wendua2%1000/100);
  71.                  lcd1602_writenumber(0x30+wendua2%100/10);
  72.                  lcd1602_writenumber(0x30+wendua2%10);
  73.                  lcd1602_writenumber(0xdf);
  74.      }

  75.    if(wendua2<0)

  76.      {

  77.                  lcd1602_writenumber('-');

  78.                  lcd1602_writenumber(0x30+(0-wendua2)%1000/100);

  79.                  lcd1602_writenumber(0x30+(0-wendua2)%100/10);

  80.                  lcd1602_writenumber(0x30+(0-wendua2)%10);

  81.                  lcd1602_writenumber(0xdf);

  82.      }

  83.     lcd1602_adr(0x46);

  84.     if(wendux>=0)

  85.      {

  86.                  lcd1602_writenumber('+');

  87.                  lcd1602_writenumber(0x30+wendux%1000/100);

  88.                  lcd1602_writenumber(0x30+wendux%100/10);

  89.                  lcd1602_writenumber(0x30+wendux%10);

  90.                  lcd1602_writenumber(0xdf);

  91.      }

  92.    if(wendux<0)

  93.      {

  94.                  lcd1602_writenumber(0x30+(0-wendux)%1000/100);

  95.                  lcd1602_writenumber(0x30+(0-wendux)%100/10);

  96.                  lcd1602_writenumber(0x30+(0-wendux)%10);

  97.                  lcd1602_writenumber(0xdf);

  98.      }

  99.     if(moshi==0) lcd1602_writenumber(' ');

  100.     if(moshi==1) lcd1602_writenumber('<');

  101. }

  102. void ct()

  103. {

  104.   //------------------------

  105.   if(moshi==0)

  106.   {

  107.     if(wendua1<=(wendux-3)){led3=0;bz1=1;}else {led3=1;bz1=0;}

  108.     if((wendua1<=(wendux-5))||(wendua1>=(wendux+5)))led1=0;else led1=1;

  109.     if(wendua2<=(wendux-3)){led4=0;bz2=1;}else {led4=1;bz2=0;}

  110.     if((wendua2<=(wendux-5))||(wendua2>=(wendux+5)))led2=0;else led2=1;

  111.     if(  (wendua1<=(wendux-5))||(wendua1>=(wendux+5)) ||(wendua2<=(wendux-5))||(wendua2>=(wendux+5)) ){beerc();}



  112.   }

  113.   //------------------------

  114.   if(moshi==1)

  115.   {

  116.     led1=1;

  117.     led2=1;

  118.     led3=1;

  119.     led4=1;

  120.   }

  121. }

  122. void key()

  123. {

  124.     if(key1==0){moshi=1;if(moshi==0)moshi=1;beerc();while(key1==0);}

  125.               if(moshi==1)

  126.               {

  127.      if(key2==0){if(wendux<100)wendux=wendux+1;while(key2==0);}

  128.      if(key3==0){if(wendux>(-50))  wendux=wendux-1;while(key3==0);}

  129.               }

  130.     if(key4==0){moshi=0;while(key4==0);}

  131. }

  132. void main()

  133. {

  134.     lcd1602_init();

  135.     LCD1602_string(1,1,zifu0);

  136.     LCD1602_string(1,1,zifu0);

  137.     LCD1602_string(2,1,zifu1);

  138.               readds18();readds182();readds183();readds184();_delay_ms(500);

  139.               readds18();readds182();readds183();readds184();_delay_ms(500);

  140.               readds18();readds182();readds183();readds184();_delay_ms(200);

  141.               readds18();readds182();readds183();readds184();_delay_ms(200);

  142.               readds18();readds182();readds183();readds184();_delay_ms(200);

  143.               readds18();readds182();readds183();readds184();_delay_ms(200);

  144.               readds18();readds182();readds183();readds184();_delay_ms(200);



  145.               wendua1=(wendu1+wendu2)/2;

  146.               wendua2=(wendu3+wendu4)/2;

  147.               dis();

  148.               if(wendua1<=(wendux))led3=0;

  149.               if(wendua2<=(wendux))led4=0;

  150.               while((wendua1<=(wendux))||(wendua2<=(wendux)))

  151.               {

  152.               dis();               

  153.               if(wendua1<=(wendux))led3=0;  else               led3=1;

  154.               if(wendua2<=(wendux))led4=0; else               led4=1;

  155.               }

  156.               while (1)

  157.               {

  158.               dis();

  159.               ct();            

  160.               key();

  161.               }

  162. }

  163. /*********************液晶显示***********************/

  164. sbit  RS=P2^6;            

  165. sbit  E=P2^7;  

  166. #define e1   E=1

  167. #define rs1  RS=1

  168. #define e0   E=0  

  169. #define rs0  RS=0

  170. #define PP P0            

  171. void _delay_ms(uint i)

  172. {

  173.   uchar j;

  174.   for(;i>0;i--)

  175.   {

  176.    for(j=0;j<120;j++);

  177.   }

  178. }

  179. void _delay_us(uchar t)

  180. {

  181.    while(t>0)t--;

  182. }

  183. void  lcd1602_writecrtl(uchar  dat)

  184. {

  185.   _delay_us(5);

  186.   PP=dat;

  187.   e1;

  188.   _delay_us(5);

  189.   e0;

  190. }

  191. void  lcd1602_writenumber(uchar dat)

  192. {

  193.   rs1;

  194.   _delay_us(5);

  195.   PP=dat;

  196.   e1;

  197.   _delay_us(5);

  198.   e0;

  199. }

  200. void  lcd1602_init()

  201. {

  202.   lcd1602_writecrtl(0x38);

  203.   lcd1602_writecrtl(0x06);

  204.   lcd1602_writecrtl(0x0c);

  205.   lcd1602_writecrtl(0x01);

  206. }

  207. void  lcd1602_adr(uchar dat)

  208. {

  209.   lcd1602_writecrtl(0x80 | dat);

  210. }

  211. void LCD1602_string(uchar hang,uchar lie,uchar const *p)

  212. {

  213.               uchar a;

  214.               if(hang == 1) a = 0x00;            

  215.               if(hang == 2) a = 0x40;            

  216.               a = a + lie - 1;

  217.               lcd1602_adr(a);            

  218.               while(1)

  219.               {

  220.                             if(*p == '\0') break;

  221.                             lcd1602_writenumber(*p);

  222.                             p++;

  223.               }

  224. }

  225. /*********************DS18B20***********************/

  226. /***共四路DS18B20,程序仅数据线不同,故此处仅展示一路程序***/

  227. sbit DQ=P1^0;

  228. uchar z1;

  229. void delay3(unsigned int i)

  230. {

  231. while(i--);

  232. }                                 

  233. void Init_DS18B20(void)

  234. {

  235. unsigned char x=0;

  236. DQ = 1;   

  237. delay3(8);

  238. DQ = 0;   

  239. delay3(80);

  240. DQ = 1;  

  241. delay3(10);

  242. x=DQ;      

  243. delay3(5);

  244. }

  245. unsigned char ReadOneChar(void)

  246. {

  247. unsigned char i=0;

  248. unsigned char dat = 0;

  249. for (i=8;i>0;i--)

  250. {

  251.   DQ = 0;

  252.   dat>>=1;

  253.   DQ = 1;

  254.   if(DQ)

  255.    dat|=0x80;

  256.   delay3(5);

  257. }

  258. return(dat);

  259. }

  260. void WriteOneChar(unsigned char dat)

  261. {

  262. unsigned char i=0;

  263. for (i=8; i>0; i--)

  264. {

  265.   DQ = 0;

  266.   DQ = dat&0x01;

  267.   delay3(5);

  268.   DQ = 1;

  269.   dat>>=1;

  270. }

  271. delay3(5);

  272. }

  273. unsigned int ReadTemperature(void)

  274. {

  275.               unsigned char a=0;

  276.               unsigned int b=0;

  277.               unsigned int t=0;

  278.               Init_DS18B20();

  279.               WriteOneChar(0xCC);

  280.               WriteOneChar(0x44);

  281.               delay3(10);

  282.               Init_DS18B20();

  283.               WriteOneChar(0xCC);
  284. ……………………

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

完整的Word格式文档51黑下载地址:
论文.docx (554.35 KB, 下载次数: 62)


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

使用道具 举报

沙发
ID:738823 发表于 2020-4-29 10:58 | 只看该作者
你这个不全啊   没有头文件
回复

使用道具 举报

板凳
ID:738823 发表于 2020-4-29 11:03 | 只看该作者
可不可以把全部的程序放出来啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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