基于单片机的室内电热水器控
制系统设计
作者姓名:2B
专业名称:测控技术与仪器
指导教师:2B 讲师
基于单片机的室内电热水器控制系统设计
摘要
随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC89C51单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STC89C51单片机最小系统,测温电路、实时时钟电路、LED液晶显示电路以及通讯模块电路等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LED显示程序以及数据存储程序等。
关键词:STC89C51,单片机, DS18B20, 显示电路
- I -
基于单片机的室内电热水器控制系统设计
Abstract
Along with the computer measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature in life level of control. This design STC89C51 describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design related hardware circuit and related applications. STC89C51 microcontroller hardware circuit include temperature detection circuit smallest system, and real-time clock circuit, LED display circuit, communication module circuit, etc. System programming mainly include main program, read temperature subroutine, the calculation of temperature subroutines, key processing procedures, LED display procedures and data storage procedures, etc.
Keywords:STC89C51,icrocontroller,DS18B20,display circuit
- II -
基于单片机的室内电热水器控制系统设计
目录
摘要 ------------------------------------------------------------------------------------------ I Abstract ------------------------------------------------------------------------------------ II 目录 ------------------------------------------------------------------------------------------ III 前言 ------------------------------------------------------------------------------------------ 1 1片机及设计软件介绍 ------------------------------------------------------------------- 2 1.1单片机介绍 -------------------------------------------------------------------------- 2 1.2 Proteus 软件介绍 ----------------------------------------------------------------- 8 1.3单片机编译软件Keil介绍 -------------------------------------------------------- 10 2 方案设计 --------------------------------------------------------------------------------- 12 2.1功能介绍 ----------------------------------------------------------------------------- 12 2.1.1 AT89C51 主要性能 -------------------------------------------------------- 12 2.1.2数字温度传感器 ------------------------------------------------------------- 12 2.2系统方案论证 ----------------------------------------------------------------------- 16 2.2.1方案一 ------------------------------------------------------------------------- 16 2.2.2方案二 ------------------------------------------------------------------------- 18 3系统硬件设计 ---------------------------------------------------------------------------- 19 3.1设计要求 ----------------------------------------------------------------------------- 19 3.2系统整体硬件电路 ----------------------------------------------------------------- 19 3.2.1主板电路 ---------------------------------------------------------------------- 20 3.2.2显示部分 ---------------------------------------------------------------------- 20 3.2.3手动开关复位部分 ---------------------------------------------------------- 21 3.2.4按键部分 ---------------------------------------------------------------------- 21 3.2.5加热部分 ---------------------------------------------------------------------- 23 3.2.6温度传感电路设计 ---------------------------------------------------------- 24 3.2.7温度控制电路的设计 ------------------------------------------------------- 26
- III -
基于单片机的室内电热水器控制系统设计
3.2.8时钟电路 ---------------------------------------------------------------------- 26 4系统软件设计 ---------------------------------------------------------------------------- 28 4.1主程序 -------------------------------------------------------------------------------- 28 4.2显示数据刷新子程序 -------------------------------------------------------------- 28 图4.2 数据刷新子程序 ------------------------------------------------------------------ 29 4.3键盘扫描 ----------------------------------------------------------------------------- 29 4.4定时器 -------------------------------------------------------------------------------- 30 总结 ------------------------------------------------------------------------------------------ 32 致谢 ------------------------------------------------------------------------------------------ 33 参考文献 ------------------------------------------------------------------------------------ 34 附件1 系统电路原理图 ------------------------------------------------------------------ 36 附录2源程序 ------------------------------------------------------------------------------- 37
- IV -
基于单片机的室内电热水器控制系统设计
前言
课题背景和意义:随着人们生活水平的提高,热水器越来越受到人们的青睐。由于燃气热水器易受水压限制,而且安全性较差。每年使用燃气热水器造成的爆炸、中毒等事故也屡有所闻。消费者对燃气热水器怀有一定的惧怕感。而电热水器越来越受到人们的认可。采用MCS-51单片机对热水器水温进行控制,具有控制方便、组态简单和灵活性大等优点。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,为自动化和各个测控领域中广泛应用的器件。
国内外研究现状:电热水器在中国的历史已经有10多年了,期间也经历了数次起落的过程,在上个世纪的最后几年,随着国外品牌的进入和国内一些大家电厂的目光转向电热水器,储水式电热水器能适应任何天气变化,普通家庭可直接安装使用,长时间通电可以大流量供热水。使用时不产生废气,既安全又卫生。目前市场上销售的电热水器多数还带有防触电装置。干净卫生,不必分室安装,调温方便。随着技术的成熟,今后将朝着保温层整体发泡技术、温控器置入内胆、加热管下潜式设计、节能免更换几个方面发展。
热水器是一种可供浴室,洗手间及厨房使用的家用电器。据国务院发展研究中心市场经济研究所统计数据表明:近年来我国热水器的销量每年以 25%的速度上升,在未来五年内,销售额每年可达近500亿以上。众所周知,燃气热水器因其安全隐患及越来越高的使用成本正渐渐淡出热水器市场,而太阳能热水器也因其严格受天气气候及安装条件影响而很难占据更大的市场份额,所以电热水器迅速崛起而不断壮大。为了满足人们对现代电器的智能化的要求,利用目前电子技术的最新成果改善电热水器的性能已经完全可能和必要。本课题将以单片机为控制核心,实现对热水器的自动控制,设计出一款具有自动化、智能化、易于操作、控制精度高、性价比高的电热水器控制系统。
-1-
基于单片机的室内电热水器控制系统设计
1片机及设计软件介绍
1.1单片机介绍
由于单片机在整个设计中占据着重要的地方,首先介绍一下单片机的相关知识。单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要。
MCS-51单片机内部结构:8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM):8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
图1.1 8051 内部结构
程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户
-2-
基于单片机的室内电热水器控制系统设计
程序,原始数据或表格。
定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口:8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。
全双工串行口:8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
时钟电路:8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
下图是MCS-51系列单片机的内部结构示意图
图1.2 MCS-51结构框图
-3-
基于单片机的室内电热水器控制系统设计
MCS-51的引脚说明:MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明.
MCS-51的引脚说明:MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
图1.3 51单片机引脚图
Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8051的初始态。
8051的复位方式可以是自动复位,也可以是手动复位,见下图。此外,RESET/Vpd还是一复用脚,Vcc掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
-4-
基于单片机的室内电热水器控制系统设计
图1.4 复位电路图
Pin30:ALE/当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
Pin29:当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。
输入/输出(I/O)引脚,P0口、P1口、P2口及P3口,P0口(39脚~22脚)P0.0~P0.7统称为P0口。当不接外部存储器与不扩展I/O接口时,它可作为准双向8位输入/输出接口。当接有外部程序存储器或扩展I/O口时,P0口为地址/数据分时复用口。它分时提供8位双向数
-5-
基于单片机的室内电热水器控制系统设计
据总线。对于片内含有EPROM的单片机,当EPROM编程时,从P0口输入指令字节,而当检验程序时,则输出指令字节。
P1口(1脚~8脚):P1.0~P1.7统称为P1口,可作为准双向I/O接口使用。对于MCS—52子系列单片机,P1.0和P1.1还有第2功能:P1.0口用作定时器/计数器2的计数脉冲输入端T2;P1.1用作定时器/计数器2的外部控制端T2EX。对于EPROM编程和进行程序校验时,P0口接收输入的低8位地址。
P2口(21脚~28脚):P2.0~P2.7统称为P2口,一般可作为准双向I/O接口。当接有外部程序存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用于高8位地址总线送出高8位地址。对于EPROM编程和进行程序校验时,P2口接收输入的8位地址。
P3口(10脚~17脚):P3.0~P3.7统称为P3口。它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可独立定义为第1功能的输入输出或第2功能。P3口的第2功能见下表
表1.1 单片机P3.0管脚含义
引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第2功能 RXD(串行口输入端0) TXD(串行口输出端) INT0(部中断0请求输入端,低电平有效) INT1(中断1请求输入端,低电平有效) T0(时器/计数器0计数脉冲端) T1(时器/计数器1数脉冲端) WR(部数据存储器写选通信号输出端,低电平有效) RD(部数据存储器读选通信号输出端,低电平有效) 综上所述,MCS—51系列单片机的引脚作用可归纳为以下两点:单片机功能多,引脚数少,因而许多引脚具有第2功能;单片机对外呈3总线形式,由P2、P0口组成16位地址总线;由P0口分时复用作为数据总线。
温度传感器电路,采用一线制数字温度传感器DS18B20来作为本课
-6-
基于单片机的室内电热水器控制系统设计
题的温度传感器。传感器输出信号进4.7K的上拉电阻直接接到单片机的P1.0引脚上。
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:
系统的特性:测温范围为-55℃~+125℃ ,测温精度为士0.5℃;温度转换精度9~12位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。
系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。
系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。
系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。
DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。
在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,其接口电路如图1.5所示。
-7-
基于单片机的室内电热水器控制系统设计
图1.5温度传感器接口
1.2 Proteus 软件介绍
Proteus是目前最好的模拟单片机外围器件的工具,真的很不错。可以仿真51 系列、AVR,PIC 等常用的MCU 及其外围电路(如LCD,RAM,ROM,键盘,马达,LED,AD/DA,部分SPI 器件,部分IIC 器件,...) 其实proteus 与 multisim比较类似,只不过它可以仿真MCU!当然,软件仿真精度有限,而且不可能所有的器件都找得到相应的仿真模型,用开发板和仿真器当然是最好选择,可是估计初学者有的可能性比较小吧?如果你在学51 单片机,如果你想自己动手做做LCD,LED,AD/DA,直流马达,SPI,IIC,键盘,...的小实验的话,试一下吧,不会让你失望的!用51不管你是用汇编或是C编程当然要用keil啦,uvisoin3有不少新特性呢!使用keilc51v7.50+proteus6.7可以像使用仿真器一样调试程序,一般而言,微机实验中用万利仿真器+电工系自己做的实验板的实验都可以做得到吧!当然,硬件实践还是必不可少的!
本方案只是在没有硬件的情况下让你能像pspice仿真模拟/数字电路那样仿真MCU 及外围电路。另外,即使有硬件,在程序编写早期用软件仿真一下也不错的!
Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU 的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行
-8-
基于单片机的室内电热水器控制系统设计
时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。
proteus 的工作过程 运行proteus 的ISIS 程序后,进入该仿真软件的主界面。在工作前,要设置view 菜单下的捕捉对齐和system下的颜色、图形界面大小等项目。通过工具栏中的p(从库中选择元件命令)命令,在pick devices 窗口中选择电路所需的元件,放置元件并调整其相对位置,元件参数设置,元器件间连线,编写程序;在source 菜单的Definecode generation tools 菜单命令下,选择程序编译的工具、路径、扩展名等项目;在source 菜单的Add/removesource files 命令下,加入单片机硬件电路的对应程序;通过debug 菜单的相应命令仿真程序和电路的运行情况。Proteus软件所提供的元件资源Proteus 软件所提供了30 多个元件库,数千种元件。元件涉及到数字和模拟、交流和直流等。
软件所提供的仪表资源,对于一个仿真软件或实验室,测试的仪器仪表的数量、类型和质量,是衡量实验室是否合格的一个关键因素。在Proteus 软件包中,不存在同类仪表使用数量的问题。Proteus 还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。
软件所提供的调试手段Proteus提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。对于单片机硬件电路和软件的调试,Proteus 提供了两种方法:一种是系统总体执行效果,一种是对软件的分步调试以看具体的执行情况。
对于总体执行效果的调试方法,只需要执行debug菜单下的execute菜单项或F12快捷键启动执行,用debug菜单下的pause animation菜单项或pause键暂停系统的运行;或用debug 菜单下的stop animation菜单项或shift-break组合键停止系统的运行。其运行方式也可以选择工具栏中的相应工具进行。
对于软件的分步调试,应先执行debug 菜单下的start/restart debugging 菜单项命令,此时可以选择stepover 、step into 和 step out 命令执行程序(可以用快捷键F10、F11 和ctrl+F11),执行的效果是单句执行、进入子程序执行和跳出子程序执行。在执行了start / restart debuging 命令后,在debug 菜单
-9-
基于单片机的室内电热水器控制系统设计
的下面要出现仿真中所涉及到的软件列表和单片机的系统资源等,可供调试时分析和查看。
Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
1.3单片机编译软件Keil介绍
编写完程序后即可使用汇编软件对程序进行编译了,本设计所使用的编译软件是Keil51,其步骤如下:
源文件的建立:使用菜单“File->New”或者点击工具栏的新建文件按钮,即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入要调试的汇编语言源程序,保存该文件,注意必须加上扩展名.c。
建立工程文件:点击“Project->New Project… ”菜单,在出现一个对话框中,输入一个工程文件名,不需要扩展名。点击“保存”按钮。
工程的详细设置:工程建立好以后,还要对工程进行进一步的设置,以满足要求。首先点击左边Project 窗口的Target 1,然后使用菜单“Project->Option for target ‘target1’”即出现对工程设置的对话框,对部分内容进行必要的设置改即可,不过大部份设置项都是取默认值。
编译、连接:在设置好工程后,即可进行编译、连接。选择菜单Project->Build target,对当前工程进行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码;如果选择
-10-
基于单片机的室内电热水器控制系统设计
Rebuild All target files 将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate … .项则仅对该文件进行编译,不进行连接。
-11-
基于单片机的室内电热水器控制系统设计
2 方案设计
2.1功能介绍
2.1.1 AT89C51 主要性能
与MCS-51 单片机产品兼容 ;8K 字节在系统可编程Flash 存储器;1000 次擦写周期;全静态操作:0Hz~33Hz ;三级加密程序存储器;32 个可编程I/O 口线;三个16 位定时器/计数器;八个中断源;全双工UART 串行通道;低功耗空闲和掉电模式;掉电后中断可唤醒;看门狗定时器;双数据指针;掉电标识符。 2.1.2数字温度传感器
DS18B20数字温度传感器概述;DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20产品的特点如下所示:只要求一个端口即可实现通信。在DS18B20中的每个器件上都有独一无二的序列号。实际应用中不需要外部任何元器件即可实现测温。测量温度范围在-55.C到+125.C之间。数字温度计的分辨率用户可以从9位到12位选择。
内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见图2.4,其引脚功能描述见表2.1。
表2.1 DS18B20详细引脚功能描述
序号 1 2 名称 GND DQ 引脚功能描述 地信号 数字输入输出引脚,开漏单总线接口引脚,当使用寄生电源时,可向电源提供电源 3 VDD 可选择的VDD引脚,当工作于寄生电源时,该引脚必须接地 DS18B20的内部结构:DS18B20的内部框图如图2.2所示。64位ROM存储器件独一无二的序列号。暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。暂存器还提供一字节的上线
-12-
基于单片机的室内电热水器控制系统设计
警报触发(TH)和下线警报触发(TL)寄存器(2和3字节),和一字节的配置寄存器(4字节),使用者可以通过配置寄存器来设置温度转换的精度。暂存器的5、6和7字节器件内部保留使用。第八字节含有循环冗余码(CRC )。
图2.1 DS18B20的内部框图
DS18B20加电后,处在空闲状态。要启动温度测量和模拟到数字的转换,处理器须向其发出Convert T [44h] 命令;转换完后,DS18B20回到空闲状态。温度数据是以带符号位的16-bit补码存储在温度寄存器中的,如图2.2所示:
图2.2温度寄存器格式
符号位说明温度是正值还是负值,正值时S=0,负值时S=1。表2.8
-13-
基于单片机的室内电热水器控制系统设计
给出了一些数字输出数据与对应的温度值的例子。
表2.2温度/数据的关系
温度 +125℃ +85℃ +20.062℃ +10.125℃ +0.5℃ 0℃ -0.5℃ -10.125℃ -25℃ -55℃ 输出(2进制) 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1110 1110 0110 1111 1111 1110 1001 0000 输出(16进制) 07D0H 0550H 0191H 00A2H 0008H 0000H FFF8H FF5EH EE6FH FE90H 访问DS18B20必须严格遵守这一命令序列,如果丢失任何一步或序列混乱,DS18B20都不会响应主机(除了Search ROM 和Alarm Search这两个命令,在这两个命令后,主机都必须返回到第一步)。
初始化:DS18B20所有的数据交换都由一个初始化序列开始。由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。
ROM命令:ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。DS18B20的ROM如表2.9所示,每个ROM命令都是8 bit长。
表2.3 DS18B20的ROM
指令 读ROM 符合ROM 协议 33H 55H 功能 读DS18B20中的编码(即64位地址) 发出此命令后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20,使之作出响应,为下一步对该-14-
基于单片机的室内电热水器控制系统设计 DS18B20的读写作准备 搜索ROM 0F0H 用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件作好准备 跳过ROM 0CCH 忽略64位ROM地址,直接向DS18B20V 温度转换命令,适用于单个DS18B20工作 告警搜索命0ECH 执行后,只有温度超过庙宇值上限或令 下限的片子才做出响应 温度转换 44H 启动DS18B20进行温度转换,转换时间最长为500ms(典型为200ms),结果丰入内部9字节RAM中 读暂存器 BEH 读内部RAM中9字节的内容 写暂存器 4EH 发出向内部RAM的第3、4字节写上、下温度数据命令,紧该温度命令之后,传达两字节的数据 复制暂存器 48H 将RAM中第3、4字内容复制到E2PROM中 重调E2PROM 0B8H 将E2PROM中内容恢复到RAM中的第3、4字节 读供电方式 0B4H 读DS18B20的供电模式,寄生供电时DS18B20发送“0”,外部供电时DS18B20发送“1” 功能命令:主机通过功能命令对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。
数码管工作原理:LED的发光原理,稍有电子技术基础的人士都很清楚,我们不想作过多的介绍,7段LED数码管,则在一定形状的绝缘材料上,利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。
图2.3 数码管引脚
-15-
基于单片机的室内电热水器控制系统设计
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。上图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将\"b\"和\"c\"段接上正电源,其它端接地或悬空,那么\"b\"和\"c\"段发光,此时,数码管显示将显示数字“1”。而将\"a\"、\"b\"、\"d\"、\"e\"和\"g\"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同。 2.2系统方案论证 2.2.1方案一
由于本设计的温度测温电路,可以使用热敏电阻Pt100其感温效应,Pt100温度传感器为正温度系数热敏电阻传感器,主要技术参数如下:测量范围:-200℃~+850℃;允许偏差值△℃:A级±(0.15+0.002│t│), B级±(0.30+0.005│t│);热响应时间 < 30s;最小置入深度:热电阻的最小置入深度≥200mm;允通电流 ≤ 5mA。另外,Pt100温度传感器还具有抗振动、稳定性好、准确度高、耐高压等
优点。 铂热电阻的线性较好,在0~100摄氏度之间变化时,最大非线性偏差小于0.5摄氏度。铂热电阻阻值与温度关系为
式中,A=0.00390802;B = -0.000000580;C = 0.0000000000042735。可见Pt100在常温0~100摄氏度之间变化时线性度非常好,其阻值表达式可近似简化为:RPt=100(1+At),当温度变化1摄氏度,Pt100阻值近似变化0.39欧。
下表2.4为Pt100在0℃~100℃的分度表。
-16-
基于单片机的室内电热水器控制系统设计
传感器电路包括传感器测量电桥和放大电路两部分,
图2.4传感器放大电路
R2、R3、R4和Pt100组成传感器测量电桥,为了保证电桥输出电压信号的稳定性,电桥的输入电压通过TL431稳至2.5V。从电桥获取的差分信号通过两级运放放大后输入单片机。电桥的一个桥臂采用可调电阻R3,通过调节R3可以调整输入到运放的差分电压信号大小,通常用于调整零点。
放大电路采用LM358集成运算放大器,为了防止单级放大倍数过高带来的非线性误差,放大电路采用两级放大,如图 1-2所示,前一级约为10倍,后一级约为3倍。温度在0~100度变化,当温度上升时,Pt100阻值变大,输入放大电路的差分信号变大,放大电路的输出电压Av对应升高。 这种设计需要用到A/D转换电路,感温电路比较麻烦。
-17-
基于单片机的室内电热水器控制系统设计
2.2.2方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器特性如下DS18B20是DALLAS公司生产的一线制数字温度传感器;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到一起,CPU只需一根数据线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统.
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二所示。
-18-
基于单片机的室内电热水器控制系统设计
3系统硬件设计
3.1设计要求
1.实时显示水温,范围为0~99℃可在20~80℃范围任意设定水温; 2.具有预约功能,24h 任意设定开机时间,可随时察看和校正系统时钟
3.具有LED 数码显示实时温度,进行设定操作时闪烁显示设定水温、时间,并有预约、保温/加热指示
4.超温断电保护并报警功能,出现漏电流故障时,迅速切断电源并提示报警功能
5.系统断电能保护设定数据 电路设计的硬件电路图如下:
图3.1系统设计硬件框图
3.2系统整体硬件电路
-19-
基于单片机的室内电热水器控制系统设计
3.2.1主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,控制电路,单片机主板电路等,如图所示
图3.2主板电路图
3.2.2显示部分
显示电路采用四位共阳LED数码管,利用7447驱动段、74HC138驱动位,通过软件编程实现数码显示。此方式简单方便。其电路图如下
-20-
基于单片机的室内电热水器控制系统设计
所示
图3.3显示部分电路图
3.2.3手动开关复位部分
复位电路虽然简单,但其作用非常重要。一个单片机系统能复正常运行,首先要检查是否能复位成功,其中手动复位开关比较常用,如图所示:
图3.4手动开关复位电路
手动开关未按下之前,电容正极处于充电状态,当按键按下去后,VCC与GND导通,电容放电,从而实现放电。 3.2.4按键部分
采用矩阵键盘方式输入设计键盘控制电路部分,其键盘结构图如下所示:
-21-
基于单片机的室内电热水器控制系统设计
图3.5 矩阵键盘连线图
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。
对照图3.5所示的4X4键盘,说明线反转个工作原理。
首先,辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。
判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。输入信号由八个小开关控制,当有键按下的时候,就产生了有效的输入信号,我使用了上
-22-
基于单片机的室内电热水器控制系统设计
拉电阻把输入信号先嵌位在高电平,为了理解起来容易,我下面将对上拉电阻进行简单介绍:上拉电阻就是把不确定的信号通过一个电阻钳位在高电平,此电阻还起到限流的作用。
那么在什么时候使用上拉电阻呢?总结如下:
1.当TTL电路驱动CMOS电路时,如果TTL电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2. OC门电路必须加上拉电阻,以提高输出的搞电平值。 3.为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4. 在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻降低输入阻抗,提供泄荷通路。
5.芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限,增强抗干扰能力。
6.提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7.长线传输中电阻不匹配容易引起反射波干扰,加上拉电阻使电阻匹配,有效的抑制反射波干扰[10]。
另外,上拉电阻阻值的选择原则包括:
1.从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2.从确保足够的驱动电流考虑应当足够小;电阻小,电流大。 3.对于高速电路,过大的上拉电阻可能边沿变平缓。
综合考虑以上三点,上拉电阻阻值通常在1k到10k之间选取。 根据以上原则,本设计所选择的是10K的电阻。 3.2.5加热部分
加热部分采用三极管控制继电器,通过继电器控制电热丝加热。此加热方式可以通过软件设计控制电热丝的加热时间。其电路原理如下所示:
-23-
基于单片机的室内电热水器控制系统设计
图3.6加热电路图
3.2.6温度传感电路设计
DS18B20的性能特点:采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位)测温范围为-55℃-+125℃,测量分辨率为0.0625℃,内含64位经过激光修正的只读存储器ROM,适配各种单片机或系统机,用户可分别设定各路温度的上、下限,内含寄生电源。
DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图3.7所示。
I/ODS18B201231234DS18B208765VCCNCNCNCGNDNCNCGNDI/OVCC
图3.7 DS18B20管脚图
在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻.我们采用的是第一种连接
-24-
基于单片机的室内电热水器控制系统设计
方法,如图3.7所示:把DS18B20的数据线与单片机的13管脚连接,再加上上拉电阻。
图3.8 温度传感电路图
DS18B20有六条控制命令,如表3.1所示: 指令 温度转换 读暂存器 写暂存器 复制暂存器 重新调E2RAM 读电源供电方式 约定代码 44H BEH 4EH 48H B8H B4H 操 作 说 明 启动DS18B20进行温度转换 读暂存器9个字节内容 将数据写入暂存器的TH、TL字节 把暂存器的TH、TL字节写到E2RAM中 把E2RAM中的TH、TL字节写到暂存器TH、TL字节 启动DS18B20发送电源供电方式的信号给主CPU CPU对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前
-25-
基于单片机的室内电热水器控制系统设计
都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。 3.2.7温度控制电路的设计
图 3.9 温度控制电路
实际电路如图3.9所示,通过键盘设定温度的上下限。把实际测量的温度和设定的上下限进行比较,来控制P0.0、P0.1、P0.7端口的高低电平。把P0.0、P0.1、P0.7端口分别与三极管的基极连接来控制温度和报警。当测量的温度超过了设定的最高温度,P2.2由高电平变成低电平,就相当于基极输入为“0”,这时三极管导通推动小风扇和控制电路工作,反之,当基极输入为“1”时,三极管不导通,报警器和控制电路都不工作。只要控制单片机的P0.0、P0.1、P0.7口的高低电平就可以控制模拟电路的工作。 3.2.8时钟电路
AT89S51单片机各功能部件的运行都以时钟控制信号为基准,有条不紊,一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统稳定性。常用的时钟电路有两种方式:内部时钟方式、外部时钟方式。如图3.10所示。
-26-
基于单片机的室内电热水器控制系统设计
图3.10 单片机的时钟电路
-27-
基于单片机的室内电热水器控制系统设计
4系统软件设计
4.1主程序
系统的软件主要是采用C语言,对单片机进行变成实现各项功能。主程序对模块进行初始化,而后调用读温度、处理温度、显示、键盘等模块。用的是循环查询方式,来显示和控制温度,主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值并负责调用各子程序,其程序流程如图4.1系统程序流程图。
图4.1主程序流程图
4.2显示数据刷新子程序
-28-
基于单片机的室内电热水器控制系统设计
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图4.2。
图4.2 数据刷新子程序
结束 温度数据移入显示寄存器 N
十位数0? Y 百位数0? Y 十位数显示符号百位数不显示 百位数显示数据(不显示符号) N
4.3键盘扫描
按键处理子程序主要是负责参数的设置,主程序每循环一次都要对按键进行扫描,判断是否有输入键按下则进行一系列的按键输入操作。其
-29-
基于单片机的室内电热水器控制系统设计
程序流程框图如图4.3所示。
图4.3键盘扫描处理程序流程图
4.4定时器
主程序对模块进行初始化,而后调用定时模块。用的是循环查询方式,来显示和控制定时,定时器主要功能是负责在加热前实现加热预定时,也可不定时,其程序流程如图4.4系统程序流程图。
-30-
基于单片机的室内电热水器控制系统设计
图4.4 定时器程序流程图
-31-
基于单片机的室内电热水器控制系统设计
总结
本设计以AT89C51单片机为核心,根据烧录其中的程序控制整个系统的工作流程。整体性好,人性化强、可靠性高,实现了数字显示控制的智能化,是各个需要显示数字或广告宣传的有力工具。通过该设计.我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。使之不断地战胜别人,超越前人。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
经过四个多月的方案论证、系统的硬件和软件的设计、系统的调试。查阅了大量的关于传感器、单片机及其接口电路、以及控制方面的理论。经过了一番特殊的体验后,经历了失败的痛苦,也尝到了成功的喜悦。第一次靠用所学的专业知识来解决问题。检查了自己的知识水平,使我对自己有一个全新的认识。通过这次毕业设计,不仅锻炼自己分析问题、处理问题的能力,还提高了自己的动手能力。这些培养和锻炼对于我们这些即将走向工作岗位的大学生来说,是很重要的。
这次毕业设计基本的完成了任务书的要求,实现了温度的控制。通过测试表明系统的设计是正确的,可行的。
当然,我的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请老师批评指正。这次设计也让我懂得细节决定成败,在以后的设计中我会严格吸取教训,做的更好!
-32-
基于单片机的室内电热水器控制系统设计
致谢
在本次毕业设计中,不仅自己付出了很多心血,也得到了很多老师和同学的支持,为我创造了很多有利条件,在这里,我要特别感谢我的导师单丹老师,在毕业设计的开始,单老师给了我很多帮助,指导我了解了很多单片机的相关知识,并在当我设计遇到困难时,及时的给予帮助和鼓励,同时,对我其他学科的鼓励也渗透在毕业设计的同时,给了我莫大的信心,为我顺利完成毕业设计起到了非常重要的作用。同时。我还要感谢实习组及实验室的所有老师,为我的毕业设计提供了非常便利的条件。最后还要感谢帮助我的同学,在我遇到困难时给予我耐心的帮助。
再次对在本次毕业设计中给予过我帮助的老师和同学至上我最真挚的谢意。
-33-
基于单片机的室内电热水器控制系统设计
参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989 [4] 廖常初.现场总线概述[J].电工技术,1999. [5] 赵晶.Prote199高级应用[M].北京:人民邮电出版社,2000. [6] 郑步生,吴渭.Multisim200l电路设计及仿真入门与应用[M].北京:电子工业出版社,2002.
[7] 沈美明,温冬婵.IBM—PC汇编语言程序设计[M].北京:清华大学出版社,2001.
[8] 张友德,赵志英,涂时亮.单片微型机原理、应用与实验[M].上海:复旦大学出版社,2000. [9] 楼然苗,李光飞.51系列单片机设计实例[M].北京:北京航空航天大学出版社,2003.
[10] 梁纯,王军.基于MCS一51单片机的LED点阵图文显示屏设计[J].工矿自动化,2005(6):90—92.
[11] 沙占友. 集成温度传感器原理与应用. 北京:机械工业出版社,2002, 84~95.
[12] 刘君华. 智能传感器系统. 西安:西安电子科技大学出版社,1999,83~105.
[13] 沙占友. 智能化传感器原理与应用. 北京:电子工业出版社,2004,99~108.
[14] 赵负图. 传感器集成电路手册. 北京:化学工业出版社,2002,692~703.
[15] 张毅刚. MCS-51单片机原理及应用. 哈尔滨:哈尔滨工业大学出版社,2004,81~94
[16] 李玉峰,倪虹霞 MCS-51系列单片机原理与接口技术. 北
-34-
基于单片机的室内电热水器控制系统设计
京:人民邮电出版社,2004,187~216.
[17] 林伸茂. 8051单片机彻底研究经验篇. 北京:人民邮电出版社,2004,7~14.
[18] 沙占友. 单片机外围电路设计. 北京:电子工业出版社,2003,37~48.
[19] 何希才. 传感器及其应用电路. 北京:电子工业出版社,2001,36~47.
[20] Intel:MCS-51 Family of Single Chip Mirocomputers User’s Manual,1990,3~9.
[21] 吴金戌,沈庆阳,郭庭吉.《8051单片机实践与应用》[M].北京:清华大学出版社,2002.
[22] 高峰,《单片微型计算机与接口技术》[M].北京:科学出版社,2003.
-35-
基于单片机的室内电热水器控制系统设计
附件1 系统电路原理图
-36-
基于单片机的室内电热水器控制系统设计
附录2源程序 蜂鸣器程序:
/************************************************************************************************************
模块名:蜂鸣器
描述 :控制蜂鸣器的开启和关闭
************************************************************************************************************/
#include \"bell.h\"
/****************************************************************
函数名:BellOn
参 数:uiTimes = 延时的毫秒数 返回值:
描 述:让蜂鸣器开启多少时间。
****************************************************************/
void BellOn(unsigned int uiTime) {BELL_PORT = 1; while(uiTime--)
{Delay(1);//延时1ms} BELL_PORT = 0; }
/****************************************************************
函数名:BellOff 参 数: 返回值:
描 述:让蜂鸣器关闭
****************************************************************/
void BellOff(void)
-37-
基于单片机的室内电热水器控制系统设计
{BELL_PORT = 0; }
定时控制程序:
void delay(n)
{ while(n--) { for(i=120;i>0;i--); } }
void modify(void) {
EA=0;
if(thour==0)
{ if(flag==0)
{ dat1[6]++;delay(180); if(dat1[6]>9) { dat1[6]=0;dat1[7]++; if(dat1[7]>2) { dat1[7]=0; } } } if(flag==1) { alarms[6]++;delay(200); if(alarms[6]>9) { alarms[6]=0;alarms[7]++; if(alarms[7]>2) { alarms[7]=0; } }
dat[6]=alarms[6]; dat[7]=alarms[7]; } }
if(tminute==0) {
if(flag==0) {
dat1[3]++;delay(180); if(dat[3]>=10)
-38-
基于单片机的室内电热水器控制系统设计
{ dat1[4]++;dat1[3]=0; if(dat1[4]>5) { dat1[4]=0; } }
} if(flag==1) { alarms[3]++; delay(200); if(alarms[3]>9) { alarms[4]++;alarms[3]=0; if(alarms[4]>5) { alarms[4]=0; } } dat[3]=alarms[3]; dat[4]=alarms[4]; } }
if(miaobiao1==0) {
TR0=0;ET0=0;TR1=1;ET1=1; }
if(miaobiao2==0) { TR0=1;ET0=1;TR1=0;ET1=0; dat2[0]=0; dat2[1]=0; dat2[3]=0; dat2[4]=0; dat2[6]=0; dat2[7]=0; ms=0; sec=0; minit=0; -39-
基于单片机的室内电热水器控制系统设计
} if(P1_5==0) { TR0=0;ET0=0;TR1=0;ET1=0; } if(alarm==0) { TR0=0;ET0=0;TR1=0;ET1=0;flag=1; dat[0]=0; dat[1]=0; dat[2]=10; dat[3]=0; dat[4]=0; dat[5]=10; dat[6]=0; dat[7]=0; } EA=1; }
void init(void) { TMOD = 0x11; TH0 = 0xDB; TL0 =0xFF; TH1=0xDB; TL1=0xFF; ET0 = 1; //10ms ET1=1; TR1=1; TR0=1; tcount=0; ms=0; sec=0; minit=0; EA = 1; }
-40-
基于单片机的室内电热水器控制系统设计
void test(void) { for(k=0;k<8;k++) { P3=dis_bit[k];P2=SEG7[dat[k]]; delay(1);P3=0X00; } }
void main() {
init(); delay(10); while(1) {
modify(); test(); } }
void diplay() interrupt 1 {
ET0=0; TR0=0;
TH0 = 0xDB; TL0 = 0xff; TR0=1; tcount++;
if(tcount==100) {
time1.second++; tcount=0; dat1[0]=(time1.second)%10; dat1[1]=(time1.second)/10; }
if(time1.second==60) {
time1.second=0; time1.minute++;
dat1[3]=(time1.minute)%10;
-41-
基于单片机的室内电热水器控制系统设计
dat1[4]=(time1.minute)/10; }
if(time1.minute==60) {
time1.minute=0; time1.hour++;
dat1[6]=time1.hour%10; dat1[7]=time1.hour/10; }
if(time1.hour>23) {
time1.hour=0; }
dat[5]=10; dat[2]=10; dat[0]=dat1[0]; dat[1]=dat1[1]; dat[3]=dat1[3]; dat[4]=dat1[4]; dat[6]=dat1[6]; dat[7]=dat1[7]; flag=0; P0=0x00;
if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])) {
P0=0x01; } ET0=1; }
void time_2(void)interrupt 3 {
EA=0; TR0=0; TH1=0xDB; TL1=0xFF;
-42-
基于单片机的室内电热水器控制系统设计
TR1=1; ms++;
dat2[0]=ms%10; dat2[1]=ms/10; if(ms>=100) {
ms=0; sec++;
dat2[3]=sec%10; dat2[4]=sec/10; if(sec>=60) { sec=0; minit++;
dat2[6]=minit%10; dat2[7]=minit/10; } }
dat[5]=10; dat[2]=10; dat[0]=dat2[0]; dat[1]=dat2[1]; dat[3]=dat2[3]; dat[4]=dat2[4]; dat[6]=dat2[6]; dat[7]=dat2[7];
return;
显示程序:
/***********************************************************************************************************
模 块 名:LED数据显示、设定
描 述:4位LED显示,-9999到+9999,有单独负号位(利用LED0的小数点位)
LED4(单位显示),LED3-LED0(千,百,十,个) KEY_RIGHT键移动位选,KEY_UP键修改数值 KEY_SET键取消修改, KEY_ENT确认修改
-43-
基于单片机的室内电热水器控制系统设计
修改记录:增加了DispString()函数,SetValueStr()函数.
***********************************************************************************************************/
#include \"includes.h\"
****************************************************************
函数名:DisplayInt 参 数:ucNum = 数值 ucPoint = 0-3,大于3或等于0时不显示小数点
ucWidth = 1-4,当显示数值大于设定位数时,以显示数值为准 返回值:
描 述:LED数值显示,4位,-9999到+9999
****************************************************************/
void DisplayInt(int ucNum, unsigned char ucPoint, unsigned char ucWidth)
{
unsigned char data ucLedBuffer[4]; //显示缓冲 unsigned char data ucNegative; //负数标志 //入口参数检查
if (ucNum > 9999){ucNum = 9999;}
if (ucNum < (-9999)){ucNum = (-9999);} if (ucPoint > 3){ucPoint = 0;}
if ((ucWidth < 1) || (ucWidth > 4)){ucWidth = 4;} //取正负号
if (ucNum < 0) //- {ucNegative = 1; ucNum *= (-1); }else //+ {
ucNegative = 0; }
-44-
基于单片机的室内电热水器控制系统设计
ucLedBuffer[3] = GetLedMold('0' + (ucNum / 1000)); //千位
ucNum %= 1000;
ucLedBuffer[2] = GetLedMold('0' + (ucNum / 100)); //百位
ucNum %= 100;
ucLedBuffer[1] = GetLedMold('0' + (ucNum / 10)); //十位 ucNum %= 10;
ucLedBuffer[0] = GetLedMold('0' + (ucNum)); //个位 //隐藏不显示位 ,当要显示的数据超过宽度时,应显示9999。 if (ucWidth < 4)
{if(ucLedBuffer[3]!= GetLedMold('0')) {ucLedBuffer[2] = GetLedMold('9'); ucLedBuffer[1] = GetLedMold('9'); ucLedBuffer[0] = GetLedMold('9'); }
ucLedBuffer[3] = 0x00; if (ucWidth < 3)
{if(ucLedBuffer[2] != GetLedMold('0')) {ucLedBuffer[1] = GetLedMold('9'); ucLedBuffer[0] = GetLedMold('9'); }
ucLedBuffer[2] = 0x00; if (ucWidth < 2)
{if(ucLedBuffer[1] != GetLedMold('0')) ucLedBuffer[0] = GetLedMold('9'); ucLedBuffer[1] = 0x00; }}}
if (ucPoint != 0){ucLedBuffer[ucPoint] |= 0x01;} //小数点位 if (ucNegative != 0){ucLedBuffer[0] |= 0x01;} //负号位
//LED数据更新
-45-
基于单片机的室内电热水器控制系统设计
SetLed(3, ucLedBuffer[3]); SetLed(2, ucLedBuffer[2]); SetLed(1, ucLedBuffer[1]); SetLed(0, ucLedBuffer[0]); return; }
/****************************************************************
函数名:CloseAllFlash
参 数:*str = 要显示的字符串,长度最大为4。 返回值:
描 述:在0-3的LED上显示一个字符串
****************************************************************/
void CloseAllFlash(void) { int i = 0;
for(i = 0;i<4;i++) SetLedFlash(i,0); }
/****************************************************************
函数名:SetAllFlash
参 数:*str = 要显示的字符串,长度最大为4。 返回值:
描 述:在0-3的LED上显示一个字符串
****************************************************************/
void SetAllFlash(void) {
Int i = 0;
For (i = 0;i<4;i++)
-46-
基于单片机的室内电热水器控制系统设计
SetLedFlash (i,0xff); }
/****************************************************************
函数名:SetFlash
参 数:ucLocate = LED闪烁位,0~4,其他值则关闭所有闪烁LED
返回值: 描 述:控制LED闪烁位
****************************************************************/
void SetFlash(unsigned char ucLocate) {
SetLedFlash(0, 0x00); SetLedFlash(1, 0x00); SetLedFlash(2, 0x00);
SetLedFlash(3, 0x00); switch (ucLocate) {
case 0: {SetLedFlash(0, 0xff); break;} //LED0 case 1: {SetLedFlash(1, 0xff); break;} //LED1 case 2: {SetLedFlash(2, 0xff); break;} //LED2 case 3: {SetLedFlash(3, 0xff); break;} //LED3
case 4: {SetLedFlash(0, GetLedFlash(0) | 0x01); break;} //负号
default: {break;} }
return; } }
延时程序:
/*********************************************************
-47-
基于单片机的室内电热水器控制系统设计
**************************************************
DELAY *模 块 名:延时
描 述:采用软件延时的方法。供其他模块掉用。
/**********************************************************************************************************/
#include \"Delay.h\"
/*************************************************************************************************************
函数名 :Delay
参 数 :uiTimes = ms 个数 返回值 :
描 述 :延时, 最大65536 ,最小0
***********************************************************************************************************/
void Delay(INT16U uiTimes) {
INT8U data i = 0;
for (; uiTimes!=0; uiTimes--){
for (i=200; i!=0; i--){ /* delay 0.5ms (6CLK) */
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }
}
return; }
温度控制程序: void delay(n) { while(n--) {
for(i=120;i>0;i--);
-48-
基于单片机的室内电热水器控制系统设计
} }
void modify(void) { EA=0;
if(thour==0)
{ if(flag==0)
{ dat1[6]++;delay(180); if(dat1[6]>9)
{ dat1[6]=0;dat1[7]++;
if(dat1[7]>2)
{ dat1[7]=0; } } } if(flag==1)
{ alarms[6]++;delay(200); if(alarms[6]>9) {
alarms[6]=0;alarms[7]++;
if(alarms[7]>2) { alarms[7]=0; } } dat[6]=alarms[6];
dat[7]=alarms[7]; }
} if(tminute==0) { if(flag==0)
{ dat1[3]++;delay(180); if(dat[3]>=10)
{ dat1[4]++;dat1[3]=0; if(dat1[4]>5)
{ dat1[4]=0; } } }
if(flag==1)
-49-
基于单片机的室内电热水器控制系统设计
{ alarms[3]++; delay(200); if(alarms[3]>9)
{ alarms[4]++;alarms[3]=0; if(alarms[4]>5) { alarms[4]=0; } } dat[3]=alarms[3];
dat[4]=alarms[4]; } }
if(miaobiao1==0) {
TR0=0;ET0=0;TR1=1;ET1=1; }
if(miaobiao2==0) {
TR0=1;ET0=1;TR1=0;ET1=0; dat2[0]=0; dat2[1]=0; dat2[3]=0; dat2[4]=0; dat2[6]=0; dat2[7]=0; ms=0;
sec=0; minit=0; }
if(P1_5==0) {
TR0=0;ET0=0;TR1=0;ET1=0; }
if(alarm==0)
-50-
基于单片机的室内电热水器控制系统设计
{
TR0=0;ET0=0;TR1=0;ET1=0;flag=1; dat[0]=0; dat[1]=0; dat[2]=10; dat[3]=0; dat[4]=0; dat[5]=10; dat[6]=0; dat[7]=0; } EA=1; }
void init(void) {
TMOD = 0x11; TH0 = 0xDB; TL0 =0xFF; TH1=0xDB; TL1=0xFF; ET0 = 1; ET1=1; // TR1=1; TR0=1; tcount=0; ms=0; sec=0; minit=0; EA = 1; }
void test(void) {
-51-
//10ms
基于单片机的室内电热水器控制系统设计
for(k=0;k<8;k++) {
P3=dis_bit[k];P2=SEG7[dat[k]]; delay(1);P3=0X00; } }
void main() {
init();
delay(10); while(1) {
modify(); test(); } }
void diplay() interrupt 1 {
ET0=0; TR0=0;
TH0 = 0xDB; TL0 = 0xff; TR0=1; tcount++;
if(tcount==100)
{
time1.second++; tcount=0;
dat1[0]=(time1.second)%10; dat1[1]=(time1.second)/10; }
if(time1.second==60) { time1.second=0;
-52-
基于单片机的室内电热水器控制系统设计
time1.minute++;
dat1[3]=(time1.minute)%10; dat1[4]=(time1.minute)/10; }
if(time1.minute==60) {
time1.minute=0; time1.hour++; dat1[6]=time1.hour%10; dat1[7]=time1.hour/10; }
if(time1.hour>23) {
time1.hour=0; }
dat[5]=10; dat[2]=10;
dat[0]=dat1[0]; dat[1]=dat1[1]; dat[3]=dat1[3]; dat[4]=dat1[4]; dat[6]=dat1[6]; dat[7]=dat1[7]; flag=0;
P0=0x00;
if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3]))
{ P0=0x01; }
ET0=1;}
void time_2(void)interrupt 3
-53-
基于单片机的室内电热水器控制系统设计
{
EA=0; TR0=0; TH1=0xDB; TL1=0xFF; TR1=1; ms++;
dat2[0]=ms%10; dat2[1]=ms/10; if(ms>=100) {
ms=0; sec++;
dat2[3]=sec%10; dat2[4]=sec/10; if(sec>=60)
{
sec=0; minit++;
dat2[6]=minit%10; dat2[7]=minit/10; } }
dat[5]=10; dat[2]=10;
dat[0]=dat2[0]; dat[1]=dat2[1]; dat[3]=dat2[3]; dat[4]=dat2[4]; dat[6]=dat2[6]; dat[7]=dat2[7]; } return;
-54-
基于单片机的室内电热水器控制系统设计
}
主程序:
#include \"includes.h\" int main() {
INT8U ucKeyValue = 0; INT8U ucADValue = 1; BellOff(); LedInit();
DS18B20Init(); RelayUpdate(); while(1) {
SetLedInt(5678);
Delay(10); } }
-55-
因篇幅问题不能全部显示,请点此查看更多更全内容