找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的数字温度计-智能仪器课程设计论文模板

[复制链接]
跳转到指定楼层
楼主
ID:390007 发表于 2018-8-25 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目     基于单片机的数字温度计设计
作 者 姓 名      张   三      
专 业 班 级                  
学       号                    
指导教师姓名                    

摘要
随着国民经济的发展,人们需要对各中加热炉、热处理炉、反应炉和锅炉中温度进行监测和控制。采用单片机来对他们控制不仅具有控制方便,简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。
在日常生活及工业生产过程中,经常要用到温度的检测及控制,温度是生产过程和科学实验中普遍而且重要的物理参数之一。在生产过程中,为了高效地进行生产,必须对它的主要参数,如温度、压力、流量等进行有效的控制。温度控制在生产过程中占有相当大的比例。温度测量是温度控制的基础,技术已经比较成熟。传统的测温元件有热电偶和热敏电阻,而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,这些方法相对比较复杂,需要比较多的外部硬件支持。本文采用一种相对比较简单的方式来测量。
本文介绍一种基于AT89C51单片机的温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围-50℃-110℃,使用LED数码管显示,能设置温度报警上下限。正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,AT89C51单片机的功能和应用等。本文设计的电路通过Proteus软件仿真实现,并在单片机开发板中进行了实现。


ABSTRACT
Along with the development of national economy , people need to monitor and the control all kinds of the temperature of heating furnace,the heat-treatment furnace, the reactor and the boiler. Not only using the single chip machine can make control becoming convenient, simple and flexibility, but also it enhance the technical specification of controled temperature in large scale, which as a result can improve the quality and quantity.of products efficiently.

During daily life and industrial production process, the detection and control of temperature always play an important role, temperature is one of the general but important physical parameter in the production process and scientific experiments. In the production process, in order to carry out the production efficiently, it’s necessary to control its main parameters effectively, such as temperature, pressure, flow control, etc. Temperature control occupy a large proportion in the production process. Temperature measurement is the basis of temperature control,which technology has been matured. The thermocouple and thermal resistance are traditional temperature measured components, which receivce voltage and then replace into the corresponding temperature.These methods are rather complex relatively, which requiring a large number of external hardware support. In this paper,we use a relatively simple method to measure it.

This paper introduced a temperature measurement and alerting electrocircuits based MCU-AT89C51, the electrocircuits uses DS18B20 as its temperature sensor with measuring scope range from -50℃to100℃ which uses the seven segments LED to display the current temperature and it can set the warning limitation. The paper focuses on providing the components electrocircuit of the software and hardware system, and introduces the theory of DS18B20, the founctions and application of AT89C51.The electrocircuits designed in this paper was realized and simulated in Proteus,which has also been realized in the developing-board of MCU.

目录

摘  要
ABSTRACT
第一章  绪论
1.1课题背景及研究意义
1.2国内外现状
1.3设计目的
1.4课题的主要工作
1.5本文研究内容
第二章  系统概述
2.1方案选择
2.1.1主控制部分
2.1.2 温度传感器部分
2.1.3显示电路部分
2.1.4报警电路部分
2.2系统总体方案
第三章  系统硬件设计
3.1 80C51单片机的介绍
3.1.1引脚功能说明
3.1.2时钟电路
3.1.3复位电路
3.2  LED显示部分
3.2.1 LED数码管的管脚
3.2.2数码管驱动电路
3.3 DS18B20部分
3.3.1 DS18B20管脚功能
3.3.2 DS18B20驱动电路
3.3.3DS18B20测温原理
3.3.4 DS18B20工作过程
3.3.5 DS18B20使用中的注意事项
3.4报警电路部分设计
3.5按键部分
第四章  系统软件设计
4.1主程序流程图
4.2数码管显示子程序流程图
4.3 DS18B20读取温度子程序流程图
4.4按键扫描子程序流程图
4.5报警子程序流程图
第五章  系统仿真
5.1仿真软件简介
5.1.1 Keil软件简介
5.1.2 Proteus简介
5.2仿真结果
5.2.1仿真总体设计图
5.2.2温度显示仿真
5.2.3温度设定仿真
5.2.4报警仿真
第六章 系统开发板实现
6.1 AT89C51单片机开发板简介
6.2开发板连线及效果图
第七章 课题总结
7.1系统评价
7.1.1系统的优点
7.1.2系统的缺点
7.1.3将来可能改进的方向
7.2课题结论
参考文献
致  谢
附  录:源程序代码

