找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用DS18B20和单片机实现温度控制报警系统设计论文

[复制链接]
跳转到指定楼层
楼主
ID:362650 发表于 2018-7-2 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用单片机及DS18B20实现温度报警器的制作

利用单片机及DS18B20实现温度报警器的制作 摘要:随着电子技术的发展,家用电器和办公设备的智能化、系统化已成为发展趋势,而这些高性能几乎都要通过单片机实现。同时,温度作为与我们生活息息相关的一个环境参数,对其的测量和研究也变得极为重要。故温度检测报警系统在现代生活、生产中得到了越来越广泛的应用。
本论文介绍了采用温度传感器DS18B20作为温度采集器、AT89S51单片机为主控制器,外加显示模块以及报警电路实现该智能温度测量报警器的设计方法、工作原理、电路组成等。DS18B20是美国DALLAS公司生产的单线数字温度传感器,它具有独特的单线总线接口方式,使用起来比较方便,其精度也相当高。由于其以上特点,故将其应用于温度检测电路能够使系统更简单,更可靠。该温度报警系统结构设计较为简单,但可应用于生活、生产以及科研等多个领域,是一种经济而实用的温度控制系统,其优点很多,有很大实用价值。
关键词:AT89S51;单片机;DS18B20;温度控制;报警
1绪 论
温度是与人们生活息息相关的环境参数,许多情况下都需要进行温度测量及报警,温度测量报警系统在现代日常生活、科研、工农业生产中已经得到了越来越广泛的应用。所以对温度的测量报警方法及设备的研究也变得极其重要。随着人们生活水平的不断提高以及应对各种复杂测量环境的需要,我们对温度测量报警器的要求也越来越高,利用单片机来实现这些控制无疑是人们追求的目标之一,它带给我们的方便是不可否定的。其中温度检测报警器就是一个典型的例子。要为现代人工作、科研、生活、提供更好的更方便的设施,就需要从单片机技术入手,向数字化,智能化控制方向发展。
本设计所介绍的温度报警器,可以设置上下限报警温度,当温度不在设置范围内时,可以报警 。与传统的温度测量系统相比,本设计中的数字温度测量报警系统具有很多前者没有的优点,如测温范围广而且准确,采用LCD数字显示,读数方便等。
1.1 温度报警器的研究意义
随着电子技术的发展,家用电器和办公设备的智能化、系统化已成为趋势,而这些高性能几乎都要通过单片机实现。同时,温度作为与我们生活息息相关的一个环境参数,对其的测量和研究也变得极为重要。故温度检测报警系统在现代生活、生产中得到了越来越广泛的应用。
工业生产带动了人类社会的进步,同时也促进了各种新的传感器的发展。在工业生产中温度的准确测量是一个比较困难的事情。从最初的酒精、水银温度计到现在的数字化、集成化的温度计可见传感器的发展是飞快的。它的快速发展必将带来新一轮的工业化革命和社会发展的飞跃。
本设计所介绍的温度报警器可以设置上下限报警温度,当温度不在设定范围内时可以报警 ,主要用于对测温比较准确的场所,或科研实验室使用。它具有结构简单,不需外接元件,可由用户设置温度报警界限等特点,可广泛用于食品库、冷库、粮库等需要控制温度的地方。目前,该类产品已在温控系统中得到广泛的应用。所以设计意义较为深远。
1.2 温度报警器的现状及发展
温度是一种在生产、科研、生活中需要测量和控制的重要物理量,是国际单位制七个基本量之一。其测量控制一般采用各式各样形态的温度传感器。根据它们在讯号输出方式上的不同可以分为模拟温度传感器和数字温度传感器。单片机技术的出现则是为现代工业测控领域带来了一次新的技术革命,目前,单片机以其体积小、重量轻、抗干扰能力强、对环境要求不高、可靠性高、性价比高、开发较为容易等特点,在工业控制、数据采集、智能化仪器仪表、办公自动化等诸多领域得到了极为广泛的应用,并已走入我们的日常生活,现在,随处都可以看到单片机的踪影。目前温度报警器的发展已经比较成熟了,它能帮助我们实现想要的温度控制,解决身边的很多问题。
1.2.1 智能温度传感器
智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的。它是微电子技术、计算机技术和自动测试技术(ATE)的结晶。目前,国际上已开发出多种智能温度传感器系列产品。智能温度传感器内部都包含温度传感器、A/D转换器、信号处理器、存储器(或寄存器)和接口电路。有的产品还带多路选择器、中央控制器(CPU)、随机存取存储器(RAM)和只读存储器(ROM)。智能温度传感器的特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU);并且它是在硬件的基础上通过软件来实现测试功能的,其智能化程度也取决于软件的开发水平。
1.2.2 传感器发展趋势
现代信息技术的三大基础是信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)。传感器属于信息技术的前沿尖端产品,尤其是温度传感器,它被广泛用于工农业生产、科学研究和生活等领域,数量高居各种传感器之首。近百年来,温度传感器的发展大致经历了以下三个阶段;(1)传统的
分立式温度传感器(含敏感元件);(2)模拟集成温度传感器,控制器;(3)智能温度传感器。目前,国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。
2 硬件设计
2.1 总体设计方案
本设计是一个基于单片机的温度测量电路,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻虽然成本低,但是需要后续信号处理、A/D转换处理等才能将温度转换成数字信号,不但电路复杂,可靠性和精度也相对较低,在应用中还需要解决引线误差补偿、干扰等问题,故传统方案不可取。进而非常容易考虑到使用温度传感器,在单片机电路设计中,单片机除了可以测量电信号外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域。单片机的接口信号是数字信号,要用单片机作为控制器测量温度这类非电信号,就要使用温度传感器将温度信息转换为电流或者电压信号输出,如果转化的信号是模拟信号,还需要进行A/D转化,以满足单片机接口的需要。进一步联想到可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,成功地进行温度采集以后,就可以利用单片机进行数据处理,然后通过LCD将温度显示出来,就可以满足设计要求。硬件部分设计主要包括:测温电路、传感器电路及测温电路与单片机的接口、报警电路与单片机的接口等组成的。
本设计中,温度传感器采用DS18B20,控制器采用AT89S51,显示电路采用LCD1602液晶显示器实现,总体方框图如下:
图3.1 总体方框图
在研究出总体设计方案后,在这一阶段主要的主要工作是查阅各芯片资料,熟悉其功能特性和技术参数,同时学习PROTEL DXP软件,用其绘制出硬件原理图,然后继续分析各结构,查阅国内外相关技术资料,查缺补漏,反复修改设
4
计方案,力求完美;通过原理图绘制PCB图;制作PCB板,购买所需元件,完成硬件方面的设计。
2.2系统器件的选择
2.2.1 单片机的选择
AT89S系列的单片机是能用下载线进行在线编程的 ISP,使用简单的HC244电路,就可以通过电脑上面的程序来进行对单片机的编程,是无须拆下来放到笨重的编程器上面写片子的。AT89C系列则没有这个功能并且C系列无法调试。 2.2.2温度传感器的选择
本设计主要应用在机房、粮仓等地,测量温度在-20到+75摄氏度之间,ds18b20温度测量范围从-55到+125摄氏度,精度为?0.5 ? C,适合设计要求,所以传感器选择ds18b20温度传感器。
2.2.3显示模块的选择
1601显示一行的16个字符,1602显示两行的16个字符,1602海可以显示汉字,满足设计要求,所以选择LCD1602显示模块。
2.3传感器模块DS18B20
温度传感器是该系统的关键器件,本设计采用的DS18B20温度传感器是美国DALLAS半导体公司最新推出的一款改进型智能温度传感器,它集温度测量、A/D转换为一体,其温度测量范围从-55OC到+125OC,精度为?0.5? C,可在1秒钟内把温度变换成数字。DS18B20是世界上第一片支持“一线总线”接口的温度传感器,也就是说,它具有独特的单总线接口,仅需要占用一个I/O端口即可以完成与微处理器间的通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路,为读写以及温度转换带来方便,同时,它可以从数据线本身获得能量,不需要外接电源;它支持3V,5.5V 的电压范围, 使系统设计更灵活、方便;其工作电源既可在远端引入, 也可采用寄生电源方式产生;此外,与传统的热敏电阻等测温元件相比,DS18B20能直接读出被测量的温度,并且可以根据实际要求通过简单的编程实现9,12位的数字值读数方式,它可在1 秒钟内把温度变换成数字;由DS18B20 组建的温度测量单元体积小, 便于携带和安装。同时,DS18B20 可以直接与单片机连接,无需后接A/D 转换, 控制简单;还有,它具有负压特性,电源极性接反时,仅仅是不能正常工作,但温度计不会因发热而
5
烧毁。Ds18b20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。整体来说DS18B20的性能是新一代产品中最好的,性能价格比也非常出色,所以我们选择它来作为设计部件。 2.3.1 注意事项:
Ds18b20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中叶应注意以下几个方面的问题:
1在对ds18b20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。
2当单总线上所挂ds18b20超过8个小时,就需要解决微处理器的总线驱动问题。
3在用ds18b20进行长距离测温系统设计是要充分考虑总线分布电容和阻抗匹配问题。
Ds18b20从测温结束到将温度值转换成数字量需要一定的转换时间。
图2.2 DS18B20的外观图 图2.3 DS18B20内部结构框图
图2.4 DS18B20引脚分布图
DS18B20的主要技术指标如下:测量范围:-55OC—+125OC;测量精度:0.5OC;
6
反应时间<=500ms。
2.3.2 引脚功能
2、DQ:数据输入/输出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常态下为高电平. 通常要求外接一个约5kΩ的上拉电阻。
3、VDD:外接供电电源输入端引脚。电压范围:3~5.5V;当工作于寄生电源时,此引脚必须接地
在本系统中用外接电源,DQ接到AT89S51的P2(0端,R1为信号和5V电源之间的上拉电阻。在实际中,若需要多点检测是,可在单总线上挂多个DS18B20,但超过8个是要考虑驱动问题,软件设计也变得复杂多了同事要考虑DS18B20单总线的长度问题,一般不超过50M,为实现更远程的控制,可以考虑把系统设计成无线系统,以突破DA18B20单总线的长度限制。
表2.1 主要温度与转换后输出的数字对应值表
温度 /OC 二进制表示 十六进制表示
+125 0000 0111 1101 0000 07D0H
+85 0000 0101 0101 0000 0550H
+25.0625 0000 0001 1001 0000 0191H
+10.125 0000 0000 1010 0001 00A2H
+0.5 0000 0000 0000 1000 0008H
0 0000 0000 0000 0000 0000H
-0.5 1111 1111 1111 1000 FFF8H
-10.125 1111 1111 0101 1110 FFE5H
-25.0625 1111 1110 0110 1111 FE6FH
-55 1111 1100 1001 0000 FC90H
7
(a)寄生电源工作方式 (b)外接电源工作方式 2.3.3 ds18b20 ROM指令表
指 令 约定代码 功 能
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)
发出此命令之后,接着发出 64 位 ROM 编码,访
55H 问单总线上与该编码相对应的 DS1820 使之作出响符合 ROM
应,为下一步对该 DS1820 的读写作准备。
用于确定挂接在同一总线上 DS1820 的个数和识
0FOH
搜索 ROM 别 64 位 ROM 地址。为操作各器件作好准备。
0CCH 忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命跳过 ROM
令。适用于单片工作。
0ECH 执行后只有温度超过设定值上限或下限的片子才做出告警搜索命令
响应。
RAM指令表
约定代
指 令 功 能

