基于89C51单片机太阳能水温水位控制系统

更新时间:2024-06-20 12:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘 要

本温度设计采用现常见的89C51单片机,配以DS18B20数字温度传感器,该温度传感器可自行设置温度上下限。单片机将检测到的温度信号与输入的温度上、下限进行比较,由此作出判断是否启动继电器以开启设备。系统包括单片机模块、温度检测模块、水位检测模块和驱动电路设计四个部分。文中对每个部分功能、实现过程作了详细介绍。

关键词: DS18B20数字温度传感器 89C51 水温水位

目录

一.概述 ........................................................................................................ 3

1.1课题研究的目的及意义 ................................................................... 3 1.2技术指标 ........................................................................................... 3 二.总体设计方案 ........................................................................................ 3 三.详细设计方案 ........................................................................................ 4

1.1温度检测系统 ................................................................................... 4 1.2水位检测系统 ................................................................................... 6 四.元件说明 ................................................................................................ 6

1.1 工作原理 .......................................................................................... 6 1.2单片机的选择 ................................................................................... 7 1.3温度传感器 ....................................................................................... 9 1.4水位传感器 ..................................................................................... 12 1.5 显示元件 ........................................................................................ 13 五.硬件模块设计 ...................................................................................... 15

1.1单片机模块设计 ............................................................................. 15 1.2温度检测模块 ................................................................................. 16 1.3水位检测模块 ................................................................................. 17 1.4 控制模块 ........................................................................................ 19 1.5 驱动电路设计 ................................................................................ 20 六.软件设计 .............................................................................................. 20

1.2 温度检测系统 ................................................................................ 21 1.3 水位检测系统 ................................................................................ 22 1.4 DS18B20主程序 ............................................................................ 25 七.结论 ...................................................................................................... 25 八.参考文献 .............................................................................................. 25 附 录 .......................................................................................................... 26 单片机与显示器件连接图.......................................................................... 27 系统软件源代码 .......................................................................................... 27

一.概述

1.1课题研究的目的及意义

目前市场上太阳能热水器的控制系统大多存在功能单一、操作复杂、控制不方便登问题,很多控制器只具有温度和水位显示功能,不具有温度控制功能。即使热水器具有辅助加热功能,也可能由于加热时间不能控制而产生过烧,从而浪费电能。鉴于此,我以89C51单片机为检测控制核心,采用LED12864显示温度和时间,设计了一种太阳能热水器微控制器,不仅实现了时间、温度和水位参数的实时显示,而且具有时间设定、温度设定、水位设定与控制功能,停电后再来电时也不用重新设定。

1.2技术指标

设计并制作一个基于单片机的温度控制系统,能够对炉温进行控制。炉温可以在一定范围内由人工设定,并能在炉温变化时实现自动控制。若测量值高于温度设定范围,由单片机发出控制信号,经过驱动电路使加热器停止工作。当温度低于设定值时,单片机发出一个控制信号,启动加热器。通过继电器的反复开启和关闭,使炉温保持在设定的温度范围内。

⑴温度设定范围为0~99℃,最小区分度为1℃,温度控制的误差≤1℃ ⑵能够用数码管精确显示当前实际温度值 ⑶按键控制:设置复位键、加一键、减一键

二.总体设计方案

以89C51为主控制芯片,温度采集采用DS18B20温度传感器,通过外围电路来采集水位,用液晶LED 12864显示当前的水位、水温和时间,并且通过键盘来输入日期数据以及所需控制的水位水温。并且当水温水位超于限制时启动报警系统。如图2.1总体设计方案图所示。

图2.1 总体设计方案图

三.详细设计方案

3.1 总体结构设计

方案一:测温电路的设计,可以使用DS18B20温度传感器利用其感温效应,在将随被测温度变化的电压或电流采集后,把采样得到的模拟信号送入ADC0809进行A/D转换读入单片机进行A/D转换后,通过串行口输入,就可以用单片机进行数据的处理,同时在显示电路上,就可以将被测温度显示出来。

方案二:考虑使用温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行A/D转换,依次完成设计要求。

比较以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计容易实现,故实际设计中拟采用方案二。

在本系统的电路设计方框图如图3.1.1.2所示,它由三部分组成: ⑴主控芯片89C51; ⑵数据显示部分; ⑶传感器部分。