绪论

1.1课题背景及研究意义

随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。传统的温度采集方法不仅费时费力,而且精度差,单片机的出现使得温度的采集和数据处理问题能够得到很好的解决。温度是工业对象中的一个重要的被控参数。传统的控制方式以不能满足高精度,高速度的控制要求,如温度控制表温度接触器,其主要缺点是温度波动范围大,由于主要通过控制接触器的通断时间比例来达到改变加热功率的目的,受仪表本身误差和交流接触器的寿命限制,通断频率很低。近几年来快速发展了多种先进的温度控制方式,如:PID控制,模糊控制,神经网络及遗传算法控制等。这些控制技术大大的提高了控制精度,不但使控制变得简便,而且使产品的质量更好,降低了产品的成本,提高了生产效率[1]。

本设计使用单片机作为核心进行控制。单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛的用途。

1.2国内外现状

温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。成熟的温控产品主要以“点位”控制及常规的PID控制器为主,它们只能适应一般温度系统控制,而用于较高控制场合的智能化、自适应控制仪表,国内技术还不十分成熟,形成商品化并广泛应用的控制仪表较少。随着我国经济的发展及加入WTO,我国政府及企业对此都非常重视,对相关企业资源进行了重组,相继建立了一些国家、企业的研发中心,开展创新性研究,使我国仪表工业得到了迅速的发展。

自70年代以来,由于工业过程控制的需要,特别是在微电子技术和计算机技术的迅猛发展,以及自动控制理论和设计方法发展的推动下,国外温度控制系统发展迅速,并在智能化自适应参数自整定等方面取得成果。在这方面以日本、美国、德国、瑞典等国技术领先,并且都生产出了一批商品化的性能优异的温度控制器及仪器仪表,目前,国外温度控制系统及仪表正朝着高精度智能化、小型化等方面快速发展。

温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。成熟的温控产品主要以“点位”控制及常规的PID控制器为主,它们只能适应一般温度系统控制,而用于较高控制场合的智能化、自适应控制仪表,国内技术还不十分成熟,形成商品化并广泛应用的控制仪表较少。

1.3设计目的

1. 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。

2. 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力。

3. 通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。

4.通过设计实现一定的智能功能,培养学术能力和科研能力。

1.4课题的主要工作

本设计主要研究单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。

主要要求如下:

1.设置温度范围为: -50℃-110℃;

2.精度误差小于0.5℃,LED数码直读显示;

3. LED数码直读显示;

4.可以任意设定温度的上下限报警功能。

1.5本文研究内容

本文是基于AT89C51单片机,采用数字温度传感器DS18B20,利用DS18B20不需要A/D转换,可直接进行温度采集显示,报警的数字温度计设计。包括传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。


第二章  系统概述

2.1方案选择

该系统主要由主控部分、温度传感部分、显示部分、报警部分等电路组成,每部分实现的方法都有很多种,现把常见的实现方案列出并进行比较。

2.1.1主控制部分

方案一:采用PC机实现

此方案采用PC机实现。它可在线编程,可在线仿真的功能,这让调试变得方便。且人机交互友好。但是PC机输出信号不能直接与DS18B20通信。需要通过RS232电平转换兼容,硬件的合成在线调试,较为繁琐,很不简便。而且在一些环境比较恶劣的场合,PC机的体积大,携带安装不方便,性能不稳定,给工程带来很多麻烦。

方案二:采用AT89C51八位单片机实现

此方案采用AT89C51八位单片机实现。单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC机通信。运用主从分布式思想,由一台上位机(PC微型计算机),下位机(单片机)多点温度数据采集,组成两级分布式多点温度测量的巡回检测系统,实现远程控制。另外AT89C51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。

最终方案:采用AT89C51八位单片机实现

2.1.2 温度传感器部分

温度检测系统有共同的特点:环境复杂、布线分散、测量点多、现场离监控室远等,这都会使检测系统的稳定性和可靠性下降 。因此需要针对这些特点选择合适的测温方案,常见的有以下三种方案。

