基于单片机的多功能数字温度计设计

编号

本科生毕业设计(论文)

题目: 基于单片机的多功能

物联网工程 学院 自动化 专业

学 号

学生姓名

指导教师

二〇一一年六月

摘要

摘 要

本课题设计了一种基于单片机控制的数字式多功能温度计. 该温度计以51单片机为主控器,通过温度传感器DS18B20来检测温度,并通过四位共阴极LED 数码管来进行数据的显示,可以方便的实现温度采集和显示. 同时可以根据需要设置上下限报警温度,当温度不在设置范围内时可以报警. 同时还具有时钟显示的功能,当需要进行时间显示的时候可以进行快速切换显示. 具有使用方便,精度高、量程宽、灵敏度高、体积小、功耗低等优点. 适用于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块嵌入其它系统中作为其他主系统的辅助扩展. DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景.

关键词:单片机;温度检测;AT89C51;DS18B20

I

Abstract

ABSTRACT

This project is a digital multi-function thermometer based on MCU. This system can easily achieve temperature acquisition and display, This thermometer uses at89c51 as microcontroller-based controller, detect temperature through the temperature sensor DS18B20, and realize the temperature display by four common cathode LED and it can set upper and lower limits of temperature according to feed the need, when the temperature is not set range it will ring. It also has the function of the clock display. It can switch the display fast when it is need. It is easy to use, with high precision, wide range, high sensitivity, small size and low power consumption. It is suitable for our daily lives and industrial and agricultural production in the temperature measurement, temperature processing module can also be embedded as other systems, the main system as the other auxiliary expansion. DS18B20 combined with the realization of the simplest AT89C51 temperature detection system, the system is simple, anti-interference ability, suitable for harsh environments spot temperature measurement, a wide range of applications.

Keywords : MCU; Temperature Measurement; AT89C51; DS18B20

II

目录

目 录

第1章 绪论 ............................................................................................................. 1

1.1 课题意义及发展前景 . .......................................................................................................... 1

1.2 设计内容及性能指标 . .......................................................................................................... 1

第2章 系统方案论证 . ............................................................................................ 3

第3章 系统器件选择 . ............................................................................................ 5

3.1 主控芯片介绍 . ...................................................................................................................... 5

3.2 温度传感器的选择 . .............................................................................................................. 7

3.2.1 DS18B20 简单介绍和性能特点: ....................................................................................................... 7

3.2.3 DS18B20内部结构和测温原理 ......................................................................................................... 8

3.2.5 DS18B20 使用中的注意事项和控制方法 ........................................................................................ 9

3.3 显示元件的选择 . ................................................................................................................ 10

第4章 硬件设计 ................................................................................................... 13

4.1 复位电路 . ............................................................................................................................ 13

4.2 时钟电路 . ............................................................................................................................ 13

4.3 显示电路 . ............................................................................................................................ 14

4.4 测温电路 . ............................................................................................................................ 14

4.5 控制电路 . ............................................................................................................................ 15

4.6 报警电路 . ............................................................................................................................ 15

4.7 整机电路及工作原理 . ........................................................................................................ 16

第5章 软件设计 ................................................................................................... 17

5.1 主程序模块 . ........................................................................................................................ 17

5.2 温度相关模块 . .................................................................................................................... 18

5.3 时间相关模块 . .................................................................................................................... 24

5.4中断相关程序 ..................................................................................................................... 25

5.5其他相关程序 ..................................................................................................................... 26

第6章 总结与体会 ............................................................................................... 27

参考文献 ................................................................................................................. 29

致 谢 ..................................................................................................................... 30

附录A :源程序 ..................................................................................................... 31

i

基于单片机的多功能数字温度计设计

第1章 绪论

1.1 课题意义及发展前景

随着科技的不断发展,现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平. 在信息采集、信息传输和信息处理中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义.

测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:

①传统的分立式温度传感器

②模拟集成温度传感器

③智能集成温度传感器.

计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU).社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,基于单片机的数字温度计设计与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用.

温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快的开发. 本设计为基于DS18B20和AT89C51单片机的温度测量及控制系统的硬件结构以及C 语言程序设计,系统设计和布线简单,结构紧凑,体积小,重量轻,抗干扰能力强,性价比高,扩展方便,在大型仓库,工厂,智能化建筑等领域的多点温度检测中有广阔的应用前景.

1.2 设计内容及性能指标

本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:

1、利用温度传感器(DS18B20)测量某一点环境温度

2、测量范围为-55℃~+99℃

3、用数码管进行实际温度值显示和时间显示

4、能够根据需要方便设定上下限报警温度

1

江南大学学士学位论文

2

基于单片机的多功能数字温度计设计

第2章 系统方案论证

本次设计采用如图所示系统原理结构框图

图2-1 系统原理结构框图

通过数字温度芯片对外界温度进行读取,并通过单片机进行转换,再由数码管进行直观的数字显示. 同时设定温度比较程序,由单片机进行测量温度与设定温度的比较,若不在设定温度范围内,则令蜂鸣器报警.

单片机选用AT89C51作为温度测试系统设计的核心器件. 它是具有高性能的8位单片机,属于标准的MCS —51的CMOS 产品. 不仅结合了HMOS 的高速和高密度技术及CHMOS 的低功耗特征,而且继承和扩展了MCS —48单片机的体系结构和指令系统. [1]

数字温度芯片采用DS18B20测量温度,输出信号全数字化. 便于单片机处理及控制,省去传统的测温方法的很多外围电路. 且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好. 在0—100摄氏度时,最大线形偏差小于1摄氏度. 采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便. 既可以单独对多DS18B20控制工作,还可以与PC 机通信上传数据.

利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度. 利用按键来进行调时和温度查询.

可以看出此方案测温装置电路简单、精确度较高、实现方便、软件设计也比较简单.

3

江南大学学士学位论文

4

基于单片机的多功能数字温度计设计

第3章 系统器件选择

3.1 主控芯片介绍

主控芯片选择单片机AT89C51,该单片机具有低电压供电和体积小等特点,很适合便携手持式产品的设计使用系统可用二节电池供电. [2]

AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash 只读程序存储器和128 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案.

AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程. 其将通用的微处理器和Flash 存储器结合在一起,特别是可反复擦写的Flash 存储器可有效地降低开发成本. [3]

T89C51主要功能特性:

●与MCS-51 兼容

●4K 字节可编程闪烁存储器

●寿命:1000写/擦循环

●数据保留时间:10年

●全静态工作:0Hz-24Hz

●三级程序存储器锁定

●128*8位内部RAM

●32可编程I/O线

●两个16位定时器/计数器

●5个中断源

●可编程串行通道

●低功耗的闲置和掉电模式

●片内振荡器和时钟电路 [4]

各引脚功能简单介绍如下:

VCC :供电电压.

GND :接地.

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

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL

5

江南大学学士学位论文

门电流.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口管脚 备选功能

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

/PSEN:外部程序存储器的选通信号. 在由外部程序存储器取指期间,每个机器周期两次/PSEN有效. 但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现.

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器. 注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器. 在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP ).

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入.

XTAL2:来自反向振荡器的输出. [7]

6

基于单片机的多功能数字温度计设计

3.2 温度传感器的选择

由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高. 这里采用DALLAS 公司的数字温度传感器DS18B20作为测温元件.

3.2.1 DS18B20 简单介绍和性能特点:

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

DS18B20的性能特点:

●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯

●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温

●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内

●适应电压范围更宽,电压范围:3.0~5.5V ,在寄生电源方式下可由数据线供电

●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃

●零待机功耗

●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温

●在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快

●用户可定义报警设置

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件

●测量结果直接输出数字温度信号,以" 一线总线" 串行传送给CPU ,同时可传送CRC 校验码,具有极强的抗干扰纠错能力

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作

以上特点使DS18B20非常适用与多点、远距离温度检测系统.

7

江南大学学士学位论文

3.2.3 DS18B20内部结构和测温原理

DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器.DQ 为数据输入/输出引脚. 开漏单总线接口引脚. 当被用着在寄生电源下,也可以向器件提供电源;GND 为地信号;VDD 为可选择的VDD 引脚. 当工作于寄生电源时,此引脚必须接地.DS18B20采用3脚PR-35 封装或8脚SOIC 封装,其内部结构框图如图所示

图3-2 DS18B20内部结构框图

闪速ROM 开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48 位,最后8位是前面56 位的CRC 检验码,这也是多个DS18B20 可以采用一线进行通信的原因. 温度报警触发器TH 和TL ,可通过软件写入户报警上下限. 主机操作ROM 的命令有五种,如表所列[9]