LED显示 DS18B20 单片图3.1.1 温度计电路总体设计方案

(1)控制部分

采用传统的数字模似电路,功能可以实现,但电路复杂,温度误差大,成本高,可靠性也比较差;于是我选择采用单片机89C51控制,它结构简单,可以减少外围电路的搭接,并且89C51使用方便,成本比较低,性能稳定,还可以控制各模块输入输出。但是由于其不能直接进行模数转换,因此要做外围电路设计中加AD0809芯片。

(2)显示部分

TC1602的液晶字符性显示器也适合运用于此控制系统当中的,并且功能特性也适用于此设计系统的功能要求。但我还希望此显示系统中能同时显示时间(年月日),所以1602可能就显得力不从心了,于是我选择了液晶LED 12864,它的显示特性很适用此设计系统的功能要求,也不会造成资源浪费。

(3)传感器部分

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温。这一部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。数字温度传感器DS18B20把采集到的温度经数模转换后通过数据引脚传到单片机的P1口,单片机接受温度并存储。此部分只用到DS18B20、AD0809和单片机,硬件很简单。

加热继电器 指示灯 机

3.2水位检测系统

对于水位进行控制的方式有很多,而应用较多的主要有3种,三种方式的实现如下:

方案一:简单的机械式控制方式。其常用形式有浮标式、电极式等,这种控制形式的优点是结构简单,成本低廉。存在问题是精度不高,不能进行数值显示,另外很容易引起误动作,且只能单独控制,与计算机进行通信较难实现。

方案二:利用单片机进行水位检测和控制,基于数字电路的全自动控制,其工作过程是被测水位经过模拟信号采集模块进行采样,然后把采样得到的模拟信号送入ADC0809进行A/D转换读入单片机,再由单片机进行处理,得出结果是否启动/停止控制电路执行信号以达到水位的控制,具体硬件流程框图入图3.2.1所示。

水 位 传 感 器 转换 A/D 单 片 机 输 出 控 制 控 制 水 位 图3.2.1 方案二具体流程框图

方案三:采用89C51单片机为核心控制器的电路。因为单片机电路结构简单成本低廉、可靠性高,便于实现各个控制功能能很好的完成设计任务。水位检测由本设计使用的RC充放电水位传感器通过检测来实现水位的改变。然后通过A/D转换把信号输入到单片机,获得当前水位显示。

综合以上三种方案,方案一和方案二由于缺少温度检测模块,而水温也是影响太阳能热水器很重要的一方面:比如说水箱中水温度过高导致水沸腾这时候虽然水所在刻度不是满的,实际上已经溢出,这样说来方案一和方案二的设计算不上智能。方案三是在方案二的基础上完善和加强的,采用单片机键的双边通信,比起方案二更加方便,也更加合理。

四.元件说明

4.1 工作原理

本文阐述了基于单片机的水温水位控制系统的设计方法,此种方法是以89C51单片机为主控制单元,对水温水位参数进行控制,从而提高了电器的工作稳定性。以DS18B20为温度传感器的对水温进行数据采集并实现温度控制。该控制系统还可

以实时存储相关的温度数据以及水位高度并能记录当前的时间。为了实现功能本系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括89C51单片机最小系统,测温电路、测水位电路、LCD12864液晶显示电路以及报警电路、键盘输入参数等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、水位显示子程序、按键处理程序、12864液晶显示程序以及数据存储程序以及时间显示程序等

4.2单片机的选择

单片机的选择在整个系统设计中至关重要,要满足大内存、高速率、通用性、价格便宜等要求,本课题选择89C51作为主控芯片。

89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。它是美国ATMEL公司的低电压,高性能CMOS8位单片机。89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 实物图如图4.1.2所示。

图4.1.2所示实物图

1.2.1主要特性: ⑴与MCS-51 兼容

⑵4K字节可编程闪烁存储器 寿命:1000写/擦循环 数据保留时间:10年 ⑶全静态工作:0Hz-24Hz ⑷三级程序存储器锁定 ⑸128*8位内部RAM

⑹32可编程I/O线 ⑺两个16位定时器/计数器 ⑻5个中断源 ⑼可编程串行通道