方案一:采用热敏电阻

采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。而且在温度测量系统中,采用单片温度传感器,比如AD590,LM35等.但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使得测温装置的结构较复杂。另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量.即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度[2]。

方案二:采用热电偶温差电路

采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成,热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。数据采集部分则使用带有A/D 通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D 转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D 转换电路,感温电路比较麻烦[2]。

方案三:采用数字温度芯片DS18B20测量温度

采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS1820和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大,且由于AT89C51可以带多个DSB1820,因此可以非常容易实现多点测量。轻松的组建传感器网络[3]。

采用温度芯片DS18B20测量温度,可以体现系统芯片化这个趋势。部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快。而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度。所以集成芯片的使用将成为电路发展的一种趋势。

最终方案:采用数字温度芯片DS18B20测量温度

2.1.3显示电路部分

方案一:LED数码管显示:

成本低、电路设计简单、亮度高、夜间及光照差的情况无需额外光源;

方案二:LCD1602显示

显示信息丰富、电路设计简单,但是价格相对较高,而且夜间没有背光。

最终方案:LED数码管显示

2.1.4报警电路部分

方案一:单片机控制继电器控制220V闹铃及闪光灯;

方案二:通过单片机控制蜂鸣器报警,控制发光二极管交替点亮形成闪光效果;

最终方案:通过单片机控制蜂鸣器报警,控制发光二极管交替点亮形成闪光效果。

2.2系统总体方案

经过各部分方案选择与汇总,得到系统总体方案。系统主控电路采用AT89C51单片机,温度传感器部分采用DS18B20,显示部分4位LED共阴极数码管,报警部分采用蜂鸣器与发光二极管实现报警,系统如图2-1所示。

图2-1 系统总体图


第三章  系统硬件设计

3.1 80C51单片机的介绍

80C51有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。80C51的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成[4]。单片机引脚如图3-1所示。

3.1.1引脚功能说明

图3-1  AT89C51单片机管脚图

1.时钟电路引脚XTAL1 和XTAL2:

(1)XTAL2(18 脚):接外部晶体和微调电容的一端;在8051 片内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体固有频率。若需采用外部时钟电路时,该引脚输入外部时钟脉冲。

要检查8051/8031 的振荡电路是否正常工作,可用示波器查看XTAL2 端是否有脉冲信号输出。

(2)XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。

2.控制信号引脚RST,ALE,PSEN 和EA:

(1)RST/VPD(9 脚):RST 是复位信号输入端,高电平有效。当此输入端保持备用电源的输入端。当主电源Vcc 发生故障,降低到低电平规定值时,将+5V 电源自动两个机器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。RST 引脚的第二功能是VPD,即接入RST 端,为RAM 提供备用电源,以保证存储在RAM 中的信息不丢失,从而合复位后能继续正常运行。

(2)ALE/PROG(30 脚):地址锁存允许信号端。当8051 上电正常工作后,ALE 引脚不断向外输出正脉冲信号,此频率为振荡器频率fOSC 的1/6。CPU 访问片外存储器时,ALE 输出信号作为锁存低8 位地址的控制信号。

平时不访问片外存储器时,ALE 端也以振荡频率的1/6 固定输出正脉冲,因而ALE 信号可以用作对外输出时钟或定时信号。如果想确定8051/8031 芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出。如有脉冲信号输出,则8051/8031 基本上是好的。

ALE 端的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。

此引脚的第二功能PROG 在对片内带有4KB EPROM 的8751 编程写入(固化程序)时,作为编程脉冲输入端。

(3)PSEN(29 脚):程序存储允许输出信号端。在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。此引肢接EPROM 的OE 端(见后面几章任何一个小系统硬件图)。PSEN 端有效,即允许读出EPROM/ROM 中的指令码。PSEN 端同样可驱动8个LS 型TTL 负载。要检查一个8051/8031 小系统上电后CPU 能否正常到EPROM/ROM 中读取指令码,也可用示波器看PSEN 端有无脉冲输出。如有则说明基本上工作正常。