表3-1 ROM的命令

指 令

读ROM (33H )

匹配ROM (55H )

跳过ROM (CCH )

搜ROM (F0H )

报警搜索(ECH ) 说 明 读DS1820的序列号 继读完64位序列号的一个命令,用于多个DS1820时定位 此命令执行后的存储器操作将针对在线的所有DS1820 识别总线上各器件的编码,为操作各器件作好准备 仅温度越限的器件对此命令做出响应

DS18B20 温度传感器的内部存储器还包括一个高速暂存RAM 和一个非易失性的可电擦除的EPROM. 前2个字节包含测得的温度信息,第3和第4字节TH 和TL 的拷贝,是易失的,每次上电复位时被刷新. 第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率.DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值.

8

基于单片机的多功能数字温度计设计

LSB

MSB

DS18B20测温原理

当DS18B20接收到温度转换命令后,开始启动转换. 转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节. 单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5 ℃

/LSB形式表示. 温度值格式如下:

LSB

MSB

LSB MSB

这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM 中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度. 图中,S 表示位. 对应的温度计算:当符号位S=0时,表示测得的温度植为正值,直接将二进制位转换为十进制;当S=1时,表示测得的温度植为负值,先将补码变换为原码,再计算十进制值. 例如+125℃的数字输出为07D0H ,+25.0625℃的数字输出为0191H ,-25.0625℃的数字输出为FF6FH ,-55℃的数字输出为FC90H.

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时 序很重要. 系统对DS18B20的各种操作必须按协议进行. 操作协议为:初始化DS18B20 (发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据.

在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH )读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB ),得到所测实际温度的整数部分Tz ,然后再用BEH 指令取计数器1的计数剩余值Cs 和每度计数值CD. 考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts 可用下式计算:

Ts=(Tz-0.25℃)+(CD-Cs)/CD

3.2.5 DS18B20 使用中的注意事项和控制方法

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

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

●在实际使用中发现,应使电源电压保持在5V 左右,若电源电压过低,会使所测得的

9

江南大学学士学位论文

温度精度降低.

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

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

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

在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC 接外部电源,GND 接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD 、GND 接地,I/O接单片机I/O.无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻. 此次设计选择的是前面一种控制.

CPU 对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM 操作命令,最后才能对存储器操作,数据操作.DS18B20每一步操作都要遵循严格的工作时序和通信协议. 如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM 指令,最后发送RAM 指令,这样才能对DS18B20进行预定的操做.

3.3 显示元件的选择

显示元件本设计选择四位一体的八段共阴极数码管.

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管; 按发光二极管单元连接方式分为共阳极数码管和共阴极数码管. 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管. 共阳数码管在应用时应将公共极

COM 接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮. 当某一字段的阴极为高电平时,相应字段就不亮.. 共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管. 共阴数码管在应用时应将公共极COM 接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮. 当某一字段的阳极为低电平时,相应字段就不亮.

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出需要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类.

10

基于单片机的多功能数字温度计设计

静态显示驱动

静态驱动也称直流驱动. 静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD 码二-十进制译码器译码进行驱动. 静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性.

动态显示驱动

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp" 的同名端连在一起,另外为每个数码管的公共极COM 增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM 端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮. 通过分时轮流控制各个数码管的的COM 端,就使各个数码管轮流受控显示,这就是动态驱动. 在轮流显示过程中,每位数码管的点亮时间为1~2ms ,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低.

11

江南大学学士学位论文

12

基于单片机的多功能数字温度计设计

第4章 硬件设计

4.1 复位电路

为确保两点间温度控制系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位. 一般电路正常工作需要供电电源为5V±5%,即4.75~5.25V.

复位是单片机的初始化操作,其目的是使CPU 及各专用寄存器处于一个确定的初始状态. 如:把PC 的内容初始化为0000H ,使单片机从0000H 单元开始执行程序. 除了进入系统的正常初始化之外,当单片机系统在运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需要复位以使其恢复正常工作状态.

RST 端的外部复位电路有两种操作方式:上电自动复位和按键手动复位. 按键手动复位有电平方式和脉冲方式两种,本系统设计采用上电复位,如图4-1所示. 上电复位是直接将RST 端通过电阻接高电平来实现单片机的复位

.

4.2 时钟电路

单片机的时钟信号用来提供单片机内各种微操作的时间基准,时钟电路用于产生单片机工作所需要的时钟信号.

时钟信号通常用两种电路形式得到:内部振荡和外部振荡. 本系统设计采用内部振荡方式,如图4-2所示.MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl 和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式. 本设计中晶振取12MHz. [10]

图4-2 时钟电路

13

江南大学学士学位论文

4.3

显示电路

正如前面所说显示电路采用的元器件为四位一体的八段共阴极数码管. 采用动态显示驱动形式,电路图如下.P0.0-P0.7为数据输入端,根据所要显示的不同数据从数组里进行调取. 由于P0口本身不含有驱动能力,所以需要在P0口接上拉电阻,以保证有足够的电流来驱动数码管进行显示.P2.0-P2.3为位选择端口,分别控制四位数码管的显示与否.

本设计通过选择位的不同对四位数码管进行分别显示,利用人的眼睛残留视觉以达到显示数据的目的. 此电路的优点的电路简单控制方便. 可以实现四位数码管的分别控制,以便于实现多方面的显示需求.

图4-3 显示电路

4.4 测温电路

测温电路采用的元件即为DS18B20. 测温电路采用外部供电方式.VCC 接外部电源,GND 接地,I/O与单片机的P2.6口相连, I/O口线接4.7KΩ左右的上拉电阻. 单片机的数据读取和输出都通过P2.6口与DS18B20的I/O口进行. 采用单串口进行数据通信,电路设计简单. 但对软件有更多的要求.

图4-4 测温电路

14

基于单片机的多功能数字温度计设计

4.5 控制电路

本电路摒弃了复杂的矩阵键盘电路,而仅仅采用了四个按键组成简单电路来实现需要的控制. 不仅降低了硬件的成本,也使编程变的简单. 电路图如下. 四个按键分别连接单片机的P3.1,P3.0,P3.2和P3.3端.P32和P33为外部中断端口,通过他们来进行相应的控制操作. 而P31和P30端口则分别实现了数据的减和增的操作. 操作起来简单易懂,硬件开发的消耗也大为减少

.

图4-5 控制电路

4.6 报警电路

本设计采用软件处理报警,利用有源蜂鸣器进行报警输出,采用直流供电. 当所测温度超过或者低于所预设的温度时,数据口相应拉高电平,报警输出. (也可采用发光二级管报警电路,如过需要报警,则只需将相应位置1,当参数判断完毕后,再看报警模型单元ALARM 的内容是否与预设一样,如不一样,则发光报警). 并在电路中添加开关按键,只有当开关闭合时才会报警,否则仅仅显示温度,通过开关键控制报警,非常方便和容易操作. 报警电路硬件连接见图. 蜂鸣器通过NPN 管连接到单片机的P17口,采用外部电源进行连接,NPN 起到了电流放大的作用,以保证有足够的电流去驱动蜂鸣器进行报警.

图4-6 报警电路

15

江南大学学士学位论文

4.7 整机电路及工作原理

当接通电源以后,温度传感器正常工作,温度传感器将根据被测温度的不同来采集不同的数据,然后通过计算把数据转化成相应的字库代码,通过调用字库数组的数据进行数字的显示. 通过外部中断1可以进行时间显示与温度显示的切换. 当处于不同的显示状态时可以通过外部中断0来实现时间的调整和温度上下限的调整.P30口实现了数据的增加,每按一下数据增加一位,为P31口则实现的数据的递减. 在程序中设定数据上下限以防止数据的溢出. [11]

图4-7 整机电路

16

基于单片机的多功能数字温度计设计

第5章 软件设计

从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系. 二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等. 每一个执行软件也就是一个小的功能执行模块. 这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义. 各执行模块规划好后,就可以规划监控程序了. 首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系.

5.1 主程序模块

主程序主要完成硬件初始化,显示切换等功能 主程序如下:

图5-1 主程序流程图

void main()

{ Speak=0;

//蜂鸣器关闭

TMOD=0x11; //定时器0初始化 IE=0x8f; TCON=0x05; TH0=0X3C; TL0=0XB0; TR0=1; Recall();

//获取温度限值

while(1) { switch(disp)

{ case 0:temp();break; //温度显示 case 1:time();break; //时间显示 case 2:tempset();break; //温度上下限调整 case 3:timeset();break; } //时间调整

} }

17

江南大学学士学位论文

5.2 温度相关模块

DS18B20初始化

图5-2-1 DS18B20初始化流程图

程序如下:

reset() {

char presence=1; while(presence) {

while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); // 550us DQ=1; delay(6); // 66us presence=DQ; }

delay(45); presence = ~DQ; }

DQ=1;}

