《测控系统原理与设计》课程设计
课题: DS18B20数字温度计的设计
班级 测控1102班 学号 学生姓名 专业 测控技术与仪器 系别 电子信息工程系 指导教师杨银贤 毛钢元
淮阴工学院 电子信息工程系
2013年5月
一.设计目的
《测控系统原理与设计》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计练习,可使学生初步体验微机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。
通过课程设计,应能加强学生如下能力的培养。
二.摘要
温度是一种最基本的环境参数,人们生活与环境温度息息相关,在工业生产过程中需要实时测量温度,在工业生产中也离不开温度的测量,因此研究温度的测量方法和控制具有重要的意义。
1976单片机自年由Intel 公司推出MCS-48开始,迄今已有三十多年了。由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点。单片机有两种基本结构形式:一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器。目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。一种以单片机为主要控制器件,以DS18B20为温度传感器的新型数字温度计。主要包括硬件电路的设计和系统程序的设计。硬件电路主要包括主控制器,测温控制电路和显示电路等,主控制器采用单片机AT89C51,温度传感器采用美国DALLAS 半导体公司生产的DS18B20,显示电路采用8位共阴极LED 数码管。系统程序主要包括主程序,测温子程序和显示子程序等。DS18B20新型单总线数字温度传感器是DALLAS 公司生产的单线数字温度传感器,集温度测量和A/D转换于一体,直接输出数字量,具有接口简单、精度高、抗干扰能力强、工作稳定可靠等特点。
由于采用了改进型智能温度传感器DS18B20作为检测元件,与传统的温度计相比,本数字温度计减少了外部的硬件电路,具有低成本和易使用的特点。DS18B20温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发,具有很好的发展前景。
三.设计要求
采用智能温度传感器DS18B20做为检测元件,AT80C2051做为控制器,采用LED 数码管直接显示温度值。
四. 芯片简介
(1) 适应电压范围更宽,电压范围:3.0V~5.5V,在寄生电源方式下可由数据线供电。 (2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3) DS18B20在使用中不需要任何外围原件,全部传感元件及转换电路集成在形成一只三极管的集成电路内。
(4) 测温范围—55℃~+125℃时精度为±0.5℃.
(5) 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃,0.0625℃,可实现高精度测温。
(6) 在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换数字,速度更快。
(7)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU 同时可传送CRC 效验码,具有极强的抗干扰纠错能力。
(8)负压特性:电源极性接反时,芯片不会因为发热而烧毁,但不能正常工作。
五.系统的硬件
1)AT89C51的简介
AT89C51是美国ATMEL 公司生产的低功耗,高性能CMOS8位单片机,片内含4kbytes 的可编程的Flash 只读程序存储器,兼容标准8051指令系统及引脚,并集成了 Flash 程序存储器,既可在线编程(ISP),也可用传统方法进行编程,因此,低价位AT89C51单片机可应用于许多高性价比的场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。AT89C51的主要特性如下:
(1)与MCS-51 兼容;(2) 4K字节可编程闪烁存储器;(3) 寿命:1000写/擦循环;(4)数据保留时间:10年;(5) 全静态工作:0Hz-24Hz ;(6)三级程序存储器锁定;(7) 128*8位内部RAM ;(8)32根可编程I/O线;(9) 两个16位定时器/计数器;(10)5个中断源;(11) 可编程串行通道;(12)低功耗的闲置和掉电模式;(13)片内振荡器和时钟电路。 1、AT89C51引脚图
芯片AT89C51的引脚排列和逻辑符号如下图所示。
AT89C51单片机引脚图
2、AT89C51引脚功能介绍
单片机芯片AT89C51为40引脚双列直插式封装。其各个引脚功能介绍如下: (1) VCC:供电电压; (2) GND:接地; (3) P0口
P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL 门电流。当P1口的管脚写”1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH 编程时,P0口作为原码输入口,当FLASH 进行校验时,P0输出原码,此时P0外部电位必须被拉高。 (4) P1口
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入”1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。 (5) P2口
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储
[5]
器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址”1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。 (6) P3口
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入”1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,同时P3口同时为闪烁编程和编程校验接收一些控制信号。其具体功能如表3.1所示。 表3.1 P3口的特殊功能
端口定义 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
符号表示 RXD TXD INT0 INT1 T0 T1 WR RD
功能描述 串行输入口 串行输出口 外部中断0 外部中断1 定时器0外部输入 定时器1外部输入 外部数据存储器写选外部数据存储器读选
(7) RST:复位输入端。当振荡器复位时,要保持RST 脚两个机器周期的高电平时间。
(8) ALE / PROG
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX ,MOVC 指令时ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。 (9) PSEN
外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN 两次有效。
但在访问外部数据存储器时,这两次有效的PSEN 信号将不出现。 (10) EA/VPP
当EA 保持低电平时,访问外部ROM ;注意加密方式1时,EA 将内部锁定为RESET ;当EA 端保持高电平时,访问内部ROM 。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP)。 (11) XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 (12) XTAL2:来自反向振荡器的输出。
2) LED数码管的操作
LED 数码管,也叫LED 数码显示器,由于它具有很高的性能价格比、显示清晰、亮度高、使用方便、电路简单、寿命长等诸多优点,长期以来一直在各类电子产品和工程控制中得到非常广泛的应用。在单片机控制系统中,因为单片机的硬件简单、灵活等特点,非常适合使用LED 数码管作为其输出设备,这样既满足了控制系统硬件简单,又能如实地显示被控系统的温度、压力、流量、高度等一些单片机的处理结果。
LED 数码管的基本组成是半导体发光二极管,它是将若干个发光二极管,按照一定的笔段组合起来构成的一个整体。LED 数码管能显示0~9十个数字及部份英文字母。常见的八段LED 数码管结构如下图所示。
图3.10 数码管的内部结构
它由8个发光二极管组成,其中7个长条形的发光二极管排列成”日”字形,另一个发光二极管在整个数码管的右下角,用来显示小数点。根据8个发光二极管的不同连接形式,可以将LED 数码管分成共阳极和共阴极两种。将8个发光二极管的阳极都连在一起的,称之为共阳极LED 数码管;将8个发光二极管的阴极都连在一起的,称之为共阴极LED 数码管。
共阴极和共阳极结构的LED 数码管各笔段名和安排位置是相同的(如图3.10所示) 。
当发光二极管导通时,相应的笔段发亮,由发亮的笔段组合成0~9十个数字及部分英文字母。这里我们以共阴极LED 数码管为例,当让其显示数字”3”时,只要a 、b 、c 、d 、g 段的发光二极管点亮,e 、f 、dp 段的发光二极管不亮,即a 、b 、c 、d 、g 段发光二极管的阳极加上高电平”1”, e 、f 、dp 段发光二极管的阳极加上低电平”0”,同时使LED 数码管的公共阴极接低电平”0”,则LED 数码管此时就能显示数字”3”。
如果加到各笔段对应发光二极管阳极上的代码不同,则就能控制LED 数码管显示不同的字符和数字,这个代码称为段码。通常将这个段码用单片机系统中的一个字节进行存储,正好这个字节中的8个二进制位(D7、D6、D5、D4、D3、D2、D1、D0) ,依次对应LED 数码管的8个笔段dp 、g 、f 、e 、d 、c 、b 、a 。
3) 温度传感器
DS18B20温度传感器是采用美国DALLAS 公司生产的 DS18B20可组网数字温度传感器芯片,经焊接,外加不锈钢保护管封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域, 并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。 1. 技术性能描述
* 独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯, 在使用中不需要任何外围元件。 * 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。 -
* 支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温。 * 工作电源: 3~5V/DC
* 测量结果以9位数字量方式串行传送。 * 不锈钢保护管直径 Φ6
* 适用于1/2”, 3/4”, 1”, DN40~DN250各种介质工业管道和狭小空间设备测温 2. 应用范围
* 该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域 * 供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制 3.DS18B20的性能特点如下:
*独特的单线接口仅需要一个端口引脚进行通信;
*多个DS18B20可以并联在惟一的三线上,实现多点组网功能; *无须外部器件;
*可通过数据线供电,电压范围为3.0~5.5V; *零待机功耗;
*温度以9或12位数字; *用户可定义报警设置;
*负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用3脚PR -35封装或8脚SOIC 封装,其内部结构框图如下所示。
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器。DS18B20的管脚排列如下图所示:
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM 和一个非易失性的可电擦除的EERAM 。高速暂存RAM 的结构为8字节的存储器,结构如上图所示。头2个字节包含测得的温度信息,第3和第4字节TH 和TL 的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20
工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如下图所示。低5位一直为1,TM 是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
由下表可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM 的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC 码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB 式表示。
当符号位S =0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S =1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。
DS18B20完成温度转换后,就把测得的温度值与RAM 中的TH 、TL 字节内容作比较。若T >TH 或T <TL ,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令做出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM 的最高有效字节中存储有循环冗余检验码(CRC )。主机ROM 的前56位来计算CRC 值,并和存入DS18B20的CRC 值作比较,以判断主机收到的ROM 数据是否正确。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据。分别说明如下:
(1)初始化 单总线的所有处理均从初始化开始。初始化过程是主机通过向作为从机的DS18B20芯片发一个有时间宽度要求的初始化脉冲实现的。初始化后,才可进行读写操作。 (2)ROM操作命令 总线主机检测到DS18B20的存在 便可以发出ROM 操作命令之一 这些命令表2.2:
表2.2 ROM操作命令
(3)存储器操作 命令如表2.3:
(4) 时序 主机使用时间隙(time slots)来读写DS18B20的数据位和写命令字的位 ①初始化时序见图2.7,主机总线to 时刻发送一复位脉冲(最短为480us 的低电平信号) ,接着在tl 时刻释放总线并进入接收状态。DS18B20在检测到总线的上升沿之后等待15-60us ,接着DS18B20在t2时刻发出存在脉冲(低电平 持续60-240 us)。如图中虚线所示:
图2.7 初始化时序
②写时间隙
写0时序 写1时序
当主机总线t o 时刻从高拉至低电平时,就产生写时间隙见图2.8.1和图2.8.2。从to 时刻开始15us 之内应将所需写的位送到总线上,DSl820在t o后15-60us 间对总线采样。若低电平,写入的位是0。见图2.5.1。若高电平写入的位是1见图2.5.2。连续写2位间的间隙应大于1us 。 ③读时间隙
见下图,主机总线to 时刻从高拉至低电平时,总线只须保持低电平l us。之后在t1时刻将总线拉高,产生读时间隙,读时间隙在t1时刻后t 2时刻前有效,t 2距to 为15us 。也就是说t 2时刻前主机必须完成读位,并在t o后的60us 一120us 内释放总线,读位子程序(读得的位到C 中) 。
读时序
DSl820多路测量简介
DSl820原理框图
每一片DSl820在其ROM 中都存有其唯一的48位序列号,出厂前已写入片内ROM 中,主机在进入操作程序前必须逐一接入DS18B20用读ROM(33H)命令将该DS18B20的序列号读出并登录。当主机需要对众多在线DS18B20的某一个进行操作时,首先要发出匹配ROM 命令(55H),紧接着主机提供64位序列(包括该DS18B20的48位序列号) 。之后的操作就是针对该DS18B20的。而所谓跳过ROM 命令即:MOV A,#0CCH。
上图中先有跳过ROM ,即是启动所有DS18B20进行温度变换,之后通过匹配ROM 再逐一地读回每个DS18B20的温度数据。在DS18B20组成的测温系统中,主机在发出跳过ROM 命令之后,再发出统一的温度转换启动码44H ,就可以实现所有DS18B20的统一转换,再经过1s 后,就可以用很少的时间去逐一读取。这种方式使其T 值往往小于传统方式。(由于采取公用的放大电路和A/D转换器只能逐一转换)。显然通道数越多,这种省时效应就越明显。
DS1820使用中注意事项 :
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点, 但在实际应用中也应注意以下几方面的问题:
(1)较小的硬件开销需要相对复杂的软件进行补偿, 由于DS1820与微处理器间采用串行数据传送, 因此, 在对DS1820进行读写编程时, 必须严格的保证读写时序, 否则将无法读取测温结果。在使用PL/M、C 等高级语言进行系统程序设计时, 对DS1820操作部分最好采用汇编语言实现。
(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题, 容易使人误认为可以挂任意多个DS1820, 在实际应用中并非如此。当单总线上所挂DS1820超过8个时, 就需要解决微处理器的总线驱动问题, 这一点在进行多点测温系统设计时要加以注意。
(3)连接DS1820的总线电缆是有长度限制的。试验中, 当采用普通信号电缆传输长度超过50m 时, 读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时, 正常通讯距离可达150m, 当采用每米绞合次数更多的双绞线带屏蔽电缆时, 正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此, 在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
(4)在DS1820测温程序设计中, 向DS1820发出温度转换命令后, 程序总要等待DS1820的返回信号, 一旦某个DS1820接触不好或断线, 当程序读该DS1820时, 将没有返回信号, 程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线, 其中一对线接地线与信号线, 另一组接VCC 和地线, 屏蔽层在源端单点接地。 DS18B20测温原理
DS18B20的测温原理如图3.8所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量. 计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
图3.8 DS18B20测温原理图
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3.8中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时间概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据。
在正常测温情况下,DS18B20的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS18B20提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz ,然后再用BEH 指令取计数器1的计数剩余值Cs 和每度计数值CD 。实际温度Ts 可用式(3.1)计算:
Ts=(Tz-0.25℃)+(CD-Cs)/CD (3.1)
六.硬件电路的设计
1)复位电路的设计
单片机复位电路的设计如下图所示。该复位电路采用手动复位与上电复位相结合的方
式。当按下按键S1时,VCC 通过R1电阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC 通过电阻R2和电容C 构成回路,该回路是一个对电容C 充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU 复位电压,实现上电复位功能。
单片机复位电路
2)晶振电路的设计
单片机晶振电路的设计如下图所示。XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(X2)是来自反向振荡器的输出。按照理论上AT89C51使用的是12MHz 的晶振,但实测使用11.0592MHz 。所以设计者通常用的是11.0592MHz 。
3)温度采集电路的设计
由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用DALLAS 公司的数字温度传感器DS18B20作为测温元件。温度采集电路
设计的温度采集电路如下图所示。
单片机晶振电路
温度采集电路图
4)温度显示电路
显示电路采用4个共阴极LED 数码管,从P1口并行输出温度段码,用P3.0~P3.3四个端口输出选择脉冲,控制数码管的点亮。其具体电路图如下图所示。
显示电路
其工作过程如下:
1、并行数据由P1口送至4个数码管。
2、这时P3.0、P3.1、P3.2、P3.3轮流输出低电平,LED 数码管依次被点亮,显示P1传送来的数据。
由于数码管余辉效应和人眼的视觉延迟,当数码管每秒点亮50次时,就会出现静止显示的温度值。
七.调试
本次设计系统的调试以程序的调试为主。
先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等的编程及调试。
由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时,必须严格的保证读/写时序,否则将无法读取测量结果。本程序采用单片机C 语言编写,用Keil C 编译器编程调试。
软件调试到数码管能显示温度值,而且在有温度变化时(例如改变传感器的温度值)显示温度能改变。
八. 系统的软件设计
1)温度采集程序的设计
温度采集程序流程图如下图所示。
图4.4 温度采集流程
采集程序
主要程序代码及其说明(见注释语句)如下: uchar tplsb,tpmsb; sbit DQ=P0^0;
//温度值低位、高位字节
//数据通信线
/*延时t 毫秒*/ void delay(uint t) { uint i ; while (t--) {
/*对于11.0592Hz 时钟,约延时1毫秒*/ for (i=0;i
/*产生复位脉冲,初始化DS18B20*/ void Txreset (void) { uint i ;
DQ =0;
/*拉低约900μs*/ i=100; while (i>0)i--; DQ =1 ;
i=4 ; while (i>0) i--;
}
/*等待应答脉冲*/ void RxWait (void) { uint i ; while (DQ) ; while (~DQ) ;
//检测到应答脉冲
//产生上升沿
i =4 ;
while (i>0) i-- ;
}
/*读取数据的一位,满足读时序要求*/ bit RdBit (void) { uint i ; bit b ;
DQ=0;
i++; //保持低至1us DQ=1;
i++; i++; //延时15us 以上,读时序下降沿后15us ,DS18B20
输出数据才有效
b=DQ; i=8;
while(i>0) i--; //读时隙不低于60us return(b);
}
/*读取数据的一个字节*/ uchar RdByte(void) {
uchar i,j,b; b=0;
for (i=1;I
j=RdBit(); b=(j>1); } return(b);
}
/*写数据的一个字节,满足写”1”和写”0”的设计要求*/
void WrByte (uchar b) { uint i ; uchar j ; bit btmp ; for (j=1;j
btmp =b&0x01; b=b>>1;
if (btmp) {
/*写1*/
DQ=0; i++;i++; DQ=1; i=8;
while (i>0) i--; } else {
/*写0*/ DQ=0; i=8;
while (i>0) i--; DQ=1; i++;
i++; } } }
//取下一位(由低位向高位)
//延时,使得15us 以内拉高
//整个写1时序不低于60us
//保持低电平在60us 到120us 之间
/*启动温度转换*/ void convert (void) {
TxTeset (); RxWait ();
delay (1);
//产生复位脉冲,初始化DS18B20 //等待DS18B20给出应答脉冲 //延时 //skip rom命令 //convert T 命令
WrByte (0xcc); WrByte (0x44);
}
/*读取温度值*/ void Rdtemp (void) {
TxReset (); RxWait (); delay (1);
//产生复位脉冲,初始化DS18B20 //等待DS18B20给出应答脉冲 //延时
//skip rom 命令 //read scratchpad 命令
WrByte (0xcc); WrByte (0xbe);
tplsb=RdByte (); //温度值低位字节(其中低4位为二进制的”小数”部分) tpmsb=RdByte();
}
/*主程序,读取的温度值最终存放在tplsb 和tpmsb 变量中。tplsb 其中低4位为二进制的”小数”部分;tpmsb 其中高5位为符号位;真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分) 的转换*/
void main (void) { do {
delay (1); convert ();
//延时1ms
//启动温度转换,需要750ms //延时1s //读取温度
delay (1000); RdTemp ();
} while (1); }
2)温度显示程序的设计
程序流程图
温度显示程序流程图如下图所示。
LED 显示流程图
显示程序
void display(unsigned char *lp) //显示 {
unsigned char i;
//定义变量
P3=0; //LED段选共阴极送1点亮某段 P1=0; //LED位选共阴极送0选中某位 P3=0xfe; //先用1111,1110显示第一位 P1=table[lp[0]];
delay(); P1=0;
//延时5个空指令
P3=0xfd; //1111,1101显示第二位 P1=table[lp[1]]; delay(); P1=0;
P3=0xfb; //1111,1011显示第三位 P1=table[lp[2]]|0x80; delay(); P1=0;
P3=0xf7; //1111,0111显示第四位 P1=table[lp[3]];
P1=P1; //发光二极管,用来显示小数点后一位的数字段,
送0点亮,所以不亮的灯就是段码
//延时5个空指令
//延时5个空指令
delay(); P2=1; }
//延时5个空指令
九. 课程设计总结
通过此次课程设计,使我更加扎实的掌握了有关测控系统方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
本次毕业设计是针对MCS-51系列的单片机芯片STC89C51来设计一个数字温度计,该设计充分利用了温度传感器DS18B20功能强大的优点,如DS18B20可以直接读出被测温度值,进行转换;而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,大大简化了硬件电路,也使得该数字温度计不仅具有结构简单、成本低廉、精确度较高、反应速度较快、数字化显示和不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确的场所。
系统的硬件电路图如下图所示。
系统的硬件电路图
《测控系统原理与设计》课程设计
课题: DS18B20数字温度计的设计
班级 测控1102班 学号 学生姓名 专业 测控技术与仪器 系别 电子信息工程系 指导教师杨银贤 毛钢元
淮阴工学院 电子信息工程系
2013年5月
一.设计目的
《测控系统原理与设计》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计练习,可使学生初步体验微机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。
通过课程设计,应能加强学生如下能力的培养。
二.摘要
温度是一种最基本的环境参数,人们生活与环境温度息息相关,在工业生产过程中需要实时测量温度,在工业生产中也离不开温度的测量,因此研究温度的测量方法和控制具有重要的意义。
1976单片机自年由Intel 公司推出MCS-48开始,迄今已有三十多年了。由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点。单片机有两种基本结构形式:一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器。目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。一种以单片机为主要控制器件,以DS18B20为温度传感器的新型数字温度计。主要包括硬件电路的设计和系统程序的设计。硬件电路主要包括主控制器,测温控制电路和显示电路等,主控制器采用单片机AT89C51,温度传感器采用美国DALLAS 半导体公司生产的DS18B20,显示电路采用8位共阴极LED 数码管。系统程序主要包括主程序,测温子程序和显示子程序等。DS18B20新型单总线数字温度传感器是DALLAS 公司生产的单线数字温度传感器,集温度测量和A/D转换于一体,直接输出数字量,具有接口简单、精度高、抗干扰能力强、工作稳定可靠等特点。
由于采用了改进型智能温度传感器DS18B20作为检测元件,与传统的温度计相比,本数字温度计减少了外部的硬件电路,具有低成本和易使用的特点。DS18B20温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发,具有很好的发展前景。
三.设计要求
采用智能温度传感器DS18B20做为检测元件,AT80C2051做为控制器,采用LED 数码管直接显示温度值。
四. 芯片简介
(1) 适应电压范围更宽,电压范围:3.0V~5.5V,在寄生电源方式下可由数据线供电。 (2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3) DS18B20在使用中不需要任何外围原件,全部传感元件及转换电路集成在形成一只三极管的集成电路内。
(4) 测温范围—55℃~+125℃时精度为±0.5℃.
(5) 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃,0.0625℃,可实现高精度测温。
(6) 在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换数字,速度更快。
(7)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU 同时可传送CRC 效验码,具有极强的抗干扰纠错能力。
(8)负压特性:电源极性接反时,芯片不会因为发热而烧毁,但不能正常工作。
五.系统的硬件
1)AT89C51的简介
AT89C51是美国ATMEL 公司生产的低功耗,高性能CMOS8位单片机,片内含4kbytes 的可编程的Flash 只读程序存储器,兼容标准8051指令系统及引脚,并集成了 Flash 程序存储器,既可在线编程(ISP),也可用传统方法进行编程,因此,低价位AT89C51单片机可应用于许多高性价比的场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。AT89C51的主要特性如下:
(1)与MCS-51 兼容;(2) 4K字节可编程闪烁存储器;(3) 寿命:1000写/擦循环;(4)数据保留时间:10年;(5) 全静态工作:0Hz-24Hz ;(6)三级程序存储器锁定;(7) 128*8位内部RAM ;(8)32根可编程I/O线;(9) 两个16位定时器/计数器;(10)5个中断源;(11) 可编程串行通道;(12)低功耗的闲置和掉电模式;(13)片内振荡器和时钟电路。 1、AT89C51引脚图
芯片AT89C51的引脚排列和逻辑符号如下图所示。
AT89C51单片机引脚图
2、AT89C51引脚功能介绍
单片机芯片AT89C51为40引脚双列直插式封装。其各个引脚功能介绍如下: (1) VCC:供电电压; (2) GND:接地; (3) P0口
P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL 门电流。当P1口的管脚写”1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH 编程时,P0口作为原码输入口,当FLASH 进行校验时,P0输出原码,此时P0外部电位必须被拉高。 (4) P1口
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入”1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。 (5) P2口
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储
[5]
器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址”1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。 (6) P3口
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入”1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,同时P3口同时为闪烁编程和编程校验接收一些控制信号。其具体功能如表3.1所示。 表3.1 P3口的特殊功能
端口定义 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
符号表示 RXD TXD INT0 INT1 T0 T1 WR RD
功能描述 串行输入口 串行输出口 外部中断0 外部中断1 定时器0外部输入 定时器1外部输入 外部数据存储器写选外部数据存储器读选
(7) RST:复位输入端。当振荡器复位时,要保持RST 脚两个机器周期的高电平时间。
(8) ALE / PROG
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX ,MOVC 指令时ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。 (9) PSEN
外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN 两次有效。
但在访问外部数据存储器时,这两次有效的PSEN 信号将不出现。 (10) EA/VPP
当EA 保持低电平时,访问外部ROM ;注意加密方式1时,EA 将内部锁定为RESET ;当EA 端保持高电平时,访问内部ROM 。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP)。 (11) XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 (12) XTAL2:来自反向振荡器的输出。
2) LED数码管的操作
LED 数码管,也叫LED 数码显示器,由于它具有很高的性能价格比、显示清晰、亮度高、使用方便、电路简单、寿命长等诸多优点,长期以来一直在各类电子产品和工程控制中得到非常广泛的应用。在单片机控制系统中,因为单片机的硬件简单、灵活等特点,非常适合使用LED 数码管作为其输出设备,这样既满足了控制系统硬件简单,又能如实地显示被控系统的温度、压力、流量、高度等一些单片机的处理结果。
LED 数码管的基本组成是半导体发光二极管,它是将若干个发光二极管,按照一定的笔段组合起来构成的一个整体。LED 数码管能显示0~9十个数字及部份英文字母。常见的八段LED 数码管结构如下图所示。
图3.10 数码管的内部结构
它由8个发光二极管组成,其中7个长条形的发光二极管排列成”日”字形,另一个发光二极管在整个数码管的右下角,用来显示小数点。根据8个发光二极管的不同连接形式,可以将LED 数码管分成共阳极和共阴极两种。将8个发光二极管的阳极都连在一起的,称之为共阳极LED 数码管;将8个发光二极管的阴极都连在一起的,称之为共阴极LED 数码管。
共阴极和共阳极结构的LED 数码管各笔段名和安排位置是相同的(如图3.10所示) 。
当发光二极管导通时,相应的笔段发亮,由发亮的笔段组合成0~9十个数字及部分英文字母。这里我们以共阴极LED 数码管为例,当让其显示数字”3”时,只要a 、b 、c 、d 、g 段的发光二极管点亮,e 、f 、dp 段的发光二极管不亮,即a 、b 、c 、d 、g 段发光二极管的阳极加上高电平”1”, e 、f 、dp 段发光二极管的阳极加上低电平”0”,同时使LED 数码管的公共阴极接低电平”0”,则LED 数码管此时就能显示数字”3”。
如果加到各笔段对应发光二极管阳极上的代码不同,则就能控制LED 数码管显示不同的字符和数字,这个代码称为段码。通常将这个段码用单片机系统中的一个字节进行存储,正好这个字节中的8个二进制位(D7、D6、D5、D4、D3、D2、D1、D0) ,依次对应LED 数码管的8个笔段dp 、g 、f 、e 、d 、c 、b 、a 。
3) 温度传感器
DS18B20温度传感器是采用美国DALLAS 公司生产的 DS18B20可组网数字温度传感器芯片,经焊接,外加不锈钢保护管封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域, 并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。 1. 技术性能描述
* 独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯, 在使用中不需要任何外围元件。 * 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。 -
* 支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温。 * 工作电源: 3~5V/DC
* 测量结果以9位数字量方式串行传送。 * 不锈钢保护管直径 Φ6
* 适用于1/2”, 3/4”, 1”, DN40~DN250各种介质工业管道和狭小空间设备测温 2. 应用范围
* 该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域 * 供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制 3.DS18B20的性能特点如下:
*独特的单线接口仅需要一个端口引脚进行通信;
*多个DS18B20可以并联在惟一的三线上,实现多点组网功能; *无须外部器件;
*可通过数据线供电,电压范围为3.0~5.5V; *零待机功耗;
*温度以9或12位数字; *用户可定义报警设置;
*负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用3脚PR -35封装或8脚SOIC 封装,其内部结构框图如下所示。
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器。DS18B20的管脚排列如下图所示:
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM 和一个非易失性的可电擦除的EERAM 。高速暂存RAM 的结构为8字节的存储器,结构如上图所示。头2个字节包含测得的温度信息,第3和第4字节TH 和TL 的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20
工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如下图所示。低5位一直为1,TM 是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
由下表可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM 的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC 码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB 式表示。
当符号位S =0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S =1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。
DS18B20完成温度转换后,就把测得的温度值与RAM 中的TH 、TL 字节内容作比较。若T >TH 或T <TL ,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令做出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM 的最高有效字节中存储有循环冗余检验码(CRC )。主机ROM 的前56位来计算CRC 值,并和存入DS18B20的CRC 值作比较,以判断主机收到的ROM 数据是否正确。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据。分别说明如下:
(1)初始化 单总线的所有处理均从初始化开始。初始化过程是主机通过向作为从机的DS18B20芯片发一个有时间宽度要求的初始化脉冲实现的。初始化后,才可进行读写操作。 (2)ROM操作命令 总线主机检测到DS18B20的存在 便可以发出ROM 操作命令之一 这些命令表2.2:
表2.2 ROM操作命令
(3)存储器操作 命令如表2.3:
(4) 时序 主机使用时间隙(time slots)来读写DS18B20的数据位和写命令字的位 ①初始化时序见图2.7,主机总线to 时刻发送一复位脉冲(最短为480us 的低电平信号) ,接着在tl 时刻释放总线并进入接收状态。DS18B20在检测到总线的上升沿之后等待15-60us ,接着DS18B20在t2时刻发出存在脉冲(低电平 持续60-240 us)。如图中虚线所示:
图2.7 初始化时序
②写时间隙
写0时序 写1时序
当主机总线t o 时刻从高拉至低电平时,就产生写时间隙见图2.8.1和图2.8.2。从to 时刻开始15us 之内应将所需写的位送到总线上,DSl820在t o后15-60us 间对总线采样。若低电平,写入的位是0。见图2.5.1。若高电平写入的位是1见图2.5.2。连续写2位间的间隙应大于1us 。 ③读时间隙
见下图,主机总线to 时刻从高拉至低电平时,总线只须保持低电平l us。之后在t1时刻将总线拉高,产生读时间隙,读时间隙在t1时刻后t 2时刻前有效,t 2距to 为15us 。也就是说t 2时刻前主机必须完成读位,并在t o后的60us 一120us 内释放总线,读位子程序(读得的位到C 中) 。
读时序
DSl820多路测量简介
DSl820原理框图
每一片DSl820在其ROM 中都存有其唯一的48位序列号,出厂前已写入片内ROM 中,主机在进入操作程序前必须逐一接入DS18B20用读ROM(33H)命令将该DS18B20的序列号读出并登录。当主机需要对众多在线DS18B20的某一个进行操作时,首先要发出匹配ROM 命令(55H),紧接着主机提供64位序列(包括该DS18B20的48位序列号) 。之后的操作就是针对该DS18B20的。而所谓跳过ROM 命令即:MOV A,#0CCH。
上图中先有跳过ROM ,即是启动所有DS18B20进行温度变换,之后通过匹配ROM 再逐一地读回每个DS18B20的温度数据。在DS18B20组成的测温系统中,主机在发出跳过ROM 命令之后,再发出统一的温度转换启动码44H ,就可以实现所有DS18B20的统一转换,再经过1s 后,就可以用很少的时间去逐一读取。这种方式使其T 值往往小于传统方式。(由于采取公用的放大电路和A/D转换器只能逐一转换)。显然通道数越多,这种省时效应就越明显。
DS1820使用中注意事项 :
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点, 但在实际应用中也应注意以下几方面的问题:
(1)较小的硬件开销需要相对复杂的软件进行补偿, 由于DS1820与微处理器间采用串行数据传送, 因此, 在对DS1820进行读写编程时, 必须严格的保证读写时序, 否则将无法读取测温结果。在使用PL/M、C 等高级语言进行系统程序设计时, 对DS1820操作部分最好采用汇编语言实现。
(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题, 容易使人误认为可以挂任意多个DS1820, 在实际应用中并非如此。当单总线上所挂DS1820超过8个时, 就需要解决微处理器的总线驱动问题, 这一点在进行多点测温系统设计时要加以注意。
(3)连接DS1820的总线电缆是有长度限制的。试验中, 当采用普通信号电缆传输长度超过50m 时, 读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时, 正常通讯距离可达150m, 当采用每米绞合次数更多的双绞线带屏蔽电缆时, 正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此, 在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
(4)在DS1820测温程序设计中, 向DS1820发出温度转换命令后, 程序总要等待DS1820的返回信号, 一旦某个DS1820接触不好或断线, 当程序读该DS1820时, 将没有返回信号, 程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线, 其中一对线接地线与信号线, 另一组接VCC 和地线, 屏蔽层在源端单点接地。 DS18B20测温原理
DS18B20的测温原理如图3.8所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量. 计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
图3.8 DS18B20测温原理图
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3.8中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时间概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据。
在正常测温情况下,DS18B20的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS18B20提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz ,然后再用BEH 指令取计数器1的计数剩余值Cs 和每度计数值CD 。实际温度Ts 可用式(3.1)计算:
Ts=(Tz-0.25℃)+(CD-Cs)/CD (3.1)
六.硬件电路的设计
1)复位电路的设计
单片机复位电路的设计如下图所示。该复位电路采用手动复位与上电复位相结合的方
式。当按下按键S1时,VCC 通过R1电阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC 通过电阻R2和电容C 构成回路,该回路是一个对电容C 充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU 复位电压,实现上电复位功能。
单片机复位电路
2)晶振电路的设计
单片机晶振电路的设计如下图所示。XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(X2)是来自反向振荡器的输出。按照理论上AT89C51使用的是12MHz 的晶振,但实测使用11.0592MHz 。所以设计者通常用的是11.0592MHz 。
3)温度采集电路的设计
由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用DALLAS 公司的数字温度传感器DS18B20作为测温元件。温度采集电路
设计的温度采集电路如下图所示。
单片机晶振电路
温度采集电路图
4)温度显示电路
显示电路采用4个共阴极LED 数码管,从P1口并行输出温度段码,用P3.0~P3.3四个端口输出选择脉冲,控制数码管的点亮。其具体电路图如下图所示。
显示电路
其工作过程如下:
1、并行数据由P1口送至4个数码管。
2、这时P3.0、P3.1、P3.2、P3.3轮流输出低电平,LED 数码管依次被点亮,显示P1传送来的数据。
由于数码管余辉效应和人眼的视觉延迟,当数码管每秒点亮50次时,就会出现静止显示的温度值。
七.调试
本次设计系统的调试以程序的调试为主。
先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等的编程及调试。
由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时,必须严格的保证读/写时序,否则将无法读取测量结果。本程序采用单片机C 语言编写,用Keil C 编译器编程调试。
软件调试到数码管能显示温度值,而且在有温度变化时(例如改变传感器的温度值)显示温度能改变。
八. 系统的软件设计
1)温度采集程序的设计
温度采集程序流程图如下图所示。
图4.4 温度采集流程
采集程序
主要程序代码及其说明(见注释语句)如下: uchar tplsb,tpmsb; sbit DQ=P0^0;
//温度值低位、高位字节
//数据通信线
/*延时t 毫秒*/ void delay(uint t) { uint i ; while (t--) {
/*对于11.0592Hz 时钟,约延时1毫秒*/ for (i=0;i
/*产生复位脉冲,初始化DS18B20*/ void Txreset (void) { uint i ;
DQ =0;
/*拉低约900μs*/ i=100; while (i>0)i--; DQ =1 ;
i=4 ; while (i>0) i--;
}
/*等待应答脉冲*/ void RxWait (void) { uint i ; while (DQ) ; while (~DQ) ;
//检测到应答脉冲
//产生上升沿
i =4 ;
while (i>0) i-- ;
}
/*读取数据的一位,满足读时序要求*/ bit RdBit (void) { uint i ; bit b ;
DQ=0;
i++; //保持低至1us DQ=1;
i++; i++; //延时15us 以上,读时序下降沿后15us ,DS18B20
输出数据才有效
b=DQ; i=8;
while(i>0) i--; //读时隙不低于60us return(b);
}
/*读取数据的一个字节*/ uchar RdByte(void) {
uchar i,j,b; b=0;
for (i=1;I
j=RdBit(); b=(j>1); } return(b);
}
/*写数据的一个字节,满足写”1”和写”0”的设计要求*/
void WrByte (uchar b) { uint i ; uchar j ; bit btmp ; for (j=1;j
btmp =b&0x01; b=b>>1;
if (btmp) {
/*写1*/
DQ=0; i++;i++; DQ=1; i=8;
while (i>0) i--; } else {
/*写0*/ DQ=0; i=8;
while (i>0) i--; DQ=1; i++;
i++; } } }
//取下一位(由低位向高位)
//延时,使得15us 以内拉高
//整个写1时序不低于60us
//保持低电平在60us 到120us 之间
/*启动温度转换*/ void convert (void) {
TxTeset (); RxWait ();
delay (1);
//产生复位脉冲,初始化DS18B20 //等待DS18B20给出应答脉冲 //延时 //skip rom命令 //convert T 命令
WrByte (0xcc); WrByte (0x44);
}
/*读取温度值*/ void Rdtemp (void) {
TxReset (); RxWait (); delay (1);
//产生复位脉冲,初始化DS18B20 //等待DS18B20给出应答脉冲 //延时
//skip rom 命令 //read scratchpad 命令
WrByte (0xcc); WrByte (0xbe);
tplsb=RdByte (); //温度值低位字节(其中低4位为二进制的”小数”部分) tpmsb=RdByte();
}
/*主程序,读取的温度值最终存放在tplsb 和tpmsb 变量中。tplsb 其中低4位为二进制的”小数”部分;tpmsb 其中高5位为符号位;真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分) 的转换*/
void main (void) { do {
delay (1); convert ();
//延时1ms
//启动温度转换,需要750ms //延时1s //读取温度
delay (1000); RdTemp ();
} while (1); }
2)温度显示程序的设计
程序流程图
温度显示程序流程图如下图所示。
LED 显示流程图
显示程序
void display(unsigned char *lp) //显示 {
unsigned char i;
//定义变量
P3=0; //LED段选共阴极送1点亮某段 P1=0; //LED位选共阴极送0选中某位 P3=0xfe; //先用1111,1110显示第一位 P1=table[lp[0]];
delay(); P1=0;
//延时5个空指令
P3=0xfd; //1111,1101显示第二位 P1=table[lp[1]]; delay(); P1=0;
P3=0xfb; //1111,1011显示第三位 P1=table[lp[2]]|0x80; delay(); P1=0;
P3=0xf7; //1111,0111显示第四位 P1=table[lp[3]];
P1=P1; //发光二极管,用来显示小数点后一位的数字段,
送0点亮,所以不亮的灯就是段码
//延时5个空指令
//延时5个空指令
delay(); P2=1; }
//延时5个空指令
九. 课程设计总结
通过此次课程设计,使我更加扎实的掌握了有关测控系统方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
本次毕业设计是针对MCS-51系列的单片机芯片STC89C51来设计一个数字温度计,该设计充分利用了温度传感器DS18B20功能强大的优点,如DS18B20可以直接读出被测温度值,进行转换;而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,大大简化了硬件电路,也使得该数字温度计不仅具有结构简单、成本低廉、精确度较高、反应速度较快、数字化显示和不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确的场所。
系统的硬件电路图如下图所示。
系统的硬件电路图