(4)EA/Vpp(31 脚):外部程序存储器地址允许输入端/固化编程电压输入端。当EA 引脚接高电平时,CPU只访问片内EPROM/ROM并执行内部程序存储器中的指令,但当PC(程序计数器)的值超过0FFFH(对8751/8051 为4K)时,将自动转去执行片外程序存储器内的程序。当输入信号EA 引脚接低电平(接地)时,CPU 只访问外部EPROM/ROM 并执行外部程序存储器中的指令,而不管是否有片内程序存储器。对于无片内ROM 的8031 或8032,需外扩EPROM,此时必须将EA 引脚接地。此引脚的第二功能是Vpp 是对8751 片内EPROM固化编程时,作为施加较高编程电压(一般12V~21V)的输入端。

3.输入/输出端口P0/P1/P2/P3:

(1)P0口(P0.0~P0.7,39~32 脚):P0口是一个漏极开路的8 位准双向I/O口。作为漏极开路的输出端口,每位能驱动8 个LS 型TTL负载。当P0 口作为输入口使用时,应先向口锁存器(地址80H)写入全1,此时P0 口的全部引脚浮空,可作为高阻抗输入。作输入口使用时要先写1,这就是准双向口的含义。在CPU 访问片外存储器时,P0口分时提供低8 位地址和8 位数据的复用总线。在此期间,P0口内部上拉电阻有效。

(2)P1口(P1.0~P1.7,1~8 脚):P1口是一个带内部上拉电阻的8 位准双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入口使用时,应先向P1口锁存地址(90H)写入全1,此时P1口引脚由内部上拉电阻拉成高电平。