18

基于单片机的多功能数字温度计设计

DS18B20取数据

图5-2-2 DS18B20读数据流程图

程序如下:

uchar readbyte(void) {

uchar i;

uchar value = 0; for (i=8;i>0;i--) {

DQ=1; _nop_();_nop_(); value>>=1;

DQ = 0; //

_nop_();_nop_();_nop_();_nop_(); //4us

DQ = 1; _nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;

delay(6); //66us }

DQ=1;

return(value);

19

江南大学学士学位论文

DS18B20写数据

图5-2-3 DS18B20读取数据流程图

程序如下:

void writebyte(uchar val) {

uchar i;

for (i=8; i>0; i--) // {

DQ=1; _nop_();_nop_();

DQ=0; _nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; delay(6); //66us val=val/2; }

DQ = 1; delay(1); }

20

基于单片机的多功能数字温度计设计

4、温度读取与转化及报警程序 程序如下: void GetTemp() {

uchar n=0,temp;

reset(); //DS18B20复位 writebyte(0xCC); // Skip ROM writebyte(0xBE); // 发送读取命令 TL=readbyte(); //读取温度低8位 TH=readbyte(); reset();

//复位

//读取温度高8位

writebyte(0xCC); // Skip ROM writebyte(0x44); //发送转换命令 if((TH&0xf8)!=0x00) {

TH=~(TH); TL=~(TL)+1; n=1;

} //负温度求补码 if(TL>255)

TH++;

//数值转换

t emp=TL&0x0f;

shifen=ditab[temp];

temp=((TL&0xf0)>>4)|((TH&0x07)

fuhao=temp/100;

//获取百位数值

else

fuhao=10; shi=temp/10%10; ge=temp%10;

//获取十位数值 //获取个位数值

if((temp=TH2)) //判断温度是否在报警范围内 Speak=1; else Speak=0;

}

本设计将温度获取转换程序与报警程序融合在一起,简化了程序的复杂度,并且通过硬件开关来控制报警系统的开通与闭合,更加方便直接.

21

江南大学学士学位论文

5、温度上下限设置程序 void tempset() {

switch(pic) { case 0: v1(TL2/100);v2(TL2/10%10);v3(TL2%10);v4(10);//下限值设置 if(P30==0) //数值增加1 { delay(600); while(P30==0); ++TL2; if(TL2>99) TL2=0;

}

if(P31==0) //数值减少1

{

delay(600); while(P31==0); if(TL2==0) TL2=99; --TL2;

}break; case 1:v1(TH2/100);v2(TH2/10%10);v3(TH2%10); if(P30==0) //增1 { delay(600); while(P30==0); ++TH2; if(TH2>99) TH2=0;

}

if(P31==0) //减1 {

delay(600); while(P31==0); if(TH2==0) TH2=99; --TH2;

}break;

22

//上限值设置

基于单片机的多功能数字温度计设计

case 2:if(TH2

} }

6、温度显示程序 void temp() {

int i; GetTemp(); //获取温度

for(i=0;i

//显示温度

{

v1(fuhao); v2(shi); v3(ge); v4(shifen);

}

} 23

江南大学学士学位论文

5.3 时间相关模块

1、时间显示

void time() { v1(hour/10); }

2、时间调整 void timeset() {

switch(pic) {

case 0:time();shanshuo();break; //进入时间修改 case 1:v3(minter/10);v4(minter%10); //分钟修改

if(P30==0) //分钟+1 { }

delay(600);

while(P30==0);++minter; if(minter>60)minter=0;

v2(hour%10);

//显示小时的十位 //显示小时的个位

//显示分钟的个位

v3(minter/10); //显示分钟的十位 v4(minter%10);

if(P31==0) //分钟-1

{ delay(600); while(P31==0); if(minter==0)minter=61;--minter;

}break;

case 2:v1(hour/10);v2(hour%10); //小时修改

if(P30==0) //小时+1

delay(600);

while(P30==0);++hour; if(hour>24)hour=0;}

{

if(P31==0) //小时-1

{ delay(600); while(P31==0); if(hour==0)hour=25;--hour; }break; case 3:disp=1;pic=0; } }

24

基于单片机的多功能数字温度计设计

5.4中断相关程序

1、外部中断0

void intersvr0(void) interrupt 0

{

P0=0X00;

} delay(600); //主要通过改变pic 值辅助数据修改 if(disp==0) disp=2; else if(disp==1) disp=3; else ++pic;

2、外部中断1

void zhuanhuan(void) interrupt 2

{

P0=0X00; //通过改变disp 的值进行显示切换

delay(600);

++disp;

if(disp>1)

disp=0;

}

3、定时器中断

void int1()interrupt 1

{

TH0=0X3C;

TL0=0XB0;

++court;

if(court==20) //计数20次,分钟加1

}

{court=0;++second; if(second==60) {second=0;++minter; if(minter==60) {minter=0;++hour; if(hour==24) hour=0;} } } //重新开始计时,计时时间50MS

25

江南大学学士学位论文

5.5其他相关程序

1、延时程序

void delay(uint n)

{ while(n--); }

2、实现调整时的屏幕闪烁显示

void shanshuo()

{

++x;

if(x==300)

{P0=0X00;

delay(25000);

x=0;}

}

3、数码管显示程序

void v4(int a) //显示数码管第4位

{ P0=d[a];

P23=0;

delay(15);

P23=1;

}

void v3(int b) //显示数码管第3位

{

P0=d[b];

P22=0;

delay(15);

P22=1;

}

void v2(int c) //显示数码管第2位

{

P0=d[c];

P21=0;

delay(15);

P21=1;

}

void v1(int e) //显示数码管第1位

{

P0=d[e];

P20=0;

delay(15);

P20=1;

}

26

基于单片机的多功能数字温度计设计

第6章 总结与体会

本设计是利用AT89C51芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测取,性能稳定,精度度高,而且扩展性好. 并且通过单片机的计数器配合12MHZ 的晶振实现了时间显示的功能.DS18B20本身具有保存温度限值的功能,使得温度上下限值不容易丢失. 由于DS18B20的测量精度只有±0.5 度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正.

经过将半学期的学习也积累,终于完成了此次毕业设计,虽然有些地方仍存有缺陷但基本的要求都已经达到.

在本次设计的过程中,遇到了许多自己不懂的问题,不熟悉的器件. 这个时候通过咨询老师和查询资料是最好的解决方法. 在老师的帮助和指导下我克服了一个个的知识缺陷. 掌握了设计中所需的元器件的应用及编程. 单片机课程设计重点就在于硬件方面的设计和软件算法的设计,硬件电流图本设计采用了最简单的设计方案. 尽量减少了硬件方面的消耗. 软件方面虽然我实现了各个功能,但我觉得自己编写的软件与老手之间仍有较大的差别. 自己写的程序让然不够简练.

本次设计让我掌握了许多新鲜的知识,自己的很多能力也得到了提高与锻炼. 为以后在社会工作打下了一定基础.

27

江南大学学士学位论文

28

基于单片机的多功能数字温度计设计

参考文献

[1] 丁元杰. 单片微机原理及应用[M]. 北京: 机械工业出版社, 2004, 39-75.

[2] 孙育才. 单片微型计算机及其应用[M]. 南京: 东南大学出版社, 2004, 40-60.

[3] 李朝青. 单片机原理及接口技术[M]. 杭州: 北京航空航天大学出版社, 1998, 22-62.

[4] 李广弟. 单片机基础[M]. 北京: 北京航空航天大学出版社, 1994, 12-42..

[5] 陈涛. 单片机应用及C51程序设计[M]. 北京: 机械工业出版社, 2011, 23-53.

[6] Lipovski G J. Introduction to microcontrollers (second edition) [M], Academic Press, 2004,

12-23.

[7] 陈堂敏, 刘焕平. 单片机原理与应用[M]. 北京: 北京理工大学出版社, 2007, 43-116.

[8] 李聚光, 董素玲. 用DS18B20实现多路测温[J]. 内江科技, 2006, 27(07): 139-140.

[9] Jiang G, Zhang M, Xie X, Li S. Application on temperature control of DS18B20[J]. Control

Engineering of China, 2003, 9(5): 419-420.

[10] 周润景, 张丽娜, 刘印群. PROTEUS 入门实用教程[M]. 北京: 机械工业出版社, 2007,

48-103.

[11] 华成英, 童诗白. 模拟电子技术基础(第四版)[M]. 北京: 高等教育出版社, 2006,

10-118.

29

江南大学学士学位论文

致 谢

这次毕业设计是由赵老师指导完成的. 在这次毕业设计的设计和制作过程中,赵老师给了我很大的帮助,同时我也从许多案例中获得了经验教训和启发. 在此对赵老师和给予我帮助的同学表示由衷感谢!

30

附录

附录A :源程序

#include"reg51.h"

#include "intrins.h"

#define uint unsigned int

#define uchar unsigned char

//**************温度小数部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; const uchar d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

static uint second=0,minter=10,hour=10,x,TH2,TL2;

uchar TL,TH,shi,ge,shifen,fuhao;

static char court=0,pic=0,disp=0;

sbit P20=P2^0; //定义各端口

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P31=P3^1;

sbit DQ=P2^6;

sbit P30=P3^0;

sbit P32=P3^2;

sbit P33=P3^3;

sbit P07=P0^7;

sbit Speak=P1^7;

//********************延时程序***********************************// void delay(uint n)

{

while(n--);

}

//*******************外部中断0******************************************// void intersvr0(void) interrupt 0

{

P0=0X00;

} delay(600); //主要通过切换PIC 辅助数据修改 if(disp==0) disp=2; else if(disp==1) disp=3; else ++pic;

//*******************外部中断1*****************************************//

31

附录

void zhuanhuan(void) interrupt 2

{

} P0=0X00; //通过改变disp 的值进行显示切换 delay(600); ++disp; if(disp>1) disp=0;

//********************定时器中断************************************// void int1()interrupt 1

{

TH0=0X3C; //重新开始计时,计时时间50MS

TL0=0XB0;

++court;

if(court==20)

{court=0;++second;

if(second==60)

{second=0;++minter;

if(minter==60)

{minter=0;++hour;

if(hour==24)

hour=0;}

} }

}

//*************实现时间调整时的闪烁功能**********************************// void shanshuo()

{

++x;

if(x==300)

{P0=0X00;

delay(25000);

x=0;}

}

//***************数码管显示程序**************************************// void v4(int a) //显示数码管第4位

{

P0=d[a]; P23=0; delay(15); P23=1;

}

32

附录

void v3(int b) //显示数码管第3位

{

P0=d[b];

if(disp==0)

P07=1;

P22=0;

delay(15);

P22=1;

}

void v2(int c)

{

} //显示数码管第2位 P0=d[c]; if(disp==1) if(court==0) P07=1; P21=0; delay(15); P21=1;

//显示数码管第1位 void v1(int e)

{

P0=d[e];

P20=0;

delay(15);

P20=1;

}

//**************时间显示*****************************************// void time()

{

v1(hour/10);

v2(hour%10);

v3(minter/10);

v4(minter%10);

}

//***************时间设置********************************************// void timeset() {

switch(pic)

{

case 1:v3(minter/10);v4(minter%10); //分钟修改

33 case 0:time();shanshuo();break; //进入时间修改

附录

if(P30==0)

{

delay(600);

while(P30==0);++minter;

if(minter>60)minter=0;

}

if(P31==0)

{

delay(600);

while(P31==0);

if(minter==0)minter=61;--minter;

}break;

case 2:v1(hour/10);v2(hour%10); //小时修改

if(P30==0)

{

delay(600);

while(P30==0);++hour;

if(hour>24)hour=0;}

if(P31==0)

{

delay(600);

while(P31==0);

if(hour==0)hour=25;--hour;

}break;

case 3:disp=1;pic=0;

}

}