⑽低功耗的闲置和掉电模式 ⑾片内振荡器和时钟电路 1.2.2管脚说明: VCC:供电电压。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。 P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入)

P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在 FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。引脚图如下图4.1.2.2所示

图4.1.2.2 引

1.3温度传感器

美国Dallas半导体公司的数字化温度传感器DS18B20是世界上第一片支持 \一线总线\接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。

1.3.1 DS18B20性能及结构

DS18B20原理与特性本系统采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,大大简化了电路的复杂度,以及算法的要求。首先先来介绍一下DS18B20这块传感器的特性及其功能: DSl8B20的管脚及特点 DS18B20可编程温度传感器有3个管脚。内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的外形及管脚排列如下图4.1.3.1

图4.1.3.1 DS18B20的外形及管脚图

GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5 V。本文使用外部电源供电。

主要特点有: 1. 用户可自设定报警上下限温度值。 2. 不需要外部组件,能测量-55~+125℃ 范围内的温度。 3. -10℃ ~+85℃ 范围内的测温准确度为±0.5℃ 。 4. 通过编程可实现9~l2位的数字读数方式,可在至多750 ms内将温度转换成12 位的数字,测温分辨率可达0.0625℃ 。 5. 独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。6. 测量结果直接输出数字温度信号,以\一线总线\串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。7. 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。8. DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

DS18B20的内部结构 DS18B20内部功能模块如图4.1.3.2所示,

图4.1.3.2 DS18B20内部功能模块

1.3.2 DS18B20工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同DS18B20 为9位~12位A/D转换精度,而DS1820为9位A/D转换,虽然我们采用了高精度的芯片,但在实际情况上由于技术问题比较难实现,而实际精度此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。如下图的测温原理图不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图4.1.3.3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。则高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值时。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直

到计数器2计数到0时,停止温度寄存器值。

图4.1.3.3 DS18B20原理图

1.3.3 DS18B20使用中注意事项

DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

⑴较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS18B20操作部分最好采用汇编语言实现。

⑵在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此。当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。

⑶连接DS18B20的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。

⑷在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。 测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。

1.4水位传感器

ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。目前仅在单片机初学应用设计中较为常见。 1.4.1 主要特性

1)8路输入通道,8位A/D转换器,即分辨率为8位。 2)具有转换起停控制端。

3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时) 4)单个+5V电源供电

5)模拟输入电压范围0~+5V,不需零点和满刻度校准。 6)工作温度范围为-40~+85摄氏度 7)低功耗,约15mW。 1.4.2 内部结构

ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。 外部特性(引脚功能)

ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。下面说明各引脚功能。

IN0~IN7:8路模拟量输入端。 2-1~2-8:8位数字量输出端。

ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路 ALE:地址锁存允许信号,输入,高电平有效。

START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一+5V。 GND:地。

1.5 显示元件

TC1602的液晶字符性显示器也适合运用于此控制系统当中的,并且功能特性也适用于此设计系统的功能要求。但我还希望此显示系统中能同时显示时间(年月日),所以1602可能就显得力不从心了,于是我选择了液晶LED 12864,它的显示特性很适用此设计系统的功能要求,也不会造成资源浪费。

其管脚说明如下表4.1.6所示。

表4.1.6 液晶12864管脚说明

管脚 1 2

3 ,16,18 4 5 6 7 8 9 10 11

符号 GND VDD NC RS

W / R

功能

接地

接入+5V电源电

高:数据(低:指

令)

高:读(低:写) 使能端 数据线 控制模式 系统复位 背光电源, +5V 背光电源, 0V

E

DB0~DB7 PSB RST LED+ LED-

12864液晶的具体指令介绍

DR为数据寄存器:简称DR,它们负责存储微机要写到CGRAM或DDRAM的数据,或者存储MCU要从CGRAM或DDRAM读出的数据。因此,可将DR视为一个数据缓冲区,当RS及R/W引脚信号为1且Enable引脚信号由1变为0时,读取数据;当RS引脚信号为1,R/W引脚信号为0且Enable引脚信号由1变为0时,存入数据。

AC为地址计数器:简称AC,负责计数写/读CGRAM或DDRAM的数据地址,AC依照MCU对LCD的设置值而自动修改它本身的内容。