(3)P2口(P2.0~P2.7,21~28 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外EPROM/RAM 时,它输出高8 位地址。

(4)P3口(P3.0~P3.7,10~17 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端口有很大的区别,它的每个引脚都有第二功能,详见表3-1。

表3-1  P3口的第二功能

引脚

第二功能

信号名称

P3.0

RXD

串行数据接收

P3.1

TXD

串行数据发送

P3.2

外部中断0申请

P3.3

外部中断1申请

P3.4

T0

定时器/计数器0的外部输入

P3.5

T1

定时器/计数器1的外部输入

P3.6

外部RAM写选通

P3.7

外部RAM读选通


3.1.2时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各地信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。单片机的时钟电路,如图3-2所示。

图3-2  时钟振荡电路

一般电容C1,C2取22pF左右,晶体X1的振荡频率范围是1.2MHz~12 MHz 。晶体振荡频率高, 则系统的时钟频率也高, 单片机运行速度也就快。MCS-51在通常应用情况下,使用振荡频率为的6MHz或12MHz。本设计采用12MHz的振荡频率。

3.1.3复位电路

单片机复位的条件是:必须使RST/VPD 或RST引脚(9)加上持续二个机器周期(即24个振荡周期)的高电平。单片机常见的复位电路如图3-3所示。该电路除具有上电复位功能外,若要复位,只需按图3-3中的“复位”键,此时电源VCC经电阻R2、R8分压,在RST端产生一个复位高电平。

图3-3复位电路

3.2  LED显示部分

3.2.1 LED数码管的管脚

本设计采用4位LED共阴极数码管显示,数码管均为7段数码管,共有12个管脚,其中1—4管脚用于位选,5—12脚显示段码,数码管如图3-4所示。

图3-4  LED数码管管脚图

3.2.2数码管驱动电路

驱动电路使用2片74HC573锁存器驱动。74HC573是8位数据锁存器,主要用于数码管、按键等等的控制与驱动。驱动电路如图3-5所示。

图3-5 数码管驱动电路

3.3 DS18B20部分

DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3 根或2 根线上,CPU只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便[5]。DS18B20如图3-6所示。

图3-6  DS18B20引脚图

1.DS18B20有4个主要的数据部件:

(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625℃/LSB形式表达,其中S为符号位。

(3)DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器 TH、TL和结构寄存器。

(4)配置寄存器。

2.DS18B20内部结构及功能:

DS18B20的内部结构如图4-7所示。主要包括:寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分

3.3.1 DS18B20管脚功能

DS18B20引脚功能如表3-2所示[7]。

表3-2 DS18B20管脚功能表

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。当工作于寄生电源时此引脚必须接地。


3.3.2 DS18B20驱动电路

在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时VDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接上拉电阻。我们采用的是第一种方法,如图3-7所示

图3-7 DS18B20驱动电路

3.3.3DS18B20测温原理

DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。

3.3.4 DS18B20工作过程

1.温度的读取:

DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。

2.DS18B20的初始化:

(1)先将数据线置高电平“1”。

(2)延时(该时间要求的不是很严格,但是尽可能的短一点)。

(3)数据线拉到低电平“0”。

(4)延时750微秒(该时间的时间范围可以从480到960微秒)。

(5)数据线拉到高电平“1”。

(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制

(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

(8)将数据线再次拉高到高电平“1”后结束。

3.DS18B20的写操作:

(1)数据线先置低电平“0”。

(2)延时确定的时间为15微秒。

(3)按从低位到高位的顺序发送字节(一次只发送一位)。

(4)延时时间为45微秒。

(5)将数据线拉到高电平。

(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。

(7)最后将数据线拉高。

4.DS18B20的读操作:

(1)将数据线拉高“1”。

(2)延时2微秒。

(3)将数据线拉低“0”。

(4)延时15微秒。

(5)将数据线拉高“1”。

(5)延时15微秒。

(6)读数据线的状态得到1个状态位,并进行数据处理。

(7)延时30微秒。

3.3.5 DS18B20使用中的注意事项

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

1. DS18B20 从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。

2. 在实际使用中发现,应使电源电压保持在5V 左右,若电源电压过低,会使所测得的温度精度降低。

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

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

5. 在DS18B20测温程序设计中,向DS18B20 发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20 接触不好或断线,当程序读该DS18B20 时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视[8]。

3.4报警电路部分设计

闪光灯部分主要由发光二极管LED组成,红灯交替闪烁实现闪光功能以表示报警状态。单片机的P1.0和P1.1口分别控制LED灯D1和D2的开关,在两个二极管加1k的保护电阻,防止电流过大烧坏二极管[6]。

蜂鸣器由NPN三极管驱动,由单片机P1.3口提供控制信号,并传送至三极管的基极,引起蜂鸣器发声。报警电路图如图3-7所示。

图3-7 报警电路

3.5按键部分

本系统按键部分设置了三个按键,分别是“SET”、“ADD”、“DEC”键,分别实现功能选定和报警温度的加减。按键分别经三个上拉电阻接+5V电源。按键放开时,单片机管脚输入高电平;按键按下时,单片机管脚接地,输入低电平。按键采用软件消抖。按键电路设计如图3-8所示。

图3-8 按键电路


第四章  系统软件设计

系统程序主要包括:主程序、数码管显示子程序、DS18B20读取温度子程序、按键扫描子程序、报警子程序等五部分组成[9]。

4.1主程序流程图

主程序实现按键的判断,在无按键按下的情况下读取并显示温度;若有按键按下,则进行报警上下限温度的设定;每次读取显示温度后与报警温度比较,若正常则继续读取温度,否则将进行报警。程序流程图如图4-1所示。

图4-1 主程序流程图

4.2数码管显示子程序流程图

数码管显示子程序:先读取需要显示的数值t,然后判断t的正负;若t为负则在最高位显示“-“号,然后扫描显示t的百位、十位、各位、小数;若t不为负则直接扫描显示。程序流程图如图4-2所示。

图4-2数码管显示子程序流程图

4.3 DS18B20读取温度子程序流程图

该子程序实现了DS18B20的初始化,并读出温度数据,最后进行数值转换并返回该数值。流程图如图4-3所示。

图4-3 读取温度子程序流程图

4.4按键扫描子程序流程图

按键采用扫描查询方式,其中按键采用了软件消抖。其中功能标志位func=0时,显示当前温度;func=1时,设置温度上限;func=2时,设置温度下限;func>=3时,令func=1,并显示当前温度。程序流程图如图4-4所示。

图4-4 按键扫描子程序流程图

4.5报警子程序流程图

该子程序实现系统的声光报警,程序流程图如图4-5所示。

图4-5报警子程序流程图


第五章  系统仿真

系统仿真过程主要用到了Keil和Proteus两个软件,其中Keil用于程序的编译以及生成.hex格式的烧录文件,Proteus用于系统的仿真。

5.1仿真软件简介

5.1.1 Keil软件简介

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。Keil C51软件是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。软件图标如图5-1所示。

图5-1 Keil软件

5.1.2 Proteus简介

Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。其处理器模型支持8051、PIC、AVR、ARM、8086等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它支持IAR、Keil和MPLAB等多种编译器[10]。软件图标如图5-2所示。

图5-2 Proteus软件

该软件的特点是:

1. 容易实现单片机仿真。

2. 提供了多种虚拟仪器。如示波器、逻辑分析仪、信号发生器等,调试非常方便。

3. 提供软件调试功能,同时支持第三方的软件编译和调试环境,如Keil、Matlab等软件。

4. 具有强大的原理图绘制功能。

5.2仿真结果

5.2.1仿真总体设计图

总体设计图如图5-3所示。

图5-3仿真总体设计图

5.2.2温度显示仿真

当温度在正常范围时,LED数码管正常显示当前温度。如图5-4所示。

图5-4温度显示仿真

5.2.3温度设定仿真

当按下一次SET键时,可以通过ADD键和DEC键设置报警温度上限;当按下二次SET键时,可以通过ADD键和DEC键设置报警温度下限;按下三次SET键时,返回,并显示当前温度。如图5-5所示。

图5-5 温度设定仿真

5.2.4报警仿真

设置环境温度为31.0,高于报警温度上限30.0。此时仿真系统中,蜂鸣器发出警报声,二极管交替闪光报警。


第六章 系统开发板实现

6.1 AT89C51单片机开发板简介

该开发板采用独立模块式结构,大部分模块都是完全独立的,仅有电源部分连接,信号接口部分默认悬空,需要用到该器件时,可用杜邦线连接到对应的单片机端口,不使用时悬空即可。这种方式大大提高了自由度,模块完全独立,可以自由配置端口。开发板集成了AT89C51单片机、DS18B20温度传感模块、4位共阴极LED数码管、74HC573锁存器、独立按键、发光二极管等模块,可完全满足本设计需求。开发板总体图如图6-1(a)所示。

6.2开发板连线及效果图

如图6-1所示:当系统接通电源后,显示当前温度,如图6-1(a)所示;当第一次按下SET键时,系统显示报警上限温度“30.0”,此时按ADD键和DEC键,可实现上限温度的设定,如图6-1(b)所示;当第二次按下SET键时,系统显示报警下限温度“20.0”,此时按ADD键和DEC键,可实现下限温度的设定,如图6-1(c)所示;当再次按下SET键时,系统返回,并显示当前温度,如图6-1(d)所示。

图6-1系统开发板实现


第七章 课题总结

7.1系统评价

系统评价就是客观、公正的从各个方面评价系统的各项功能。本部分将具体从三方面阐述:优点,缺点以及将来可能改进的方向。

7.1.1系统的优点

(1)该系统实现了温度的实时转换,而且转换精度达到0.1度。

(2)温度显示清晰,无需额外光源,可适应各种光照环境。

(3)提供温度报警上下限的自由设定。

(4)温度不正常时,高响度的蜂鸣器报警和醒目的闪光灯设计。

(5)设计简单,易于维护,低功耗,成本低廉。

7.1.2系统的缺点

(1)由于时间及经费原因,未能实现系统的封装与产品化。

(2)测温范围较窄,无法测量超过125度的高温。

(3)系统的稳定性还有待加强。

7.1.3将来可能改进的方向

(1)将系统与PC机连接,实现通过PC机的远程控制;

(2)实现智能化,如加入语音报告温度,按键改进为触摸屏,已获得更好的用户体验;

(3)将系统进行封装,并将体积压缩,以实现设计的产品化。

7.2课题结论

经过不断实践与探索,基于单片机的数字温度计设计己经完成,基本上达到了预期的设计要求和目的。该系统可实现温度的实时转换显示,以及设置温度报警上下限的功能。该数字温度计的转换精度高,速度快,操作简单,功耗低,成本低廉。

通过课程设计,我学到了很多知识,也提高了自己的科研和学术能力。在设计中搜集资料,调试程序的过程让我受益匪浅。课程设计不仅是对我在大学所学知识的一个综合运用,也是一次增长知识和经验的好机会,同时也使我学会了许多处理、解决问题的方法,大大提高了自己的动手能力,为即将走上工作岗位打下了良好的基础。

由于时间和经费原因,系统的功能还有待完善,希望以后有机会对该系统进行进一步的设计和改进。

总之,该课题得到了成功的实现。


附  录:源程序代码


  1. //课程设计题目《基于单片机的数字温度计设计》//
  2. //学校:       齐鲁***************//
  3. //学院:       *********//
  4. //专业:       ***************//
  5. //姓名:       *****************//
  6. //学号:     **************//
  7. //时间:       *****************//

  8. #include "reg51.h"
  9. #define DataPort P0     //定义数据端口程序中遇到DataPort 则用P0 替换
  10. sbit LATCH1=P2^2;     //定义锁存使能端口 段锁存
  11. sbit LATCH2=P2^3;     //                 位锁存
  12. sbit DQ = P1^0;      //定义ds18B20总线IO
  13. sbit set=P3^5;         //温度设置切换键
  14. sbit add=P3^4;        //温度加
  15. sbit dec=P3^3;        //温度减
  16. sbit bj=P1^3;         //蜂鸣器
  17. sbit fg1=P1^1;        //指示灯
  18. sbit fg2=P1^2;
  19. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,
  20.                    0x6d,0x7d,0x07,0x7f,0x6f};   // 显示段码值0~9
  21. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,
  22.                    0xef,0xdf,0xbf,0x7f};   //分别对应相应的数码管点亮,即位码
  23. unsigned char TempData[8];                 //存储显示值的全局变量
  24. int func=0,i=0;                           //设置温度的标志位
  25. unsigned int high=280,low=200,tempera=0;

  26. /****************************延时子函数***************************************/
  27. void delay(int num)//延时函数
  28. {
  29.               while(num--) ;
  30. }

  31. /******************************初始化DS18B20*******************************/
  32. void Init_DS18B20() //初始化ds1820
  33. {
  34.               unsigned char x=0;
  35.               DQ = 1;        //DQ复位
  36.               delay(8);       //稍做延时
  37.               DQ = 0;       //单片机将DQ拉低
  38.               delay(80);      //精确延时 大于 480us
  39.               DQ = 1;       //拉高总线
  40.               delay(14);
  41.               x=DQ;        //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  42.               delay(20);
  43. }

  44. /*********************DS18B20读一个字节***********************************/
  45.    unsigned char ReadOneChar()  //读一个字节
  46. {
  47.               unsigned char i=0;
  48.               unsigned char dat = 0;
  49.               for (i=8;i>0;i--)
  50.               {
  51.                             DQ = 0;     // 给脉冲信号
  52.                             dat>>=1;
  53.                             DQ = 1;     // 给脉冲信号
  54.                             if(DQ)
  55.                             dat|=0x80;
  56.                             delay(4);
  57.               }
  58.               return(dat);
  59. }

  60. /****************************DS18B20写一个字节*******************************/
  61. void WriteOneChar(unsigned char dat)  //写一个字节
  62. {
  63.               unsigned char i=0;
  64.               for (i=8; i>0; i--)
  65.               {
  66.                             DQ = 0;
  67.                             DQ = dat&0x01;
  68.                             delay(5);
  69.                             DQ = 1;
  70.                             dat>>=1;
  71.               }
  72. }

  73. /***************************读取温度并进行转换*******************************/
  74. unsigned int Readtemp()   //读取温度
  75. {
  76.               unsigned char a=0;
  77.               unsigned char b=0;
  78.               unsigned int t=0;
  79.               float tt=0;
  80.               Init_DS18B20();
  81.               WriteOneChar(0xCC); // 跳过读序号列号的操作
  82.               WriteOneChar(0x44);   // 启动温度转换
  83.               Init_DS18B20();
  84.               WriteOneChar(0xCC); //跳过读序号列号的操作
  85.               WriteOneChar(0xBE); //读取温度寄存器
  86.               a=ReadOneChar();    //连续读两个字节数据   //读低8位
  87.               b=ReadOneChar();                        //读高8位
  88.               t=b;
  89.               t<<=8;
  90.               t=t|a;               //两字节合成一个整型变量。
  91.     tt=t*0.0625;         //得到真实十进制温度值,因为DS18B20可以精确到0.0625
  92.                           //度,所以读回数据的最低位代表的是0.0625度
  93.               t= tt*10+0.5;        //放大十倍,这样做的目的将小数点后第一位也转换为可显
  94.                           //示数字,同时进行一个四舍五入操作。
  95.               return(t);
  96.    }

  97. /**********************LED数码管显示**************************/
  98. void display(unsigned int temp)
  99. {
  100.        TempData[0]=0;
  101. if(temp&0x8000)
  102.      {
  103.      TempData[0]=0x40;   //负号标志
  104.      temp=~temp;        // 取反加1
  105.               temp +=1;
  106.               }
  107.             
  108.    if(temp/1000==0)
  109.                 TempData[1]=0;
  110.               else
  111.       TempData[0]=DuanMa[temp/1000];       //百位温度
  112.    if((temp/1000==0)&&((temp%1000)/100==0))  //消隐
  113.                 TempData[1]=0;
  114.               else
  115.      TempData[1]=DuanMa[(temp%1000)/100];   //十位温度
  116.      TempData[2]=DuanMa[(temp%1000)%100/10]|0x80; //个位温度,带小数点
  117.      TempData[3]=DuanMa[((temp%1000)%100)%10];
  118. for(i=0;i<4;i++)
  119.        {DataPort=0;        //清空数据,防止有交替重影
  120.       LATCH1=1;        //段锁存
  121.       LATCH1=0;

  122.        DataPort=WeiMa[i]; //取位码
  123.        LATCH2=1;       //位锁存
  124.        LATCH2=0;

  125.       DataPort=TempData[i]; //取显示数据,段码
  126.        LATCH1=1;        //段锁存
  127.        LATCH1=0;

  128.                  delay(50);}
  129.                  }

  130. /******************************报警子程序************************************/
  131. void baojing()
  132. {


  133.    for(i=0;i<200;i++)
  134.       {
  135.       delay(100);
  136.                 bj=!bj;fg1=0; fg2=1;
  137.                 }
  138.                 bj=0;             //防止一直给喇叭通电造成损坏
  139.   for(i=0;i<100;i++)
  140.      {
  141.       delay(500);  fg1=1;fg2=0;
  142.                 }      

  143. }


  144. /***********************键盘扫描子程序**************************************/
  145. void keyscan()
  146. {
  147.                //最高温度和最低温度标志位
  148. if(set==0)
  149. {
  150. while(1)
  151. {
  152. delay(500);       //消抖
  153. if(set==0)
  154. {

  155. while(!set)
  156. display(high);
  157. func++;
  158. }
  159. if(func==1)
  160. {
  161. display(high);
  162. if(add==0)
  163. {
  164. while(!add)
  165. display(high);
  166. high+=1;
  167. }
  168. if(dec==0)
  169. {
  170. while(!dec)
  171. display(high);
  172. high-=1;
  173. }
  174. }
  175. if(func==2)
  176. {
  177. display(low);
  178. if(add==0)
  179. {
  180. while(!add)
  181. display(low);
  182. low+=1;
  183. }
  184. if(dec==0)
  185. {
  186. while(!dec)
  187. display(low);
  188. low-=1;
  189. }
  190. }
  191. if(func>=3)
  192. {
  193. func=0;
  194. break;
  195. }
  196. }
  197. }
  198. }

  199. /***************************主程序*****************************************/
  200. void main()
  201. {Init_DS18B20();
  202. WriteOneChar(0xCC);       // 跳过读序号列号的操作
  203.               WriteOneChar(0x44);   // 启动温度转换
  204. while(1)
  205. {
  206.               while(func==0)

  207.   {display(Readtemp());delay(10);fg1=1;fg2=1;
  208.   if((set&&(func==0))&&((Readtemp()<=low)|(Readtemp()>=high)))
  209.   {baojing();}
  210.   keyscan();
  211.     }
  212.               keyscan();

  213. }
  214. }
  215. /************************结束*****************************************/</font>
复制代码

完整的Word格式文档51黑下载地址:

智能仪器设计---参考.rar (6.96 MB, 下载次数: 56)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:700741 发表于 2020-6-3 10:51 | 只看该作者
楼主,有没有仿真和源程序文件啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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