//****************DS18B20复位*******************************************// reset()

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();

DQ=0; //发出复位信号 delay(50); // 延时550us DQ=1; // 拉高

34

附录

} } delay(6); // 延时66us presence=DQ; // 接受响应值 delay(45); //延时500us presence = ~DQ; } DQ=1;

//**********DS18B20写数据********************************************// void writebyte(uchar val)

{

uchar i;

} for (i=8; i>0; i--) //循环八次 { DQ=1; _nop_();_nop_(); DQ = 0; _nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //写入1位 delay(6); //延时66us val=val/2; //右移1位 } DQ = 1; delay(1);

//******** DS18B20读数据***********************************************// uchar readbyte(void)

{

uchar i;

uchar value = 0;

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

{

DQ=1; _nop_();_nop_();

value>>=1;

DQ = 0; //读数据 _nop_();_nop_();_nop_();_nop_(); //4us DQ = 1; _nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80; delay(6); //66us } DQ=1; return(value);

}

35

附录

//*********获取EPROM 中的温度限值**************************************// void Recall()

{

reset();

writebyte(0xcc);

writebyte(0xb8);

reset();

writebyte(0xCC);

writebyte(0xBE);

readbyte();

readbyte();

TH2=readbyte();

TL2=readbyte();

}

//***********温度限值设置程序*****************************************// void tempset()

{

switch(pic)

{

case 0: v1(TL2/100);v2(TL2/10%10);v3(TL2%10);v4(10);//下限值设置 if(P30==0) { delay(600); while(P30==0); ++TL2; if(TL2>99) TL2=0; } if(P31==0) { delay(600); while(P31==0); if(TL2==0) TL2=99; --TL2; }break; if(P30==0) { delay(600);

36 case 1:v1(TH2/100);v2(TH2/10%10);v3(TH2%10); //上限值设置

附录

while(P30==0); ++TH2; if(TH2>99) TH2=0; } if(P31==0) { delay(600); while(P31==0); if(TH2==0) TH2=99; --TH2; }break;

}

} case 2:if(TH2

//***********温度读取与转换*********************************************// void GetTemp()

{

uchar n=0,temp;

reset(); //复位 writebyte(0xCC); // Skip ROM writebyte(0xBE); // 发送温度读取命令 TL=readbyte(); TH=readbyte(); reset(); writebyte(0xCC); // Skip ROM writebyte(0x44); //发送温度转换命令 if((TH&0xf8)!=0x00)

{

37

附录

TH=~(TH); TL=~(TL)+1; n=1; }//负数求补码 if(TL>255) TH++; t emp=TL&0x0f;

shifen=ditab[temp];

temp=((TL&0xf0)>>4)|((TH&0x07)

if((temp=TH2)) //温度限值判断

Speak=1;

else

Speak=0;

if(n!=1)

fuhao=temp/100;

else

fuhao=10;

shi=temp/10%10;

ge=temp%10;

}

//**********温度显示程序************************************************// void temp()

{

int i;

GetTemp();

for(i=0;i

{

v1(fuhao);

v2(shi);

v3(ge);

v4(shifen);

}

}

//************MAIN函数********************************************// void main()

{

Speak=0;

TMOD=0x11;

IE=0x8f;

TCON=0x05;

TH0=0X3C;

38

附录

TL0=0XB0; TR0=1; Recall(); 获得温度限值 while(1) { switch(disp) { case 0:temp();break; case 1:time();break;

case 2:tempset();break;

case 3:timeset();break;

}

}

39

编号

本科生毕业设计(论文)

题目: 基于单片机的多功能

物联网工程 学院 自动化 专业

学 号

学生姓名

指导教师

二〇一一年六月

摘要

摘 要

本课题设计了一种基于单片机控制的数字式多功能温度计. 该温度计以51单片机为主控器,通过温度传感器DS18B20来检测温度,并通过四位共阴极LED 数码管来进行数据的显示,可以方便的实现温度采集和显示. 同时可以根据需要设置上下限报警温度,当温度不在设置范围内时可以报警. 同时还具有时钟显示的功能,当需要进行时间显示的时候可以进行快速切换显示. 具有使用方便,精度高、量程宽、灵敏度高、体积小、功耗低等优点. 适用于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块嵌入其它系统中作为其他主系统的辅助扩展. DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景.

关键词:单片机;温度检测;AT89C51;DS18B20

I

Abstract

ABSTRACT

This project is a digital multi-function thermometer based on MCU. This system can easily achieve temperature acquisition and display, This thermometer uses at89c51 as microcontroller-based controller, detect temperature through the temperature sensor DS18B20, and realize the temperature display by four common cathode LED and it can set upper and lower limits of temperature according to feed the need, when the temperature is not set range it will ring. It also has the function of the clock display. It can switch the display fast when it is need. It is easy to use, with high precision, wide range, high sensitivity, small size and low power consumption. It is suitable for our daily lives and industrial and agricultural production in the temperature measurement, temperature processing module can also be embedded as other systems, the main system as the other auxiliary expansion. DS18B20 combined with the realization of the simplest AT89C51 temperature detection system, the system is simple, anti-interference ability, suitable for harsh environments spot temperature measurement, a wide range of applications.

Keywords : MCU; Temperature Measurement; AT89C51; DS18B20

II

目录

目 录

第1章 绪论 ............................................................................................................. 1

1.1 课题意义及发展前景 . .......................................................................................................... 1

1.2 设计内容及性能指标 . .......................................................................................................... 1

第2章 系统方案论证 . ............................................................................................ 3

第3章 系统器件选择 . ............................................................................................ 5

3.1 主控芯片介绍 . ...................................................................................................................... 5

3.2 温度传感器的选择 . .............................................................................................................. 7

3.2.1 DS18B20 简单介绍和性能特点: ....................................................................................................... 7

3.2.3 DS18B20内部结构和测温原理 ......................................................................................................... 8

3.2.5 DS18B20 使用中的注意事项和控制方法 ........................................................................................ 9

3.3 显示元件的选择 . ................................................................................................................ 10

第4章 硬件设计 ................................................................................................... 13

4.1 复位电路 . ............................................................................................................................ 13

4.2 时钟电路 . ............................................................................................................................ 13

4.3 显示电路 . ............................................................................................................................ 14

4.4 测温电路 . ............................................................................................................................ 14

4.5 控制电路 . ............................................................................................................................ 15

4.6 报警电路 . ............................................................................................................................ 15

4.7 整机电路及工作原理 . ........................................................................................................ 16

第5章 软件设计 ................................................................................................... 17

5.1 主程序模块 . ........................................................................................................................ 17

5.2 温度相关模块 . .................................................................................................................... 18

5.3 时间相关模块 . .................................................................................................................... 24

5.4中断相关程序 ..................................................................................................................... 25

5.5其他相关程序 ..................................................................................................................... 26

第6章 总结与体会 ............................................................................................... 27

参考文献 ................................................................................................................. 29

致 谢 ..................................................................................................................... 30

附录A :源程序 ..................................................................................................... 31

i

基于单片机的多功能数字温度计设计

第1章 绪论

1.1 课题意义及发展前景

随着科技的不断发展,现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平. 在信息采集、信息传输和信息处理中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义.

测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:

①传统的分立式温度传感器

②模拟集成温度传感器

③智能集成温度传感器.

计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU).社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,基于单片机的数字温度计设计与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用.

温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快的开发. 本设计为基于DS18B20和AT89C51单片机的温度测量及控制系统的硬件结构以及C 语言程序设计,系统设计和布线简单,结构紧凑,体积小,重量轻,抗干扰能力强,性价比高,扩展方便,在大型仓库,工厂,智能化建筑等领域的多点温度检测中有广阔的应用前景.

1.2 设计内容及性能指标

本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:

1、利用温度传感器(DS18B20)测量某一点环境温度

2、测量范围为-55℃~+99℃

3、用数码管进行实际温度值显示和时间显示

4、能够根据需要方便设定上下限报警温度

1

江南大学学士学位论文

2

基于单片机的多功能数字温度计设计

第2章 系统方案论证

本次设计采用如图所示系统原理结构框图

图2-1 系统原理结构框图

通过数字温度芯片对外界温度进行读取,并通过单片机进行转换,再由数码管进行直观的数字显示. 同时设定温度比较程序,由单片机进行测量温度与设定温度的比较,若不在设定温度范围内,则令蜂鸣器报警.

单片机选用AT89C51作为温度测试系统设计的核心器件. 它是具有高性能的8位单片机,属于标准的MCS —51的CMOS 产品. 不仅结合了HMOS 的高速和高密度技术及CHMOS 的低功耗特征,而且继承和扩展了MCS —48单片机的体系结构和指令系统. [1]

数字温度芯片采用DS18B20测量温度,输出信号全数字化. 便于单片机处理及控制,省去传统的测温方法的很多外围电路. 且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好. 在0—100摄氏度时,最大线形偏差小于1摄氏度. 采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便. 既可以单独对多DS18B20控制工作,还可以与PC 机通信上传数据.

利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度. 利用按键来进行调时和温度查询.

可以看出此方案测温装置电路简单、精确度较高、实现方便、软件设计也比较简单.

3

江南大学学士学位论文

4

基于单片机的多功能数字温度计设计

第3章 系统器件选择

3.1 主控芯片介绍

主控芯片选择单片机AT89C51,该单片机具有低电压供电和体积小等特点,很适合便携手持式产品的设计使用系统可用二节电池供电. [2]

AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash 只读程序存储器和128 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案.

AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程. 其将通用的微处理器和Flash 存储器结合在一起,特别是可反复擦写的Flash 存储器可有效地降低开发成本. [3]

T89C51主要功能特性:

●与MCS-51 兼容

●4K 字节可编程闪烁存储器

●寿命:1000写/擦循环

●数据保留时间:10年

●全静态工作:0Hz-24Hz

●三级程序存储器锁定

●128*8位内部RAM

●32可编程I/O线

●两个16位定时器/计数器

●5个中断源

●可编程串行通道

●低功耗的闲置和掉电模式

●片内振荡器和时钟电路 [4]

各引脚功能简单介绍如下:

VCC :供电电压.

GND :接地.

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

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL

5

江南大学学士学位论文

门电流.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口管脚 备选功能

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

/PSEN:外部程序存储器的选通信号. 在由外部程序存储器取指期间,每个机器周期两次/PSEN有效. 但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现.

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器. 注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器. 在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP ).

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入.

XTAL2:来自反向振荡器的输出. [7]

6

基于单片机的多功能数字温度计设计

3.2 温度传感器的选择

由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高. 这里采用DALLAS 公司的数字温度传感器DS18B20作为测温元件.

3.2.1 DS18B20 简单介绍和性能特点:

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

DS18B20的性能特点:

●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯

●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温

●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内

●适应电压范围更宽,电压范围:3.0~5.5V ,在寄生电源方式下可由数据线供电

●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃

●零待机功耗

●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温

●在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快

●用户可定义报警设置

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件

●测量结果直接输出数字温度信号,以" 一线总线" 串行传送给CPU ,同时可传送CRC 校验码,具有极强的抗干扰纠错能力

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作

以上特点使DS18B20非常适用与多点、远距离温度检测系统.

7

江南大学学士学位论文

3.2.3 DS18B20内部结构和测温原理

DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器.DQ 为数据输入/输出引脚. 开漏单总线接口引脚. 当被用着在寄生电源下,也可以向器件提供电源;GND 为地信号;VDD 为可选择的VDD 引脚. 当工作于寄生电源时,此引脚必须接地.DS18B20采用3脚PR-35 封装或8脚SOIC 封装,其内部结构框图如图所示

图3-2 DS18B20内部结构框图

闪速ROM 开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48 位,最后8位是前面56 位的CRC 检验码,这也是多个DS18B20 可以采用一线进行通信的原因. 温度报警触发器TH 和TL ,可通过软件写入户报警上下限. 主机操作ROM 的命令有五种,如表所列[9]

表3-1 ROM的命令

指 令

读ROM (33H )

匹配ROM (55H )

跳过ROM (CCH )

搜ROM (F0H )

报警搜索(ECH ) 说 明 读DS1820的序列号 继读完64位序列号的一个命令,用于多个DS1820时定位 此命令执行后的存储器操作将针对在线的所有DS1820 识别总线上各器件的编码,为操作各器件作好准备 仅温度越限的器件对此命令做出响应

DS18B20 温度传感器的内部存储器还包括一个高速暂存RAM 和一个非易失性的可电擦除的EPROM. 前2个字节包含测得的温度信息,第3和第4字节TH 和TL 的拷贝,是易失的,每次上电复位时被刷新. 第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率.DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值.

8

基于单片机的多功能数字温度计设计

LSB

MSB

DS18B20测温原理

当DS18B20接收到温度转换命令后,开始启动转换. 转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节. 单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5 ℃

/LSB形式表示. 温度值格式如下:

LSB

MSB

LSB MSB

这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM 中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度. 图中,S 表示位. 对应的温度计算:当符号位S=0时,表示测得的温度植为正值,直接将二进制位转换为十进制;当S=1时,表示测得的温度植为负值,先将补码变换为原码,再计算十进制值. 例如+125℃的数字输出为07D0H ,+25.0625℃的数字输出为0191H ,-25.0625℃的数字输出为FF6FH ,-55℃的数字输出为FC90H.

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时 序很重要. 系统对DS18B20的各种操作必须按协议进行. 操作协议为:初始化DS18B20 (发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据.

在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH )读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB ),得到所测实际温度的整数部分Tz ,然后再用BEH 指令取计数器1的计数剩余值Cs 和每度计数值CD. 考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts 可用下式计算:

Ts=(Tz-0.25℃)+(CD-Cs)/CD

3.2.5 DS18B20 使用中的注意事项和控制方法

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

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

●在实际使用中发现,应使电源电压保持在5V 左右,若电源电压过低,会使所测得的

9

江南大学学士学位论文

温度精度降低.

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

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

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

在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC 接外部电源,GND 接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD 、GND 接地,I/O接单片机I/O.无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻. 此次设计选择的是前面一种控制.

CPU 对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM 操作命令,最后才能对存储器操作,数据操作.DS18B20每一步操作都要遵循严格的工作时序和通信协议. 如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM 指令,最后发送RAM 指令,这样才能对DS18B20进行预定的操做.

3.3 显示元件的选择

显示元件本设计选择四位一体的八段共阴极数码管.

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管; 按发光二极管单元连接方式分为共阳极数码管和共阴极数码管. 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管. 共阳数码管在应用时应将公共极

COM 接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮. 当某一字段的阴极为高电平时,相应字段就不亮.. 共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管. 共阴数码管在应用时应将公共极COM 接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮. 当某一字段的阳极为低电平时,相应字段就不亮.

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出需要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类.

10

基于单片机的多功能数字温度计设计

静态显示驱动

静态驱动也称直流驱动. 静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD 码二-十进制译码器译码进行驱动. 静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性.

动态显示驱动

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp" 的同名端连在一起,另外为每个数码管的公共极COM 增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM 端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮. 通过分时轮流控制各个数码管的的COM 端,就使各个数码管轮流受控显示,这就是动态驱动. 在轮流显示过程中,每位数码管的点亮时间为1~2ms ,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低.

11

江南大学学士学位论文

12

基于单片机的多功能数字温度计设计

第4章 硬件设计

4.1 复位电路

为确保两点间温度控制系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位. 一般电路正常工作需要供电电源为5V±5%,即4.75~5.25V.

复位是单片机的初始化操作,其目的是使CPU 及各专用寄存器处于一个确定的初始状态. 如:把PC 的内容初始化为0000H ,使单片机从0000H 单元开始执行程序. 除了进入系统的正常初始化之外,当单片机系统在运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需要复位以使其恢复正常工作状态.

RST 端的外部复位电路有两种操作方式:上电自动复位和按键手动复位. 按键手动复位有电平方式和脉冲方式两种,本系统设计采用上电复位,如图4-1所示. 上电复位是直接将RST 端通过电阻接高电平来实现单片机的复位

.

4.2 时钟电路

单片机的时钟信号用来提供单片机内各种微操作的时间基准,时钟电路用于产生单片机工作所需要的时钟信号.

时钟信号通常用两种电路形式得到:内部振荡和外部振荡. 本系统设计采用内部振荡方式,如图4-2所示.MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl 和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式. 本设计中晶振取12MHz. [10]

图4-2 时钟电路

13

江南大学学士学位论文

4.3

显示电路

正如前面所说显示电路采用的元器件为四位一体的八段共阴极数码管. 采用动态显示驱动形式,电路图如下.P0.0-P0.7为数据输入端,根据所要显示的不同数据从数组里进行调取. 由于P0口本身不含有驱动能力,所以需要在P0口接上拉电阻,以保证有足够的电流来驱动数码管进行显示.P2.0-P2.3为位选择端口,分别控制四位数码管的显示与否.

本设计通过选择位的不同对四位数码管进行分别显示,利用人的眼睛残留视觉以达到显示数据的目的. 此电路的优点的电路简单控制方便. 可以实现四位数码管的分别控制,以便于实现多方面的显示需求.

图4-3 显示电路

4.4 测温电路

测温电路采用的元件即为DS18B20. 测温电路采用外部供电方式.VCC 接外部电源,GND 接地,I/O与单片机的P2.6口相连, I/O口线接4.7KΩ左右的上拉电阻. 单片机的数据读取和输出都通过P2.6口与DS18B20的I/O口进行. 采用单串口进行数据通信,电路设计简单. 但对软件有更多的要求.

图4-4 测温电路

14

基于单片机的多功能数字温度计设计

4.5 控制电路

本电路摒弃了复杂的矩阵键盘电路,而仅仅采用了四个按键组成简单电路来实现需要的控制. 不仅降低了硬件的成本,也使编程变的简单. 电路图如下. 四个按键分别连接单片机的P3.1,P3.0,P3.2和P3.3端.P32和P33为外部中断端口,通过他们来进行相应的控制操作. 而P31和P30端口则分别实现了数据的减和增的操作. 操作起来简单易懂,硬件开发的消耗也大为减少

.

图4-5 控制电路

4.6 报警电路

本设计采用软件处理报警,利用有源蜂鸣器进行报警输出,采用直流供电. 当所测温度超过或者低于所预设的温度时,数据口相应拉高电平,报警输出. (也可采用发光二级管报警电路,如过需要报警,则只需将相应位置1,当参数判断完毕后,再看报警模型单元ALARM 的内容是否与预设一样,如不一样,则发光报警). 并在电路中添加开关按键,只有当开关闭合时才会报警,否则仅仅显示温度,通过开关键控制报警,非常方便和容易操作. 报警电路硬件连接见图. 蜂鸣器通过NPN 管连接到单片机的P17口,采用外部电源进行连接,NPN 起到了电流放大的作用,以保证有足够的电流去驱动蜂鸣器进行报警.

图4-6 报警电路

15

江南大学学士学位论文

4.7 整机电路及工作原理

当接通电源以后,温度传感器正常工作,温度传感器将根据被测温度的不同来采集不同的数据,然后通过计算把数据转化成相应的字库代码,通过调用字库数组的数据进行数字的显示. 通过外部中断1可以进行时间显示与温度显示的切换. 当处于不同的显示状态时可以通过外部中断0来实现时间的调整和温度上下限的调整.P30口实现了数据的增加,每按一下数据增加一位,为P31口则实现的数据的递减. 在程序中设定数据上下限以防止数据的溢出. [11]

图4-7 整机电路

16

基于单片机的多功能数字温度计设计

第5章 软件设计

从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系. 二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等. 每一个执行软件也就是一个小的功能执行模块. 这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义. 各执行模块规划好后,就可以规划监控程序了. 首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系.

5.1 主程序模块

主程序主要完成硬件初始化,显示切换等功能 主程序如下:

图5-1 主程序流程图

void main()

{ Speak=0;

//蜂鸣器关闭

TMOD=0x11; //定时器0初始化 IE=0x8f; TCON=0x05; TH0=0X3C; TL0=0XB0; TR0=1; Recall();

//获取温度限值

while(1) { switch(disp)

{ case 0:temp();break; //温度显示 case 1:time();break; //时间显示 case 2:tempset();break; //温度上下限调整 case 3:timeset();break; } //时间调整

} }

17

江南大学学士学位论文

5.2 温度相关模块

DS18B20初始化

图5-2-1 DS18B20初始化流程图

程序如下:

reset() {

char presence=1; while(presence) {

while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); // 550us DQ=1; delay(6); // 66us presence=DQ; }

delay(45); presence = ~DQ; }

DQ=1;}

18

基于单片机的多功能数字温度计设计

DS18B20取数据

图5-2-2 DS18B20读数据流程图

程序如下:

uchar readbyte(void) {

uchar i;

uchar value = 0; for (i=8;i>0;i--) {

DQ=1; _nop_();_nop_(); value>>=1;

DQ = 0; //

_nop_();_nop_();_nop_();_nop_(); //4us

DQ = 1; _nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;

delay(6); //66us }

DQ=1;

return(value);

19

江南大学学士学位论文

DS18B20写数据

图5-2-3 DS18B20读取数据流程图

程序如下:

void writebyte(uchar val) {

uchar i;

for (i=8; i>0; i--) // {

DQ=1; _nop_();_nop_();

DQ=0; _nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; delay(6); //66us val=val/2; }

DQ = 1; delay(1); }

20

基于单片机的多功能数字温度计设计

4、温度读取与转化及报警程序 程序如下: void GetTemp() {

uchar n=0,temp;

reset(); //DS18B20复位 writebyte(0xCC); // Skip ROM writebyte(0xBE); // 发送读取命令 TL=readbyte(); //读取温度低8位 TH=readbyte(); reset();

//复位

//读取温度高8位

writebyte(0xCC); // Skip ROM writebyte(0x44); //发送转换命令 if((TH&0xf8)!=0x00) {

TH=~(TH); TL=~(TL)+1; n=1;

} //负温度求补码 if(TL>255)

TH++;

//数值转换

t emp=TL&0x0f;

shifen=ditab[temp];

temp=((TL&0xf0)>>4)|((TH&0x07)

fuhao=temp/100;

//获取百位数值

else

fuhao=10; shi=temp/10%10; ge=temp%10;

//获取十位数值 //获取个位数值

if((temp=TH2)) //判断温度是否在报警范围内 Speak=1; else Speak=0;

}

本设计将温度获取转换程序与报警程序融合在一起,简化了程序的复杂度,并且通过硬件开关来控制报警系统的开通与闭合,更加方便直接.

21

江南大学学士学位论文

5、温度上下限设置程序 void tempset() {

switch(pic) { case 0: v1(TL2/100);v2(TL2/10%10);v3(TL2%10);v4(10);//下限值设置 if(P30==0) //数值增加1 { delay(600); while(P30==0); ++TL2; if(TL2>99) TL2=0;

}

if(P31==0) //数值减少1

{

delay(600); while(P31==0); if(TL2==0) TL2=99; --TL2;

}break; case 1:v1(TH2/100);v2(TH2/10%10);v3(TH2%10); if(P30==0) //增1 { delay(600); while(P30==0); ++TH2; if(TH2>99) TH2=0;

}

if(P31==0) //减1 {

delay(600); while(P31==0); if(TH2==0) TH2=99; --TH2;

}break;

22

//上限值设置

基于单片机的多功能数字温度计设计

case 2:if(TH2

} }

6、温度显示程序 void temp() {

int i; GetTemp(); //获取温度

for(i=0;i

//显示温度

{

v1(fuhao); v2(shi); v3(ge); v4(shifen);

}

} 23

江南大学学士学位论文

5.3 时间相关模块

1、时间显示

void time() { v1(hour/10); }

2、时间调整 void timeset() {

switch(pic) {

case 0:time();shanshuo();break; //进入时间修改 case 1:v3(minter/10);v4(minter%10); //分钟修改

if(P30==0) //分钟+1 { }

delay(600);

while(P30==0);++minter; if(minter>60)minter=0;

v2(hour%10);

//显示小时的十位 //显示小时的个位

//显示分钟的个位

v3(minter/10); //显示分钟的十位 v4(minter%10);

if(P31==0) //分钟-1

{ delay(600); while(P31==0); if(minter==0)minter=61;--minter;

}break;

case 2:v1(hour/10);v2(hour%10); //小时修改

if(P30==0) //小时+1

delay(600);

while(P30==0);++hour; if(hour>24)hour=0;}

{

if(P31==0) //小时-1

{ delay(600); while(P31==0); if(hour==0)hour=25;--hour; }break; case 3:disp=1;pic=0; } }

24

基于单片机的多功能数字温度计设计

5.4中断相关程序

1、外部中断0

void intersvr0(void) interrupt 0

{

P0=0X00;

} delay(600); //主要通过改变pic 值辅助数据修改 if(disp==0) disp=2; else if(disp==1) disp=3; else ++pic;

2、外部中断1

void zhuanhuan(void) interrupt 2

{

P0=0X00; //通过改变disp 的值进行显示切换

delay(600);

++disp;

if(disp>1)

disp=0;

}

3、定时器中断

void int1()interrupt 1

{

TH0=0X3C;

TL0=0XB0;

++court;

if(court==20) //计数20次,分钟加1

}

{court=0;++second; if(second==60) {second=0;++minter; if(minter==60) {minter=0;++hour; if(hour==24) hour=0;} } } //重新开始计时,计时时间50MS

25

江南大学学士学位论文

5.5其他相关程序

1、延时程序

void delay(uint n)

{ while(n--); }

2、实现调整时的屏幕闪烁显示

void shanshuo()

{

++x;

if(x==300)

{P0=0X00;

delay(25000);

x=0;}

}

3、数码管显示程序

void v4(int a) //显示数码管第4位

{ P0=d[a];

P23=0;

delay(15);

P23=1;

}

void v3(int b) //显示数码管第3位

{

P0=d[b];

P22=0;

delay(15);

P22=1;

}

void v2(int c) //显示数码管第2位

{

P0=d[c];

P21=0;

delay(15);

P21=1;

}

void v1(int e) //显示数码管第1位

{

P0=d[e];

P20=0;

delay(15);

P20=1;

}

26

基于单片机的多功能数字温度计设计

第6章 总结与体会

本设计是利用AT89C51芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测取,性能稳定,精度度高,而且扩展性好. 并且通过单片机的计数器配合12MHZ 的晶振实现了时间显示的功能.DS18B20本身具有保存温度限值的功能,使得温度上下限值不容易丢失. 由于DS18B20的测量精度只有±0.5 度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正.

经过将半学期的学习也积累,终于完成了此次毕业设计,虽然有些地方仍存有缺陷但基本的要求都已经达到.

在本次设计的过程中,遇到了许多自己不懂的问题,不熟悉的器件. 这个时候通过咨询老师和查询资料是最好的解决方法. 在老师的帮助和指导下我克服了一个个的知识缺陷. 掌握了设计中所需的元器件的应用及编程. 单片机课程设计重点就在于硬件方面的设计和软件算法的设计,硬件电流图本设计采用了最简单的设计方案. 尽量减少了硬件方面的消耗. 软件方面虽然我实现了各个功能,但我觉得自己编写的软件与老手之间仍有较大的差别. 自己写的程序让然不够简练.

本次设计让我掌握了许多新鲜的知识,自己的很多能力也得到了提高与锻炼. 为以后在社会工作打下了一定基础.

27

江南大学学士学位论文

28

基于单片机的多功能数字温度计设计

参考文献

[1] 丁元杰. 单片微机原理及应用[M]. 北京: 机械工业出版社, 2004, 39-75.

[2] 孙育才. 单片微型计算机及其应用[M]. 南京: 东南大学出版社, 2004, 40-60.

[3] 李朝青. 单片机原理及接口技术[M]. 杭州: 北京航空航天大学出版社, 1998, 22-62.

[4] 李广弟. 单片机基础[M]. 北京: 北京航空航天大学出版社, 1994, 12-42..

[5] 陈涛. 单片机应用及C51程序设计[M]. 北京: 机械工业出版社, 2011, 23-53.

[6] Lipovski G J. Introduction to microcontrollers (second edition) [M], Academic Press, 2004,

12-23.

[7] 陈堂敏, 刘焕平. 单片机原理与应用[M]. 北京: 北京理工大学出版社, 2007, 43-116.

[8] 李聚光, 董素玲. 用DS18B20实现多路测温[J]. 内江科技, 2006, 27(07): 139-140.

[9] Jiang G, Zhang M, Xie X, Li S. Application on temperature control of DS18B20[J]. Control

Engineering of China, 2003, 9(5): 419-420.

[10] 周润景, 张丽娜, 刘印群. PROTEUS 入门实用教程[M]. 北京: 机械工业出版社, 2007,

48-103.

[11] 华成英, 童诗白. 模拟电子技术基础(第四版)[M]. 北京: 高等教育出版社, 2006,

10-118.

29

江南大学学士学位论文

致 谢

这次毕业设计是由赵老师指导完成的. 在这次毕业设计的设计和制作过程中,赵老师给了我很大的帮助,同时我也从许多案例中获得了经验教训和启发. 在此对赵老师和给予我帮助的同学表示由衷感谢!

30

附录

附录A :源程序

#include"reg51.h"

#include "intrins.h"

#define uint unsigned int

#define uchar unsigned char

//**************温度小数部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; const uchar d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

static uint second=0,minter=10,hour=10,x,TH2,TL2;

uchar TL,TH,shi,ge,shifen,fuhao;

static char court=0,pic=0,disp=0;

sbit P20=P2^0; //定义各端口

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P31=P3^1;

sbit DQ=P2^6;

sbit P30=P3^0;

sbit P32=P3^2;

sbit P33=P3^3;

sbit P07=P0^7;

sbit Speak=P1^7;

//********************延时程序***********************************// void delay(uint n)

{

while(n--);

}

//*******************外部中断0******************************************// void intersvr0(void) interrupt 0

{

P0=0X00;

} delay(600); //主要通过切换PIC 辅助数据修改 if(disp==0) disp=2; else if(disp==1) disp=3; else ++pic;

//*******************外部中断1*****************************************//

31

附录

void zhuanhuan(void) interrupt 2

{

} P0=0X00; //通过改变disp 的值进行显示切换 delay(600); ++disp; if(disp>1) disp=0;

//********************定时器中断************************************// void int1()interrupt 1

{

TH0=0X3C; //重新开始计时,计时时间50MS

TL0=0XB0;

++court;

if(court==20)

{court=0;++second;

if(second==60)

{second=0;++minter;

if(minter==60)

{minter=0;++hour;

if(hour==24)

hour=0;}

} }

}

//*************实现时间调整时的闪烁功能**********************************// void shanshuo()

{

++x;

if(x==300)

{P0=0X00;

delay(25000);

x=0;}

}

//***************数码管显示程序**************************************// void v4(int a) //显示数码管第4位

{

P0=d[a]; P23=0; delay(15); P23=1;

}

32

附录

void v3(int b) //显示数码管第3位

{

P0=d[b];

if(disp==0)

P07=1;

P22=0;

delay(15);

P22=1;

}

void v2(int c)

{

} //显示数码管第2位 P0=d[c]; if(disp==1) if(court==0) P07=1; P21=0; delay(15); P21=1;

//显示数码管第1位 void v1(int e)

{

P0=d[e];

P20=0;

delay(15);

P20=1;

}

//**************时间显示*****************************************// void time()

{

v1(hour/10);

v2(hour%10);

v3(minter/10);

v4(minter%10);

}

//***************时间设置********************************************// void timeset() {

switch(pic)

{

case 1:v3(minter/10);v4(minter%10); //分钟修改

33 case 0:time();shanshuo();break; //进入时间修改

附录

if(P30==0)

{

delay(600);

while(P30==0);++minter;

if(minter>60)minter=0;

}

if(P31==0)

{

delay(600);

while(P31==0);

if(minter==0)minter=61;--minter;

}break;

case 2:v1(hour/10);v2(hour%10); //小时修改

if(P30==0)

{

delay(600);

while(P30==0);++hour;

if(hour>24)hour=0;}

if(P31==0)

{

delay(600);

while(P31==0);

if(hour==0)hour=25;--hour;

}break;

case 3:disp=1;pic=0;

}

}

//****************DS18B20复位*******************************************// reset()

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();

DQ=0; //发出复位信号 delay(50); // 延时550us DQ=1; // 拉高

34

附录

} } delay(6); // 延时66us presence=DQ; // 接受响应值 delay(45); //延时500us presence = ~DQ; } DQ=1;