IR为指令寄存器:简称IR,负责存储MCU要写给LCD的指令码,当RS及R/W引脚信号为0且Enable引脚信号由1变为0时,D0~D7引脚上的数据便会存入到IR寄存器中。

BF为忙碌信号:简称BF,当BF为1时,不接收微机送来的数据或指令;当BR为0时,接收外部数据或指令,所以,在写数据或指令到LCD之前,必须查看BF是否为0。

只要把数据写到文本显示RAM中,就能显示文本内容,具体流程如下:先设定工作模式,接着信号的检测,再数据的传送。

ST7920的显示RAM中提供了8个乘以4行的汉字空间, 当RAM进行写入显示在文本时,CGROM、HCGROM与CGRAM的字型就会显示出。ST7920A可以显示三种字型,分别是显示半宽的HC-GROM字型、中文CGRAM字型和CGRAM字型,在DDRAM中写入编码来进行设定选择哪种字型,各个字型的详细编码如下:

半宽字型显示 :只将一位字节写入DDRAM中,编码范围为02-7FH。 显示中文字形:将两字节编码写入DDRAM,编码范围为A1A0H~F7FEH编码为A140H-D75FH BIG5的码。

显示CGRAM字型:需两个字节的编码写入DDRAM中来实现这种字型,总共有四种编码方式它们分别是0000H、0002H、0004H、0006H。

液晶显示器与单片机连接基本要注意以下三点:

1.若以CMOS芯片为单片机时不需要电平转换电路来转换;若其单片机为TTL芯片则必须配备电平转换电路。

2.模块读或者写控制线为单选,必须加读或者写信号转换电路(对读、写控制线分开的单片机)。

3.对于模块确定的编码地址,应选择相对应的译码电路。

本设计用的液晶4行汉字第一行为温度,第二行为水位,第三行、第四行空缺,在GB2312编码中查询“温度”和“水位”的四个字得到的16位编码分别为:#CEC2、#B6C8、#CBAE、

#CEBB,每个字的编码分为高8位和低8位,写入时先写入高8位,再写入低8位即可。

GB或

五.硬件模块设计

1.1单片机模块设计

控制模块是整个设计方案的核心,它控制了温度的采集、处理与显示、温度值的设定与温度越限时控制电路的启动。本控制模块由单片机89C51及其外围电成,电路如图5.1.1所示。

图5.1.1 单片机控制模块电路

SW-PBS2+5VC510uF+5VU19R388.2K101114RSTVCCEAP3.0/RXDP3.1/TXDP0.0P3.4/T0P0.1P0.2XTAL2XTAL1GNDAT89S514031R375139383P0.72C630PC730PY112M181920该电路采用按键加上电复位,S2为复位按键,复位按键按下后,复位端通过51Ω的小电阻与电源接通,迅速放电,使RST引脚为高电平,复位按键弹起后,电源通过8.2KΩ的电阻对10KμF的电容C5重新充电,RST引脚端出现复位正脉冲.

AT89S51内部有一个高增益反相放大器,用于构成振荡器,但要形成时钟脉冲,外部还需附加电路,本设计采用内部时钟方式,利用芯片内部的振荡器,然后在引脚XTAL1和XTAL2两端跨接晶体振荡器,就构成了稳定的自激振荡器,发出的脉冲直接送入内部时钟电路,C6和C7的值通常选择为30pF左右,晶振Y1选择12MHz.为了减小寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器电容应尽可能安装得与单片机引脚XTAL1和XTAL2靠近。

单片机的31脚(EA)接+5V电源,表示允许使用片内ROM。

1.2温度检测模块

温度由DALLAS 公司生产的一线式数字温度传感器DS18B20 采集。DS18B20 测温范围为-55°C~+125°C,测温分辨率可达0.0625°C,被测温度用符号扩展的16 位补码形式串行输出。CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

本设计采用三引脚PR-35封装的DS18B20,其引脚图见图5.1.2。Vcc接外部+5V电源,GND接地,I/O与单片机的P3.4(T0)引脚相连。

图5.1.2 温度传感器电路引脚图

1.3水位检测模块

1.3.1 传感器电路