启动DS1820进行温度转换,12位转换
温度变
44H 时最长为750ms(9位为93.75ms)。结果存

入内部9字节RAM中。
读内部RAM中9字节的内容
8
读暂存器 0BEH
发出向内部RAM的3、4字节写上、下
限温度数据命令,紧跟该命令之后,是传
写暂存器 4EH
送两字节的数据。
将RAM中第3 、4字节的内容复制到EEPROM
复制暂存器 48H
中。
将EEPROM中内容恢复到RAM中的第3 、4字
重调 EEPROM 0B8H
节。
读供电读DS1820的供电模式。寄生供电时DS1820
0B4H
方式 发送“ 0 ”,外接电源供电 DS1820发送
“ 1 ”。
2.4主控制器模块AT89S51
AT89S51是整个系统的核心处理器,单片机首先把通过传感器测到的现场温度与预先设置的温度进行比较,如果大于或小于预先设置值,就输出信号去控制加热器的工作,从而实现温度控制。At89s51还负责液晶显示、报警以及与上位机进行通信等工作。
AT89S51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能位微处理器, 俗称单片机。
9
图3.6 AT89S51单片机
2.4.1 基本概述
管脚说明:
芯片共有40个引脚,引脚的排列顺序为从靠芯片的缺口左边那列引脚逆时针数起,依次为1、2、3、4......40,其中芯片的1脚顶上有个凹点。在单片机的40个引脚中,电源引脚线2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚3根。
1、电源引脚线(2根)
VCC(Pin40):电源输入,接,5V电源
GND(Pin20):接地线
2、外接晶振引脚(2根)
XTAL1(Pin19):反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2(Pin20):片内振荡电路的输出端。
3、控制引脚(4根)
RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号,当访问外部存储器时,地址锁存允许的
10
输出电平用于锁存地址的地位字节。在编程期间, 此引脚用于输入编程脉冲。在平时, ALE端以不变的频率周期输出正脉冲信号, 此频率为振荡器频率的1/6,因此它可用作对外部输出的脉冲或用于定时目的。PSEN(Pin29):外部存储器读选通信号,外部程序存储器的选通信号。在由外部程序存储器取址期间, 每个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。在/EA保持低电平时, 则在此期间外部程序存储器(0000H—FFFFH), 不管是否有内部程序存储器。
4、可编程输入/输出引脚(32根)
AT89S51单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。每一根引脚都可以编程,
PO口(Pin39,Pin32):名称为P0.0,P0.7,8位双向I/O口线, P0口为一个8位漏级开路双向I/O口, 每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入,P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
P1口(Pin1,Pin8):名称为P1.0,P1.7 ,8位准双向I/O口线, P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流,P1口管脚写入1后,被内部上拉为高, 可用作输入, P1口被外部下拉为低电平时, 将输出电流, 这是由于内部上拉的缘故。
P2口(Pin21,Pin28):名称为P2.0,P2.7,8位准双向I/O口线, P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收输出个4个TTL门电流。当P2口被写1时, 其管脚被内部上拉电阻拉高, 且作为输入。并因此作为输入时, P2口的管脚被外部拉低, 将输出电流, 这是由于内部上拉的缘故。P2口当用于外部程序存储器或位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址1时,它利用内部上拉优势, 当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P3口(Pin10,Pin17):名称为P3.0,P3.7,8位准双向I/O口线, P3口管脚是8个带内部上拉电阻的双向I/O口, 可接收输出4个TTL门电流。当口写入1后,它们被内部上拉为高电平, 并用作输入,作为输入, 由于外部下拉为低电平, P3
11
口将输出电流(ILL),这是由于上拉的缘故。
图3.7 AT89S51方框图
2.4.2 功能特性概述
AT89S51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路,同时,AT89S51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
AT89S51的特点:
1、系统可编程特性: 创造了单片机学习开发系统的先例,可方便地在系统中实现程序下载,弥补了实时修改程序的不足之处,并可以立即从目标系统中反映出修改的结果,大大缩短单片机学习开发的周期,提高了工作效率。
2、代码全速仿真: 弥补传统学习系统不能全速仿真的缺陷,使系统运行
12
的结果完全反映代码的执行情况,更切实地吻合人们工作、学习所需要的特点。其次,在软件开发前的仿真调试后,完全可烧写入目标芯片,并能获得完全一致的代码执行结果。是集学习、开发于一身的优良的目标系统。
3、资源的可重复利用性: 目标系统上的所有资源都能重复利用并能通过软件调配或通过扩展槽增加其它的功能,进而提高系统的实用性。
4、软硬结合,操作简单方便:
在AT89S51提供硬件支持的同时,也提供良好的上位机控制软件,只要通过软件的功能操作就能实现:源代码的调试编译,查找与修改错误之处,在线代码下载等功能。使单机的学习与开发一体化,集成化,更进一步体现系统学习的优越性。
晶体振荡特性: AT89S51中有一个用于构成内部振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷振荡器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路,对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,则推荐电容使用30Pf+10pF,而如使用陶瓷谐振器建议选择40Pf+10Pf。也可以采用外部时钟,这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大低电平持续时间应符合技术条件要求。
图3.8 晶体接线图和外接时钟线图
13
AT89S51的极限参数:
工作温度:-55OC to+125 OC 储存温度:-65 OC to +150 OC
任一引脚对地电压:1.0V to7.0V 最大工作电压:6.6V
DC输出电流:15.0mA
2.5 显示模块LCD1602
2.5.1引脚功能和基本特征
图3.9 LCD1602引脚分布图
1602采用标准的16脚接口,引脚功能如下:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,故通常将此脚接地。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7,14脚:D0,D7为8位双向数据线。
第15,16脚:空脚。
LCD1602的基本特征:
单5V电源电压、低功耗、长寿命、高可靠性。
内置192种字符(160个5×7点阵字符和32个5×10点阵字符)。
具有64个字节的自定义字符RAM,可自定义8个5×8点阵字符或四个5×11点
14
阵字符。
显示方式:STN、半透、正显。
驱动方式:1/16DUTY,1/5BIAS。
视角方向:6点。
背光方式:底部LED。
通讯方式:4位或8位并口可选。
标准的借口特性,适配MC51和M6800系列MPU的操作时序。 2.5.2 模块内部结构
图3.10 LCD1602结构块图
模块组件内部结构
模块组件内部主要由LCD显示屏(LCD panel)、控制器(controller)、列驱动器(segment driver)和偏压产生电路构成。
LCD显示屏为common和segment交叉形成的点阵,以5×8点阵的字符结构模式和设置的显示字符树木,选择适宜的行数,分单屏、双屏或者多屏显示规定的字符。对于双屏或者多屏显示结构的LCD,每一显示屏结构部分,均由各自独立的使能信号E控制。
列驱动器与控制器配套使用,它接收来自控制器的振荡、帧同步输出、串行输出的数据和移位以及锁存脉冲,产生列segment交流扫描驱动信号。
控制器接收来自MPU的指令和数据,控制着整个模块的工作,由CGROM、CGRAM和DDRAM等字符存储区域、以及与MPU和列驱动器的I/O接口、指令寄存和译码机
15
构、地址计数器等部分组成。在控制器的控制下,模块通过数据总线DB0—DB7和E、R/W、RS三个输入控制端与MPU接口。这三根控制线按照规定的时序相互协调作用,使控制器通过数据总线DB接收MPU发送来的指令和数据,从CGROM中找到欲显示字符的字符码,送入DDRAM,在LCD显示屏上与DDRAM存储单元对应的规定位置显示出该字符。控制器还可以根据MPU的指令,实现字符的显示、闪烁和移位等显示结果。
2.6键盘控制
键盘分为八个独立按键,一端与单片机的p2口及50k上拉电阻相连,另一端接地,当任一按键按下时,p2口读取低电平有效。系统上点后,进入键盘扫描子程序,以查询的方式确定各按键,完成温度初值的设定,系统进入主程序后按键功能无效。
2.7驱动电路
驱动电路采用继电器驱动方式。通过控制继电器在控制周期内通断的时间,实现对加热的开关控制。由单片机I/O口输出的控制信号,经NPN晶体管放大,驱动继电器工作。
2.8报警电路
本设计采用蜂鸣器报警电路,它由晶体管和蜂鸣器组成。由单片机I/O口输出信号控制晶体管的导通或截止,晶体管导通,则蜂鸣器报警。通过单片机来控制蜂鸣器产生报警声音。
2.9温度控制的实现
系统工作时先由使用者设定预期达到的两位温度值,温度值输入后,打开电源,单片机自动复位,进行初始化,这时LED显示器显示设定温度,以便操作人员核对设定温度,然后温度检测电路将测点的温度输入单片机,经软件滤波后作为实测温度,此后显示器将一直显示实测温度。若实测温度高于设定温度时,则通过驱动电路关上加热器并报警;若实测温度低于设定温度是,则通过驱动电路打开加热并报警;若在设定温度范围内,则加热器状态不变。2.10各接口电路
2.10.1 主控制模块与温度传感模块的连接
16
图2.11 主控制器AT89S51与温度传感器DS18B20接口图
温度检测系统原理如上图所示,采用寄生电源供电方式。为保证在有效的DS18B20时钟周期内,提供足够的电流,我们用一个MOSFET管和89S51的一个I/O口(P1.0)来完成对DS1820总线的上拉。当DS1820处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10μs。采用寄生电源供电方式时VDD必须接地。这一部分的主要功能是电路接通以后,DS18B20进行温度采集工作,然后将收集到的数据送入AT89S51进行处理,使得主控制器可以将数据处理好后送入下一部分电路进行工作。
17
2.10.2 主控制模块与显示模块的连接
图2.12 主控制器AT89S51与显示模块LCD连接图
AT89S51与显示模块LCD1602连接形成显示电路,接通电源后,DS18B20将采集到温度传送给主控制器AT89S51,主控制器进行计算、转换等工作之后把数据传给LCD1602模块,则LCD1602显示屏上会显示出当前的温度。此时我们按下各功能键可以根据自己的需要进行TH和TL的值设置,在LCD1602显示屏幕上会出现设置的值,另外进行测试时相关温度值也会直接出现在LCD1602屏幕上,一目了然。
18
2.10.3 系统整体硬件连接
+5
DS1U2R3140P1.0/TVccU32501KP1.1/TLED116339BG GNDP1.2P0.015438BGVCCP1.3P0.114537DB7P1.4P0.213636DB6P1.5P0.312735DB5P1.6P0.411834DB4P1.7P0.51033DB3P0.69932DB2RST/VPDP0.78DB171031DB0P3.0/RXDEA/VPP+5S611SW-DIP4LCD1602EP3.1/TXD5123018RWP3.2/INT0ALE/PROG4132927RSP3.3/INT1PSEN31436VOP3.4/T02152845VCC+5P3.5/T1P2.7R?11627GNDP3.6/WRP2.61726RESP3.7/RDP2.5LCD160225U1P2.418241XTAL2P2.3GNDC119232XTAL1P2.2I/O30PF223P2.1VDDR?2021DS24.7KGndP2.0DS18B20RESR2AT89S51Y2LED22+5
XTAL1
C2R4C1501K22PF30PFLS1VCC
Speaker
图3.13 温度测量报警系统原理图 将分开的各功能模块部分的设计工作完成以后,最后整体连接到一起,就得到这个设计的完整电路,在PROTELDXP中绘制好原理图以后,下一步将其转换为PCB图,布线、修改、检查,就完成该设计硬件部分的工作。
19
3 系统软件设计
3.1 主程序设计
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20测量的当前温度值,送入主控制器进行数据处理并转换为数字信号后进行显示,其流程图如下所示。
图2.1 主程序流程图
系统软件采用C 语言编写。在中断服务程序中,实现用户输入以及上位机的接口功能;在主程序中,实现温度传感器网络的自动搜索、获取温度信息,并根据预先设定的温度上下限,实现相应的报警功能。该系统中,根据不同的分辨率要求,可通过编程设定,该流程可满足高精度设计要求。
20
3.2 子程序设计
3.2.1 测温子程序流程
图2.2 测温子系统流程图
在测温时首先设置DS18B20的DQ为高电平,然后初始化DS18B20,在成功后DS18B20接收单片机的命令,为了简单起见这里跳过ROM命令设置匹配过程,然后再次初始化DS18B20,在成功后启动测温,然后将温度保存起来,返回。3.2.2 读温度流程
图2.3 读温度流程图
读温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写,如上图。
21
3.2.3 显示模块子程序
在测得温度后,将温度数据转换为十进制数的温度表示,然后再通过查表调用液晶1602显示在液晶上,这里面数据处理类似于由二进制转换为十进制,再由十进制转换为ASCII码。
首先要对LCD进行初始化设置,写入报警温度的上、下限值,若传感器正常工作,则LCD上会显示“OK”以及当前温度,同时进行温度比较,若当时温度在设定的上下限范围内,则系统无反应,若温度超过上、下限温度,则蜂鸣器报警。
22
4 总体电路的实现与操作
4.1 设计结果的实现
在完成前期资料收集、方案构造、可行性研究以及软硬件设计工作后,就可以进入器件调试阶段。
4.1.1 电路板情况介绍
前期制作工作全部完成之后,呈现在我们面前的是制作成果:温度报警器电路板,板子上方是一块LCD1602显示屏,往下是一个蜂鸣器,一个DS18B20,一块AT89S51芯片,红、黄两个发光二极管,下方是编上号的1—4号开关按钮,两根电源线:红色线接+5V电源,蓝色线接地,另外还分布着电阻和电容。4.1.2 温度报警器功能的操作步骤
将电路板接上电源,红色线接+5V电源,蓝色线接地,电路导通后红色指示灯亮,LCD1602显示工作状态“OK”以及当前测量环境温度。按下2号键,表示开始进行设定温度,同时,2号键也为默认的上限温度调节按钮,1号键表示温度调节加减转换键,3号键调节下限温度,了解了各键的功能后,便可以开始设置上下限温度,比如说按一下3键后下限温度下降一度,按下2键后上限温度也下降一度;然后按一下1键后转换加减功能,即每次减一度变为加一度。此时再按下3键,下限温度上升一度,按下2键上限温度上升一度。根据按此方法即可设定符合测量需求的上下限温度上下限温度设定好以后,按下4键表确认,DS18B20完成温度转换后,就把当前测得的温度值与TH,TL作比较,若T>TH或T<TL,表明此时环境温度不在设定范围内,则将该器件内的告警标志置位,并对主机发出的告警搜索命令作出响应。即蜂鸣器报警,黄色二极管发亮。若当前温度在设定的上下限范围内,则报警系统继续工作,无异常反应。
23
结 论
本设计所介绍的温度计报警器与传统的温度计相比,可以设置上下报警温度,当温度不在设置范围内时,可以进行报警 ,该系统主要用于对测温比较准确的场所,或科研实验室使用。它具有结构简单,不需外接元件,可由用户设置温度报警界限等特点,可广泛用于食品库、冷库、粮库等需要控制温度的地方。DS18B20集温度测量、A/D 转换于一体, 具有体积小、动态范围宽、测量精度高、单总线结构、直接与CPU接口等特点。经试验, 基于AT89S51单片机和DS18B20 的温度测量仪,设计简单, 控制方便, 测量准确, 测温范围宽,另外,利用单总线具有很强的扩展性, 还可以组建多点的温度检测网络。因此, 基于AT89S51单片机和DS18B20的温度测量仪,具有广泛的应用前景。目前,该类产品已在温度控制系统中得到了广泛的应用。故该设计意义较为深远。同时,该方案具有安装方便、数字化程度高、精度高、适应性强等特点,在多种温度检测系统中都具有重大意义。
本设计实现了利用单片机以及DS18B20进行温度报警器的制作,通过这次设计,使我接触到了很多之前没有学习过的理论知识,毕业设计是对大学四年学习生活的总结以及学习能力的一次综合检验。通过这次设计,使我在电路知识方面有很大提高,学习并掌握了单片机应用的基本知识以及温度传感器DS18B20等芯片的使用方法;通过动手实践操作,将理论知识应用于实际,使自己的知识更加生动丰富,经过一段时间的学习和制作,最终完成了利用单片及DS18B20实现温度报警器制作的设计。
另外,通过本次设计,我了解到了温度报警器电路设计在现代生活、生产领域的重要意义及应用情况。现代社会已经步入了一个数字时代,很多使人们生活更便捷的服务都是建立在电子技术的基础上的,而单片机技术则可以看作是“基础中的基础”,可见,它已经深入了我们的生活和工作中,并发挥着巨大的作用。另外,通过这次设计还使我更加深刻地认识到网络是一个巨大的资源宝库,要学会科学合理利用这个大宝藏为我们的生活带来更多的便捷。
24
致 谢
能够完成本篇论文,在此,首先我要衷心地感谢我的毕业设计指导老师—李志伟老师, 在整个设计过程中, 李老师给了我很大的帮助,从资料收集到具体制作以及论文撰写,每当遇到困难和问题,李老师总是耐心指导,为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。在论文撰写过程中,李老师还给了我很多修改意见,李老师一丝不苟的作风,严谨求实的态度,踏踏实实的精神,他教会了我们很多课堂上学不到的东西,将使我终生受益。在此谨向李老师致以诚挚的谢意和崇高的敬意。
另外,我还要感谢在实验室一起做毕业设计的同学们,大家在一起相处得很愉快, 他们在设计中为我提供了许多好的意见和建议,有他们的帮助,我得以解决了很多设计以及调试方面的困难;我还要感谢寝室同学,他们给了我巨大的勇气和战胜困难的信心,很多同学还给我提供了不少的参考资料,在此我表示真诚的感谢~
25
参考文献(References)
[1]严芸.浅谈温度传感器的现状与发展[J].大众科技,2006,(5):38-39. [2]谭浩强.C程序设计[M].清华大学出版社,1999.
[3]杨小川.Protel DXP设计指导教程[M].清华大学出版社,2003. [4]贵国庆.LCD1602液晶显示秒表[J].电子制作,2006.(4):59-61.[ [5]朱蕤、张常年.基于AT89C51单片机的温度传感器控制电路[D].北方工业大学,2006. [6]黄继昌. 传感器工作原理及应用实例[M].人民邮电出版社.1998.[7]周航慈. 单片机程序设计基础[M].北京航空航天大学出版社.2003. [8]谢宜仁. 单片机实用技术问答[M].人民邮电出版社.2003.
[9]朱善君. 单片机接口技术与应用[M].清华大学出版社.2005.
[10]郭亨礼. 传感器实用电路[M].上海科学技术出版社.1992. [11]谢宜仁. 单片机实用技术问答[M].人民邮电出版社.2003.
[12]肖来胜.单片机技术实用教程[M].华中科技大学出版社.2004. [13]Transistor specificationsmanual.Howard W. Sams & Co., Inc[M].1972.
26
附 录(C语言程序设计)
DS18B20温度报警器显示演示程序(LCD1602显示)
开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:
DS18B20 ERROR
PLEASE CHECK
蜂鸣器报警。
DS18B20检测正常,LCD1602显示(当前所测温度):
DS18B20 OK
:C TEMP: **.*
  1. #include < reg51.h >
  2. #include < intrins.h >
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DQ = P2^2 ; //定义DS18B20端口DQ
  6. sbit BEEP=P3^4 ; //蜂鸣器驱动线
  7. bit presence ; //器件存在标志位
  8. uchar flag ; //温度正负标志位
  9. sbit LCD_RS = P3^5 ;
  10. sbit LCD_RW = P3^6 ;
  11. sbit LCD_EN = P3^7 ;
  12. uchar code cdis1[ ] = {" DS18B20 OK "} ;
  13. uchar code cdis2[ ] = {" TEMP: . C "} ;
  14. uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;
  15. uchar code cdis4[ ] = {" PLEASE CHECK "} ;
  16. uchar data temp_data[2] = {0x00,0x00} ; //读出的温度暂放
  17. uchar data display[5] = {0x00,0x00,0x00,0x00,0x00} ; //显示温度数据 uchar codeditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,
  18. 0x06,0x07,0x08,0x08,0x09,0x09} ; //温度小数部分转换表 void beep() ;
  19. uchar code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
  20. //自定义字符?(C左上方的圆圈)
  21. /*LCD延时ms程序*/
  22. void delay1(int ms)
  23. {
  24. unsigned char y ;
  25. while(ms--)
  26. {
  27. 27
  28. for(y = 250 ; y<250 ; y--)
  29. {
  30. _nop_() ;
  31. _nop_() ;
  32. _nop_() ;
  33. _nop_() ;
  34. }
  35. }
  36. }
  37. /*检查LCD忙状态*/
  38. /*lcd_busy为1时,忙,等待。lcd_busy为0时,闲,可写指令与数据。*/
  39. bit lcd_busy()
  40. {
  41. bit result ;
  42. LCD_RS = 0 ;
  43. LCD_RW = 1 ;
  44. LCD_EN = 1 ;
  45. _nop_() ;_nop_() ;_nop_() ;_nop_() ;
  46. result = (bit)(P0&0x80) ;
  47. LCD_EN = 0 ;
  48. return(result) ;
  49. }
  50. /*写指令数据到LCD*/
  51. /*RS=0,RW=0,E=高脉冲,D0-D7=指令码。*/ void lcd_wcmd(uchar cmd) {
  52. while(lcd_busy()) ; //检测LCD是否忙碌
  53. LCD_RS = 0 ;
  54. LCD_RW = 0 ;
  55. LCD_EN = 0 ;
  56. _nop_() ;
  57. _nop_() ;
  58. P0 = cmd ;
  59. _nop_() ;_nop_() ;_nop_() ;_nop_() ;
  60. LCD_EN = 1 ;
  61. _nop_() ;_nop_() ;_nop_() ;_nop_() ;
  62. LCD_EN = 0 ;
  63. }
  64. /*写显示数据到LCD*/
  65. /*RS=1,RW=0,E=高脉冲,D0-D7=数据。*/ void lcd_wdat(uchar dat) {
  66. while(lcd_busy()) ; //检测LCD是否忙碌
  67. LCD_RS = 1 ;
  68. LCD_RW = 0 ;
  69. LCD_EN = 0 ;
  70. P0 = dat ;
  71. _nop_() ;_nop_() ;_nop_() ;_nop_() ;
  72. LCD_EN = 1 ;
  73. 28
  74. _nop_() ;_nop_() ;_nop_() ;_nop_() ;
  75. LCD_EN = 0 ;
  76. }
  77. /*LCD初始化设定*/
  78. void lcd_init()
  79. {
  80. delay1(15) ;
  81. lcd_wcmd(0x01) ; //清除LCD的显示内容
  82. delay1(5) ;
  83. lcd_wcmd(0x38) ; //功能设置:8位数据,16*2双行显示,5*7点阵
  84. delay1(5) ;
  85. lcd_wcmd(0x0c) ; //整体显示(D=1),关光标(C=0),字符不闪烁(B=0)
  86. delay1(5) ;
  87. lcd_wcmd(0x06) ; //设定输入方式,增量不移位
  88. delay1(5) ;
  89. lcd_wcmd(0x01) ; //清除LCD的显示内容
  90. delay1(5) ;
  91. }
  92. /*设定显示位置*/
  93. void lcd_pos(uchar pos)
  94. {
  95. lcd_wcmd(pos | 0x80) ; //按位或,即:数据指针=80+地址变量(DDRAM的固有格式) }
  96. /*自定义字符写入CGRAM(字符发生器)*/
  97. void writetab()
  98. {
  99. unsigned char i ;
  100. lcd_wcmd(0x40) ; //写CGRAM,00H
  101. for (i = 0 ; i< 8 ; i++)
  102. lcd_wdat(mytab[ i ]) ; //写入数据自定义字符?(C左上方的圆圈)
  103. }
  104. /*15us级延时函数*/
  105. void Delay15us(uchar num)
  106. {
  107. do
  108. { _nop_() ;_nop_() ;_nop_() ;
  109. _nop_() ;_nop_() ;_nop_() ;
  110. _nop_() ;_nop_() ;_nop_() ;
  111. _nop_() ;_nop_() ;_nop_() ;
  112. _nop_() ;
  113. }while( --num ) ;
  114. }
  115. /*初始化DS18B20,复位脉冲+存在脉冲*/
  116. Init_DS18B20(void)
  117. {
  118. DQ = 1 ; //DQ复位
  119. Delay15us(3) ; //稍做延时
  120. DQ = 0 ; //单片机将DQ拉低,发出复位脉冲(要求480us~960us)
  121. 29
  122. Delay15us(40) ; //精确延时600us
  123. DQ = 1 ; //拉高总线,产生复位脉冲,释放总线(要求16~60us)
  124. Delay15us(3) ;
  125. presence = DQ ; //读存在脉冲。如果=0 器件存在,初始化成功;
  126. //=1 器件不存在,初始化失败
  127. Delay15us(6) ;
  128. DQ = 1 ;
  129. return(presence) ; //返回信号,0= presence,1= no presence
  130. }
  131. /*读一个8位的字节,从DS18B20中读取数据*/
  132. ReadOneChar(void)
  133. {
  134. unsigned char i = 0 ;
  135. unsigned char dat = 0 ;
  136. for (i = 8 ; i > 0 ; i--)
  137. {
  138. DQ = 0 ; //清零
  139. _nop_() ; //延时1us以上
  140. _nop_() ;
  141. dat >>= 1 ; //右移位
  142. DQ = 1 ; //释放总线,等待DS18B20输出数据
  143. _nop_() ; //data sheet要求大于1us小于15us时间段内控制器采样
  144. _nop_() ;
  145. if(DQ) //控制器采样
  146. dat |= 0x80 ; //若采样位为1,则将dat相应的位置1,否则将由第一句的移位置0
  147. Delay15us(6) ; //延时90us,data sheet要求所有的读时间间隙最少为60us
  148. }
  149. return (dat) ; //将读出的数据返回给调用函数
  150. }
  151. /*写一个8位的字节,写入数据(命令)*/
  152. WriteOneChar(unsigned char dat) {
  153. unsigned char i = 0 ;
  154. for (i = 8 ; i > 0 ; i--)
  155. {
  156. DQ = 0 ; //清零,写位操作均从零开始,无论写1还是写0
  157. _nop_() ; //延时1us以上
  158. _nop_() ;
  159. DQ = dat&0x01 ; //取传递过来的函数的最低位,并发送出去
  160. Delay15us(6) ; //延时90us,data sheet要求大于60小于120us,
  161. DQ = 1 ; //释放总线
  162. dat>>=1 ; //数据向低端移位1位
  163. }
  164. }
  165. /*读取温度*/
  166. Read_Temperature(void)
  167. {
  168. Init_DS18B20() ; //初始化
  169. WriteOneChar(0xCC) ; //跳过读序号列号的操作
  170. 30
  171. WriteOneChar(0x44) ; //启动温度转换
  172. Init_DS18B20() ;
  173. WriteOneChar(0xCC) ; //跳过读序号列号的操作
  174. WriteOneChar(0xBE) ; //读取温度寄存器(共可读取9个寄存器,前两个就是温
  175. 度)
  176. temp_data[0] = ReadOneChar() ; //温度低8位
  177. temp_data[1] = ReadOneChar() ; //温度高8位 }
  178. /*数据转换与温度显示*/
  179. Disp_Temperature()
  180. {
  181. flag = 0 ;
  182. if( temp_data[1] > 0x7f ) //判断正、负数
  183. {
  184. temp_data[1]=0x100-temp_data[1] ; //用于负温度求补码,两者相加为256(8位)
  185. temp_data[0]=0x100-temp_data[0] ;
  186. flag = 1 ;
  187. }
  188. display[4]=temp_data[0]&0x0f ; //低字节的低4位,即为温度值的小数部分
  189. display[0]=ditab[display[4]]+0x30 ; //存放小数部分,查表得小数位的值
  190. display[3]=display[4]/100+0x30 ; //百位数转换
  191. display[1]=display[4]%100 ;
  192. display[2]=display[1]/10+0x30 ; //十位数转换
  193. display[1]=display[1]%10+0x30 ; //个位数转换
  194. if(display[3]==0x30) //判断是否高位为0
  195. {
  196. display[3]=0x20 ; //显示空格,即不显示
  197. if(display[2]==0x30) //判断次高位是否为0
  198. {
  199. display[2]=0x20 ; //显示空格,即不显示
  200. }
  201. }
  202. if( flag==1 )
  203. {
  204. display[3]=0x2d ; //负温度时最高位显示“-”
  205. }
  206. lcd_pos(0x48) ;
  207. lcd_wdat(display[3]) ; //百位数显示
  208. lcd_pos(0x49) ;
  209. lcd_wdat(display[2]) ; //十位数显示
  210. lcd_pos(0x4a) ;
  211. lcd_wdat(display[1]) ; //个位数显示
  212. lcd_pos(0x4c) ;
  213. lcd_wdat(display[0]) ; //小数位数显示 }
  214. /*蜂鸣器响一声*/
  215. void beep()
  216. {
  217. unsigned char y ;
  218. for (y=0 ; y<100 ; y++)
  219. 31
  220. {
  221. delay1(2) ;
  222. BEEP=!BEEP ; //BEEP取反,低电平发声
  223. }
  224. BEEP=1 ; //关闭蜂鸣器
  225. uchar m ;
  226. lcd_init() ; //初始化LCD
  227. lcd_pos(0) ; //设置显示位置为第一行的第1个字符
  228. m = 0 ;
  229. while(cdis1[m] != '\0')
  230. {
  231. lcd_wdat(cdis1[m]) ; //显示字符(DS18B20 OK)
  232. m++ ;
  233. }
  234. lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
  235. m = 0 ;
  236. while(cdis2[m] != '\0')
  237. {
  238. lcd_wdat(cdis2[m]) ; //显示字符(TEMP:××.×C),即当前所测温度
  239. m++ ;
  240. }
  241. writetab() ; //自定义字符写入CGRAM
  242. delay1(5) ;
  243. lcd_pos(0x4d) ;
  244. lcd_wdat(0x00) ; //显示自定义字符
  245. }
  246. /*DS18B20 ERROR 显示菜单*/
  247. void Error_Menu ()
  248. {
  249. uchar m ;
  250. lcd_init() ; //初始化LCD
  251. lcd_pos(0) ; //设置显示位置为第一行的第1个字符
  252. m = 0 ;
  253. while(cdis3[m] != '\0')
  254. {
  255. lcd_wdat(cdis3[m]) ; //显示字符(DS18B20 ERR0R)
  256. m++ ;
  257. }
  258. lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
  259. m = 0 ;
  260. while(cdis4[m] != '\0')
  261. {
  262. lcd_wdat(cdis4[m]) ; //显示字符(PLEASE CHECK)
  263. m++ ;
  264. }
  265. }
  266. /*主函数*/
  267. void main()
  268. {
  269. Ok_Menu () ;
  270. do
  271. {
  272. Read_Temperature() ;
  273. 32
  274. Disp_Temperature() ;
  275. }
  276. while(!presence) ;
  277. Error_Menu () ;
  278. do
  279. {
  280. Init_DS18B20() ;
  281. beep() ;
  282. }
  283. while(presence) ; }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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