//**********DS18B20写数据********************************************// void writebyte(uchar val)

{

uchar i;

} for (i=8; i>0; i--) //循环八次 { DQ=1; _nop_();_nop_(); DQ = 0; _nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //写入1位 delay(6); //延时66us val=val/2; //右移1位 } DQ = 1; delay(1);

//******** DS18B20读数据***********************************************// uchar readbyte(void)

{

uchar i;

uchar value = 0;

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

{

DQ=1; _nop_();_nop_();

value>>=1;

DQ = 0; //读数据 _nop_();_nop_();_nop_();_nop_(); //4us DQ = 1; _nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80; delay(6); //66us } DQ=1; return(value);

}

35

附录

//*********获取EPROM 中的温度限值**************************************// void Recall()

{

reset();

writebyte(0xcc);

writebyte(0xb8);

reset();

writebyte(0xCC);

writebyte(0xBE);

readbyte();

readbyte();

TH2=readbyte();

TL2=readbyte();

}

//***********温度限值设置程序*****************************************// void tempset()

{

switch(pic)

{

case 0: v1(TL2/100);v2(TL2/10%10);v3(TL2%10);v4(10);//下限值设置 if(P30==0) { delay(600); while(P30==0); ++TL2; if(TL2>99) TL2=0; } if(P31==0) { delay(600); while(P31==0); if(TL2==0) TL2=99; --TL2; }break; if(P30==0) { delay(600);

36 case 1:v1(TH2/100);v2(TH2/10%10);v3(TH2%10); //上限值设置

附录

while(P30==0); ++TH2; if(TH2>99) TH2=0; } if(P31==0) { delay(600); while(P31==0); if(TH2==0) TH2=99; --TH2; }break;

}

} case 2:if(TH2

//***********温度读取与转换*********************************************// void GetTemp()

{

uchar n=0,temp;

reset(); //复位 writebyte(0xCC); // Skip ROM writebyte(0xBE); // 发送温度读取命令 TL=readbyte(); TH=readbyte(); reset(); writebyte(0xCC); // Skip ROM writebyte(0x44); //发送温度转换命令 if((TH&0xf8)!=0x00)

{

37

附录

TH=~(TH); TL=~(TL)+1; n=1; }//负数求补码 if(TL>255) TH++; t emp=TL&0x0f;

shifen=ditab[temp];

temp=((TL&0xf0)>>4)|((TH&0x07)

if((temp=TH2)) //温度限值判断

Speak=1;

else

Speak=0;

if(n!=1)

fuhao=temp/100;

else

fuhao=10;

shi=temp/10%10;

ge=temp%10;

}

//**********温度显示程序************************************************// void temp()

{

int i;

GetTemp();

for(i=0;i

{

v1(fuhao);

v2(shi);

v3(ge);

v4(shifen);

}

}

//************MAIN函数********************************************// void main()

{

Speak=0;

TMOD=0x11;

IE=0x8f;

TCON=0x05;

TH0=0X3C;

38

附录

TL0=0XB0; TR0=1; Recall(); 获得温度限值 while(1) { switch(disp) { case 0:temp();break; case 1:time();break;

case 2:tempset();break;

case 3:timeset();break;

}

}

39


相关文章

  • 电子信息工程毕业设计题目大全
  • 1 压力容器液位测量 2 多功能遥控小车 3基于RS232的仓库多点温度.湿度.气 4压检测系统 5自动控制升降旗系统 6基于RS485的温度报警系统 7基于模糊算法的水温控制系统的设计 8多分机电话交换机 9简易火灾自动报警系统 10基于 ...查看


  • 电子信息类毕业设计课题
  • 电子信息类毕业设计课题 [电子通讯] 出租车计价系统 [过程控制] 基于单片机实现单回路智能调节.. [电子通讯] 脉冲数字频率计 [机床仪表] 仪表机床数控系统的设计(论文.. 磁流体发电论文 [电子通讯] 基于VC++6.0的PC 机与 ...查看


  • 最新电子信息工程毕业论文题目参考
  • 1. 家庭防盗报警系统 2. 单片机实现单步进电机及8位流水灯控制的设计 3. 篮球竞赛计时系统 4. 单片机89C51在直流调速控制系统中的应用 5. 八路数字抢答器 6. 基于51机的直流电机设计 7. 基于51单片机的步进电机控制系统 ...查看


  • 室内温度多点检测系统设计
  • 中图分类号:TP311 文献标识码:A 文章编号:1009-2552(2011)01-0020-03 室内温度多点检测系统设计 王战备 (陕西理工学院电信系,汉中723003) 摘 要:温度检测目前广泛应用于工农业生产及人民生活的的各个领域 ...查看


  • 广东海洋大学本科生毕业论文(设计)一览表
  • 广东海洋大学本科生毕业论文(设计)一览表 学院 :信息学院 专业:电子信息工程专业 班级:1031-1036 本班第 页共9页 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 学 ...查看


  • 通信工程毕业设计题目精选
  • 我7岁1就始做做开发的推批销,就更加员会到挣体的不轻钱.易活生的艰了.人家做辛个小8时我就做1,6小时. 个为失败少理找由 多成为找功法 大多方数想要改革这人世界个 不晓得即时却小事做从起 信工程通毕业计题设精选目 . 1智压力能传感系统器 ...查看


  • 基于单片机的数字温度计课程设计报告
  • <基于单片机的数字温度计课程设计> 设计报告 设计时间:班 级: 姓 名:报告页数: 广东工业大学课程设计报告 设计题目_基于单片机的数字温度计设计_ 学院_信息工程_专业__应用电子技术_11(3)_班 学号_31110026 ...查看


  • 多路温度采集系统设计与实现资料
  • 学校代码:11517 学 号:[1**********]7 ENGINEERING HENAN INSTITUTE OF 毕业设计(论文) 题 目 多路温度采集系统设计与实现 学生姓名 高宇照 专业班级 电气工程及其自动化1121 学 号 ...查看


  • 基于单片机的恒温控制系统 1
  • 摘要:在工业生产中,电流.电压.温度.压力.流量.流速和开关量都是常用的主要被控参数.其中,温度控制也越来越重要.在工业生产的很多领域中,人们都需要对各类加热炉.热处理炉.反应炉和锅炉中的温度进行检测和控制.采用单片机对温度进行控制不仅具有 ...查看


热门内容