系统选用B2119压阻式压力传感器,压阻式压力传感器是利用单晶硅的压阻效应制成的器件。这种传感器精度高、工作可靠,容易实现数字化,比应变式压力传感器体积小而输出信号大。它是目前压力测试中使用最多的一种传感器。压阻式压力传感器使用集成电路工艺技术,在硅片上制造出四个等值的薄膜电阻,并组成电桥电路,当不受到压力作用时,电桥处于平衡状态,无电压输出;当受到压力作用时,电桥失去平衡,电桥输出电压。电桥输出的电压与压力成正比例。其工作原理图如5.1.3.1所示

图5.1.3.1压阻式压力传感器原理图

1.3.2 时钟电路与复位电路

要使单片机按照设计要求正常工作,完整单片机最基本的工作要求,考虑到系统无需精确地定时功能,且为了方便串口通信波特率的计算,采用11.0592MHz的晶振提供系统时钟。并附加复位电路,组成单片机最小系统。复位操作有上电自动复位和按键手动复位两种方式。我们采用上电自动复位,其是通过外部复位电路的电容充电来实现的。其电路图如图2-16(a)所示。这样,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就完成了系统的复位初始化。关

于参数的选定,在振荡稳定后应保证复位信号高电平持续时间大于2个机器周期。当采用的晶体频率为6 MHz时,可采用C=22μF,R=1kΩ;当采用的晶体频率为12 MHz时,可采用C=10μF,R=8.2kΩ。

VccVccC10uFRSTR18.2KVss(a)上电复位电路89C51C 10uFKVccVcc89C51R2R18.2KRSTVss(b)按键电平复位

图2-16复位电路

如果上述电路复位不仅要使单片机复位,而且还要使单片机的一些外围芯片也同时复位,那么上述电阻、电容参考值应作少许调整。

对于CMOS型的89C51,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1μF。

1.3.3 A/D采集转换电路

本系统A/D芯片所选用的是ADC0809,该大规模集成电路芯片是一种由单一+5V电源供电,采用逐次逼近转换原理,能够对8路0—+5V输入模拟电压进行分时转换的八位并行通用型可编程模数转换器。ADC0809由单片机控制驱动,对传感器进行定式循环采集,然后单片机将各测量参数传至PC机,进行后台数据处理。电路连接如图5.1.3.3。

图5.1.3.3 A/D转换电路图 1.3.4 按键设计

键盘在单片机应用系统中是一个很关键的部件,它能实现向单片机系统输入数据、发送命令等功能,是人工干预单片机的主要手段。考虑到本设计实际需要的按键较少,故采用独立式键盘接口电路。在程序查询方式下,通过I/O端口读入按键状态,当有按键按下时,相应的I/O端口变为低电平,而未被按下的按键在上拉电阻作用下为高电平,这样通过读I/O口的状态判断是否有按键按下。

+5V+5VD1Q2图5.1.3.4 系统按键电路 IN4007452311.4 控制模块 P0.2R391K 控制电路与单片机的P0.2口相连,由于单片机输出控制信号非常微弱,需要用Q1JDQ三极管来驱动外围电路,三极管选用NPN型的 9014,当检测温度低于设定温度时,2KR329014在单片机的P0.2口输出高电平控制信号,使三极管9014导通,使继电器两控制端产生压差,从而使继电器吸合,常开触点接通,控制外部电路对锅炉进行加热。控制电路电路图如图5.1.4所示。

图5.1.4 控制电路

1.5 驱动电路设计

在单片机控制系统中,需要用开关量去控制和驱动一些执行元件,如发光二极管、继电器等。但89C51单片机驱动能力有限,且高电平比低电平驱动低。一般情况下,需要加驱动接口电路,且用低电平驱动。如图5.1.5所示

图5.1.5驱动电路

六.软件设计

1.1 系统软件设计整体思路

程序设计语言有三种:机器语言、汇编语言和高级语言。机器语言是机器唯一能“懂”的语言,用汇编语言或高级语言编写的程序(称为源程序)最终都必须翻译成机器语言的程序(成为目标程序),计算机才能“看懂”,然后逐一执行。

高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言编制程序的速度比较快,也便于学习和交流,但是本系统却选用了汇编语言。原因在于,本系统是编制程序工作量不大、规模较小的单片机微控制系统,使用汇编语言可以不用像高级语言那样占用较多的存储空间,适合于存储容量较小的系统。同时,本系统对位处理要求

很高,需要解决大量的逻辑控制问题。

1.2 温度检测系统

1.2.1 系统流程图

开CPU初参数是是否否采样显示实时数据处理子控制电机启

图6.1.2.1 系统流程图

1.2.2 程序编写

程序的功能是:启动DS18B20测量温度,将测量值与给定值进行比较,若测得温度小于设定值,则进入加热阶段,置P1.1为低电平,这期间继续对温度进行监测,直到温度在设定范围内,置P1.1为高电平断开可控硅, 关闭加热器,等待下一次的启动命令。当测得温度大于设定值,则进入降温阶段,则置P1.2为低电

平,这期间继续对温度进行监测,直到温度在设定范围内,置P1.2为高电平断开,关闭风扇,等待下一次的启动命令。

WR1:CLR P1.0 MOV R3,#6 DJNZ R3,$ RRC A MOV P1.0,C MOV R3,#23 DJNZ R3,$ SETB P1.0 NOP DJNZ R2,WR1 RET; 读DS18B2

1.3 水位检测系统

1.3.1系统主程序流程图

系统主程序的功能主要是完成对单片机的初始化,设置警戒液位的上下限,实时显示液位值以及键盘扫描如图6.1.3.1所示

图6.1.3.1 主程序流程图

1.3.2 显示与A/D转换的数据处理

系统中,显示输出的要求为压缩BCD码,而A/D转换输入的数据是8位16进制码,因此在实现显示之前需要编码的转换。对8位A/D转换器而言,其十六进制、相对满偏电压比率、相对电压幅值的关系对应如表6.1.3.2:

满刻度比率 十六进二进制 制 F E 1111 1110 高四位 15/16 14/16 低四位 电压 15/256 14/256 4.800 4.480 电压 0.320 0.280 高四位低四位相对电压幅值Vref=2.5V

D C B A 9 0 7 6 5 4 3 2 1 0 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000 13/16 12/16 11/16 10/16 9/16 8/16 7/16 6/16 5/16 4/16 3/16 2/16 1/16 0/16 13/256 12/256 11/256 10/256 9/256 8/256 7/256 6/256 5/256 4/256 3/256 2/256 1/256 0/256 4.160 3.840 3.520 3.200 2.880 2.560 2.240 1.920 1.600 1.280 0.960 0.640 0.320 0.000 0.260 0.240 0.220 0.200 0.180 0.160 0.140 0.120 0.100 0.080 0.060 0.040 0.020 0.000 表6.1.3.2 A/D转换幅值数据关系对照表

显示转换部分程序简略如下: uchar dis_transform(uchar num) {

uchar ac, quotient, play, mid ; ac = num%5;

quotient = (num-ac)/5; if(ac>2) quotient++; ac=quotient; mid=(quotient-ac)/10; play=ac+mid*16; return play; }

1.3.3 系统主程序

ORG 0000H AJMP MAIN ORG 0060H

MAIN: MOV P1, #FFH ; P1 P3口初始化置1 MOV P3,#FFH

JNB P1.3 , AVT ; 若手动在自动位置,跳到自动模式程序 AJMP MEN ; END

AUT: NOP(空命令)

JNB P1.2 , LG ; JB P1.1 LD , ; CLR P3.1 ; JB P1.0, LDD ; CLR P3.0 ; JNB 3.1 P1.6, Y1 ; M1CLR P1.4 ; Y1:JNB P1.7 ,Y2 ; M2 CLR P1.5 ; Y2:ACALL DELAY ; AJMP AUT ; LDD: JNB P1.6 ,Y3 ; CLR P1.4

Y3: JB P1.7 Y2 SETB P1.5 AJMP Y2

LG:CLR P3.2 ; LD: AJMP MAIN ; 否则转到手动模式子程序 水位高—LG 水位没低---LD 水位低报警 水位未低低---LDD 水位低低报警 已启动—Y1 否则启动M1 已启动---Y2 否则启动M2 延时1分钟 返回自动模式

单独运行M1(LDD〈水位〈LD) 水位高报警 返回主程序

1.4 DS18B20主程序

#include

#define uchar unsigned char #define uint unsigned int

sbit DQ=P3^7;//ds18b20与单片机连接口 sbit RS=P3^0; sbit RW=P3^1; sbit EN=P3^2;

unsigned char code str1[]={%unsigned char code str2[]={%uchar fCode[8]; uchar data disdata[5]; uint tvalue;//温度值 uchar tflag;//温度正负标志

七.结论

本文详细介绍了基于单片机89C51的温度控制系统的设计方案与软硬件实现。系统包括数据采集模块,单片机控制模块,显示模块和温度设置模块,驱动电路五个部分。文中对每个部分功能、实现过程作了详细介绍。完成了课题既定的任务,达到了预期的目标。系统具有如下特点:

⑴.采用智能温度传感器DS18B20采集温度数据,简化了硬件电路设计,温度采集数据更加精准;

⑵.89C51单片机的采用,有利于功能扩展; ⑶.电路设计充分考虑了系统可靠性和安全性。

本课题软件和硬件相结合,有相当的难度,同时也有很大的实用性。

八.参考文献

[1] 马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1998

[2] 李晓荃.单片机原理与应用[M].北京:电子工业出版社,2000年8月 [3] 何立民 AVR单片机原理与接口技术[M].北京:北京航空航天大学出版社,

2002

[4] 杨帮文 新型继电器实用手册[M].北京:北京人民邮电出版社.2004

附 录

单片机与显示器件连接图

系统软件源代码

#include

#include

#define uchar unsigned char

uchar hostmark; uchar idata

sec,min,hr,date,mon,day,year;

uchar idata

uplq,downlq,numm,prelq,xdat,key;

uchar xdata * idata numtab; uchar xdata * idata xmark; uchar idata num1,num2; int tab;

uchar bdata iodat; uchar bdata ddat; sbit iodat7=iodat^7; sbit ddat0=ddat^0;

sbit SCLK=P1^0; sbit IO_DATA=P1^1; sbit RST=P1^2; sbit adRD=P1^3; sbit adWR=P1^4; sbit E=P1^5; sbit DIS=P1^6; sbit RELAY=P1^7;

//****延迟子程序********** yanshi() { int i,j;

for(i=0;i<120;i++) for(j=0;j<120;j++) { ; } }

//显示转换

**************************

uchar dis_transform(uchar num) {

uchar ac,quotient,play,mid; ac=num%5;

quotient=(num-ac)/5; if(ac>2) quotient++; ac=quotient;

mid=(quotient-ac)/10; play=ac+mid*16; return play; }

//液位显示

**************************

display() {

DIS=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

P0=dis_transform(prelq); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DIS=1; }

//******************************

//DS1302读写*******************

ds_read() {

uchar j; iodat=0x00; for(j=8;j>0;j--) { iodat=iodat>>1; iodat7=IO_DATA; _nop_(); SCLK=1; _nop_(); SCLK=0; } }

ds_write(uchar ad) {

uchar i;

ddat=ad;

for(i=8;i>0;i--) { IO_DATA=ddat0; _nop_(); SCLK=1; _nop_(); ddat=ddat>>1; SCLK=0; } }

//读取时间*****

uchar ds_gettime(uchar gadd) {

RST=0; _nop_(); SCLK=0; _nop_(); RST=1;

ds_write(gadd); IO_DATA=1; ds_read(); RST=0;

return iodat; }

//设置时间****

ds_settime(uchar sadd,uchar sdat) {

RST=0; _nop_(); SCLK=0; _nop_(); RST=1;

ds_write(sadd); ds_write(sdat); RST=0; }

//**************************** //********ad转换模块****** ad_start() //启动 {

adWR=0; _nop_(); _nop_();

_nop_(); _nop_(); _nop_(); _nop_(); adWR=1; _nop_(); _nop_(); _nop_(); }

ad_read() //读取 {

P0=0xff; // adWR=0; _nop_(); _nop_(); adRD=0; _nop_(); _nop_(); prelq=P0; _nop_(); _nop_(); adRD=1; adWR=1; }

getalltime() //读所有时间 {

sec=ds_gettime(0x81 ); min=ds_gettime(0x83 ); hr=ds_gettime(0x85 ); date=ds_gettime(0x87 ); mon=ds_gettime(0x89 ); day=ds_gettime(0x8b ); year=ds_gettime(0x8d ); }

//************************ //**************初始化sp_init() {

TMOD=0x22; SCON=0x40; TH1=0xf4; TL1=0xf4; PCON=0x80;

************

IE=0; TR1=1; REN=1; }

port_init() {

adRD=1; adWR=0; E=0; DIS=0; RELAY=1; }

data_init() {

xmark=0x7531; if(*xmark!=0xf0) { xmark=0x0000; *xmark=0; numtab=0x0001; xmark=0x7531; *xmark=0xf0; num1=0; num2=0; }

ad_start(); _nop_(); _nop_(); _nop_(); ad_read(); key=0;

uplq=0x0af; downlq=0x96; getalltime(); }

ds_init() {

if(ds_gettime(0xc1)!=0xaa) {

sec=0x00; min=0x00;

hr=0x00;

date=0x01; mon=0x01; day=0x04; year=0x09; ds_settime(0x90,0xab); ds_settime(0x80,sec); ds_settime(0x82,min); ds_settime(0x84,hr); ds_settime(0x86,date); ds_settime(0x88,mon); ds_settime(0x8a,day); ds_settime(0x8c,year); ds_settime(0xc0,0xaa); } }

main_init() {

port_init(); sp_init(); ds_init(); data_init(); display(); }

//****************************//串口通信******************** uchar receive() //接收 {

int tmp; E=0;

while(!RI); tmp=SBUF; RI=0; E=0;

return tmp; }

send(uchar dd) //发送 {

E=1; _nop_(); _nop_(); _nop_(); _nop_();

*

_nop_(); _nop_(); _nop_(); SBUF=dd; while(!TI); TI=0; E=0; }

//**************************** //通信子程序

sp_connection() {

send(0xF0); }

sp_readtime() {

getalltime(); send(0xF1); send(sec); send(min); send(hr); send(date); send(mon); send(day); send(year); }

sp_settime() {

send(0xf2); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

sec=receive(); min=receive(); hr=receive(); date=receive(); mon=receive(); day=receive(); year=receive();

ds_settime(0x80,sec); ds_settime(0x82,min); ds_settime(0x84,hr); ds_settime(0x86,date); ds_settime(0x88,mon); ds_settime(0x8a,day); ds_settime(0x8c,year); }

sp_readrec() {

send(0xf3); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); send(prelq); }

sp_readdat() {

uchar xdata *pt; send(0xF4); send(num1); send(num2); yanshi(); yanshi();

xmark=0x0000; if(*xmark==0) {

for(pt=0x0001;pt

for(pt=0x0001;pt<=0x7530;pt++)

********************

{ send(*pt); } numtab=0x0001; num1=0; num2=0; *xmark=0; } }

sp_readlq() {

send(0xF5); send(uplq); send(downlq); }

sp_setlq() {

send(0xf6); uplq=receive(); downlq=receive(); }

sp_readlqakey() {

send(0xf7); send(prelq); send(key); }

//********************** //通信协议****************** check_mark() {

switch(hostmark) { case 0x00: sp_connection();break; case 0x01: sp_readtime();break; case 0x02: sp_settime();break; case 0x03: sp_readrec();break; case 0x04: sp_readdat();break; case 0x05:

sp_readlq();break;

case 0x06: sp_setlq();break; case 0x07: sp_readlqakey();break; default: break; } }

check_host() {

if(RI==1) { RI=0; hostmark=SBUF; _nop_(); check_mark(); } }

//记录数据

makemark(uchar mk) { getalltime(); *numtab=min; numtab++; *numtab=hr; numtab++; *numtab=date; numtab++; *numtab=mon; numtab++; *numtab=year; numtab++; *numtab=mk; xmark=0x0000; if(numtab==0x7530) { numtab=0x0001; *xmark=1; num1=50; num2=0; }

else if (*xmark!=1)

**************************

{ tab=numtab; num1=(tab/6)/100; num2=(tab/6)0; numtab++; } }

//**********************************

//液位检测

**************************

check_lq() {

ad_start(); _nop_(); _nop_(); _nop_(); ad_read();

if(prelq>=uplq && key==1) { RELAY=1; key=0; makemark(1); }

else if(prelq<=downlq && key==0)

{ RELAY=0; key=1; makemark(0); } }

//****************************//***************主程序main() {

main_init(); while(1) { check_lq(); display(); check_host(); } }

******

**********

本文来源:https://www.bwwdw.com/article/e9m3.html

Top