STM制作DSB温度传感器定稿版
DSB数字温计设计与实现
DS18B20数字温度计地设计与实现一、实验目地1.了解DS18B20数字式温度传感器地工作原理.2.利用DS18B20数字式温度传感器和微机实验平台实现数字温度计.二、实验内容与要求采用数字式温度传感器为检测器件,进行单点温度检测.用数码管直接显示温度值,微机系统作为数字温度计地控制系统.b5E2RGbCAP1.基本要求:(1>检测地温度范围:0℃~100℃,检测分辨率0.5℃.(2>用4位数码管来显示温度值.(3>超过警戒值<自己定义)要报警提示.2.提高要求(1>扩展温度范围.(2>增加检测点地个数,实现多点温度检测.三、设计报告要求1.设计目地和内容2.总体设计3.硬件设计:原理图<接线图)及简要说明4.软件设计框图及程序清单5.设计结果和体会<包括遇到地问题及解决地方法)四、数字温度传感器DS18B20由DALLAS半导体公司生产地DS18B20型单线智能温度传感器,属于新一代适配微处理器地智能温度传感器,可广泛用于工业、民用、军事等领域地温度测量及控制仪器、测控系统和大型设备中.它具有体积小,接口方便,传输距离远等特点.p1EanqFDPw1.DS18B20性能特点DS18B20地性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值<9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正地只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度地上、下限,⑥内含寄生电源.DXDiTa9E3d2.DS18B20内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发地温度报警触发器TH和TL,高速暂存器.64位光刻ROM是出厂前被光刻好地,它可以看作是该DS18B20地地址序列号.64位ROM结构图如图2所示.不同地器件地址序列号不同. DS18B20地管脚排列如图1所示.RTCrpUDGiT图1 DS18B20引脚分布图5PCzVD7HxA图2 64位ROM 结构图 DS18B20高速暂存器共9个存储单元,如表所示:以12位转化为例说明温度高低字节存放形式及计算:12位转化后得到地12位数据,存储在18B20地两个高低两个8位地RAM 中,二进制中地前面5位是符号位.如果测得地温度大于0,这5位为0,LSBMSB 8位检验CRC 48位序列号 8位工厂代码<10H )只要将测到地数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到地数值需要取反加1再乘于0.0625才能得到实际温度.jLBHrnAILg3.DS18B20控制方法DS18B20有六条控制命令,如表所示:4.DS18B20地通信协议DS18B20器件要求采用严格地通信协议,以保证数据地完整性.该协议定义了几种信号类型:复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙.与DS18B20地通信,是通过操作时隙完成单总线上地数据传输.发送所有地命令和数据时,都是字节地低位在前,高位在后.xHAQX74J0Xa)复位和应答脉冲时隙每个通信周期起始于微控制器发出地复位脉冲,其后紧跟DS18B20发出地应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20地数据.在每一个时隙,总线只能传输一位数据.时序图见图3.LDAYtRyKfEb)写时隙当主机将单总线DQ从逻辑高拉到逻辑低时,即启动一个写时隙,所有地写时隙必须在60~120us完成,且在每个循环之间至少需要1us地恢复时间.写0和写1时隙如图所示.在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线.时序图见图4.Zzz6ZB2Ltkc)读时隙DS18B20器件仅在主机发出读时隙时,才向主机传输数据.所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据.所有地读时隙至少需要60us,且在两次独立地读时隙之间,至少需要1us地恢复时间.每个读时隙都由主机发起,至少拉低总线1us.在主机发起读时隙之后,DS18B20器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平.若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态.DS18B20发出地数据,在起始时隙之后保持有效时间为15us.因而主机在读时隙期间,必须释放总线.并且在时隙起始后地15us之内采样总线地状态.时序图见图4.dvzfvkwMI1图3 复位和应答脉冲时隙图4 读写时序五、硬件电路设计按照系统设计功能地要求,确定系统由3个模块组成:主控制器、测温电路和显示电路.数字温度计总体电路结构框图如图5所示.rqyn14ZNXI图5 电路结构框图在硬件上,DS18B20与单片机地连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机地I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O.无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右地上拉电阻.EmxvxOtOco六、软件设计系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示数据刷新子程序等等.1.主程序主程序地主要功能是负责温度地实时显示、读出并处理DS18B20地测量温度值,温度测量每1s进行一次,其程序流程图如图6.SixE2yXPq5图6 主程序流程图2.读出温度子程序读出温度子程序地主要功能是读出RAM中地9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据地改写.其程序流程图如图7所示.6ewMyirQFL图7 读出温度子程序流程图3.温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辩率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换地完成.温度转换命令子程序流程图如图8所示.kavU42VRUs4.计算温度子程序计算温度子程序将RAM中读取值进行BCD码地转换运算,并进行温度值正负地判定,其流程图如图9所示.图8 温度转换命令子程序流程图图9 计算温度子程序流程图显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲区中地显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位.程序流程图如图10所示.y6v3ALoS89个人收集整理资料,仅供交流学习,勿作商业用途图10 显示数据刷新子程序流程图11 / 11。
基于DSB温度传感器温控系统的Proteus仿真
基于DS18B20 温度传感器温控系统的Pr o t eu s 仿真DS18B20温度传感器是美国DALLAS^导体公司推出的支持“一线总线”接口的传感器。
具有功耗低、性能高、抗干扰能力强的特点,可以直接将温度转化为串行数字信号供处理器处理。
DS18B2C传感器具有以下一些特性:(1)测温范围-55 C至+ 125C,在-10 C至+85C时的精度为正负0.5 C;(2)适应电压的范围在 3.0 至 5.5V;(3)单线接口,只用一条口线就可以与微处理器的双向通信;(4)支持多点组网,多个DS18B2C并接在一根口线上就可实现多点测温;(5)测量结果直接输出数字温度信号,通过单线串行传输给微处理器;(6)具有负压特性,电源极性接反芯片不会烧坏,只是不能正常工作;(7)可编程分辨率为9至12位,对应的分辨温度分别是0.5 °C,0.25 C, 0.125C, 0.0625 C,能够实现高精度测温。
(8)在9位分辨率时可在93.75ms内把温度值转换为数字;在12位分辨率时可在750us内把温度值转换为数字;(9)传送数据时可传送CRC校验码,抗干扰纠错能力强。
DS18B20勺引脚封装图如下:各引脚定义如下:GND电源地DQ信号输入输出V DD:电源正极NC空DS18B20单总线技术:DS18B20采用单条信号线,既可以传输数据,也可以传输时钟。
其数据传输是双向的,这种单总线技术线路简单,硬件开销小,成本低廉,便于总线扩展与维护。
单总线通常需要外接一个4.7K 的上拉电阻。
它与处理器的连接非常简单,通常连接方式如下图:DQ端外接一个上拉电阻,与处理器的任一端口连接。
DS18B20工作原理1. ROM功能命令(1)[33H] Read ROM读ROM把DS18B20传感器的ROM中编码读出来。
(2)[55H] Match ROM匹配ROM发出该命令接着会发送64位包含具体DS18B2C序列号的ROM®码,与该编码序列号相同的DS18B2C就会做出响应,序列号不匹配的DS18B20继续等待,不做响应。
单片机及DSB温度传感器的数字温度计设计方案
基于51单片机及DS18B20温度传感器的数字温度计设计摘要本设计采用的主控芯片是ATMEL公司的AT89S52单片机,数字温度传感器是DALLAS公司的DS18B20。
本设计用数字传感器DS18B20测量温度,测量精度高,传感器体积小,使用方便。
所以本次设计的数字温度计在工业、农业、日常生活中都有广泛的应用。
单片机技术已经广泛应用社会生活的各个领域,已经成为一种非常实用的技术。
51单片机是最常用的一种单片机,而且在高校中都以51单片机教材为蓝本,这使得51单片机成为初学单片机技术人员的首选。
本次设计采用的AT89S52是一种flash型单片机,可以直接在线编程,向单片机中写程序变得更加容易。
本次设计的数字温度计采用的是DS18B20数字温度传感器,DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。
本设计根据设计要求,首先设计了硬件电路,然后绘制软件流程图及编写程序。
本设计属于一种多功能温度计,温度测量范围是-55℃到125℃。
温度值的分辨率可以被用户设定为9-12位,可以设置上下限报警温度,当温度不在设定的范围内时,就会启动报警程序报警。
本设计的显示模块是用四位一体的数码管动态扫描显示实现的。
在显示实时测量温度的模式下还可以通过查询按键查看设定的上下限报警温度。
关键词:单片机、数字温度计、DS18B20、AT89S52目录1 概述- 1 -1.1系统概述- 1 -2 系统总体方案及硬件设计- 2 -2.1 系统总体方案- 2 -2.1.1系统总体设计框图- 2 -2.1.2各模块简介- 2 -2.2 系统硬件设计- 5 -2.2.1 单片机电路设计- 5 -2.2.2 DS18B20温度传感器电路设计- 6 -2.2.3 显示电路设计- 6 -2.2.4 按键电路设计- 7 -2.2.5 报警电路设计- 8 -3 软件设计- 9 -3.1 DS18B20程序设计- 9 -3.1.1 DS18B20传感器操作流程- 9 -3.1.2 DS18B20传感器的指令表- 9 -3.1.3 DS18B20传感器的初始化时序- 10 -3.1.4 DS18B20传感器的读写时序- 10 -3.1.5 DS18B20获取温度程序流程图- 11 -3.2 显示程序设计- 12 -3.3 按键程序设计- 13 -4实物制作及调试- 14 -5电子综合设计体会- 15 -参考文献- 15 -附1 源程序代码- 17 -附2 系统原理图- 32 -1 概述1.1系统概述本系统所设计的数字温度计采用的是DS18B20数字温度传感器测温,DS18B20直接输出的就是数字信号,与传统的温度计相比,具有读数方便,测温范围广,测温准确,上下限报警功能。
大学设计方案—DSB温度检测系统
所属系电子工程系专业自动化学号 01208163姓名周何聪指导教师李振东起讫日期 2011.4 --- 2011.5设计地点东南大学成贤学院东南大学成贤学院毕业设计报告(论文)诚信承诺本人承诺所呈交的毕业设计报告(论文)及取得的成果是在导师指导下完成,引用他人成果的部分均已列出参考文献。
如论文涉及任何知识产权纠纷,本人将承担一切责任。
学生签名:日期:第1页共30 页目录摘要 (3)Abstract (4)第一章绪论 (5)§1.1 系统背景 (5)§1.2 系统概述 (5)第二章方案论证 (6)§2.1 传感器部分 (6)§2.2主控制部分 (7)§2.3 系统方案 (7)第三章硬件电路设计 (8)§3.1 电源以及看门狗电路 (8)§3.2键盘以及显示电路 (10)§3.2温度测试电路 (12)§3.3 串口通讯电路 (16)§3.4 整体电路 (17)第四章软件设计 (17)§4.1 概述 (17)§4.2 主程序方案 (17)§4.3 各模块子程序设计 (19)第五章系统调试 (21)§5.1 分步调试 (21)§5.2 统一调试 (21)结束语 (22)参考文献 (23)附录一:软件流程图 (25)附录二:电路原理图 (27)致谢 (30)第2页共30 页摘要DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。
本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。
该系统由上位机和下位机两大部分组成。
下位机实现温度的检测并提供标准RS232通信接口,芯片使用了ATMEL公司的AT89C51单片机和DALLAS公司的DS18B20数字温度传感器。
DSB课程设计报告
课程设计题目DS18B20温度传感器的设计与制作学院计算机科学与信息工程学院专业测控技术与仪器班级一班学生姓名指导教师王子康李昔华2013 年12 月25 日DS18B20温度传感器的设计与制作一、选题背景温度是一种在生产、科研、生活中需要测量和控制的重要物理量,是国际单位制七个基本量之一。
其测量控制一般采用各式各样形态的温度传感器。
根据它们在讯号输出方式上的不同可以分为模拟温度传感器和数字温度传感器。
单片机技术的出现则是为现代工业测控领域带来了一次新的技术革命。
目前温度报警器的发展已经比较成熟了,它能帮助我们实现想要的温度控制,解决身边的很多问题。
二.设计任务和要求(1)设计一个采用DS18B20数字温度传感器的巡回检测报警仪,量程为0℃~60℃(也可以选择其它(2)具有连接10个以上检测通道的能力,采用至少4位LED显示,其中1位显示通道号,3位显示实时温度(保留1位小数)。
(3)能设定10个通道的报警温度(精确到±1℃),具备超温声光报警功能。
(4)设计必要的操作按键。
(5)拓展部分:具有RS232或RS485总线接口,能和PC机通信传送温度数据。
(6)安装、调试电路,采用水银温度计进行校对,记录测试数据,并对漂移、重复性、线性度等参数进行测试、分析。
(6)写出总结报告。
报告中应包括原理框图、参数曲线分析、操作方法、测控流程、实物照片等,调试过程中遇到的问题,改进方法和总结体会。
三.设计与分析本设计是一个基于单片机的温度测量电路,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻虽然成本低,但是需要后续信号处理、A/D转换处理等才能将温度转换成数字信号,不但电路复杂,可靠性和精度也相对较低,在应用中还需要解决引线误差补偿、干扰等问题,故传统方案不可取。
进而非常容易考虑到使用温度传感器,在单片机电路设计中,单片机除了可以测量电信号外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域。
DSB温传感器原理
普中STM32开发板带您进入ARM世界
九.DS18B20写时序
(1).数据线先置低电平“0” (2).延时15微妙。 (3).按从低位到高位的顺序发送数据(一次只发送一位)。 (4).延时60微妙。 (5).将数据线拉到高电平。 (6).重复1~5步骤,直到发送完整的字节。 (7).最后将数据线拉高。
多点测温。 4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一
只三极管的集成电路内。 5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ 6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃
和0.0625℃,可实现高精度测温。 7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms
DS18B20启动后保持低功耗等待状态,当需要执行温度测量和AD转 换时,总线控制器必须发出[44h]命令。转换完以后,产生的温度数据 以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续 保持等待状态。
第6页/共16页
普中STM32开发板带您进入ARM世界
这是12位转化后得到的12位数据,存储在DS18B20的两个8位的RAM 中,高字节的前5位是符号位,如果测得的温度大于0,这5位为‘0’, 只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,这 5位为‘1’,测到的数值需要取反加1再乘以0.0625即可得到实际温度。
第13页/共16页
普中STM32开发板带您进入ARM世界
八.DS18B20读时序
(1).将数据线拉低“0”。 (2).延时4微妙。 (3).将数据线拉高“1”,释放总线准备读数据。 (4).延时10微妙。 (5).读数据线的状态得到1个状态位,并进行数据处理。 (6).延时45微妙。 (7).重复1~7步骤,直到读完一个字节。
基于DSB温传感器的数字温计设计
目录基于DS18B20温度传感器的数字温度计设计 ............................................... 错误!未定义书签。
基于DS18B20温度传感器的数字温度计设计 (1)摘要: (1)关键字: (1)The conception of the numerical thermometer based on DS18B20 (1)1 引言 (2)2 总体设计 (2)2.1 方案论证 (2)2.2 总体设计 (3)3 硬件设计 (3)3.1 单片机系统 (3)3.2 温度传感器模块 (4)3.3 存储模块 (7)3.4 液晶显示模块 (9)3.5 串口通信模块 (11)3.6 电源模块 (12)4 软件设计 (13)4.1 主程序流程 (13)4.2 DS18B20模块程序设计 (14)4.3 HS1602驱动程序设计 (16)4.4 AT24C08存储模块程序设计 (18)4.5 RS-232-C串口通信模块程序设计 (19)5 测试及结果分析 (23)6 附录 (23)7 参考资料 (25)基于DS18B20温度传感器的数字温度计设计周焱华,王小彬,周焕军(湖北师范学院计算机科学系)摘要:本文介绍了一种基于DS18B20的数字温度计设计方案。
方案利用A T89S52单片机控制DS18B20进行数据采集并由HS1602液晶显示模块显示结果,另外,采集结果可由RS-232-C接口送入计算机显示并存储。
按键控制实现过界报警温度设定和实时监控,利用AT24C08芯片进行存储,实现温度测量存储与再现。
关键字:温度采集,存储再现,过界报警,串行通信The conception of the numerical thermometerbased on DS18B20Zhou Yanhua,Wang Xiaobin,Zhou Huanjun(Computer Science Department,HuBeiNormal University)Abstract: In this page,we introduced a conception of the numerical thermometer based on DS18B20. The conception makes use of AT89S52 control DS18B20 to carry on the data collection,and displays the result use the HS1602 liquid crystal display module. Moreover, the result can be sent into the computer by the interface of RS-232- C to display and store. The key control carries out the temperature setting of over the boundary to alarm,and real-time monitoring. And makes use of the chip of AT24C08 carries on the storage, and carrying out the temperature measurement storage and reappearing.Keywords: Temperature collect, Storing to reappear, Over the boundary to alarm, Serial communication1 引言随着电子技术的发展,人们的生活日趋数字化,多功能的数字温度计可以给我们的生活带来很大的方便;支持“一线总线”接口的温度传感器简化了数字温度计的设计,降低了成本;以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20为核心,以ATMEL公司的A T89S52为控制器设计的DS18B20温度控制器结构简单、测温准确、具有一定控制功能的智能温度控制器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S T M制作D S B温度传感器HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】折腾了一晚上,才把DS18B20的驱动移植到STM32上来。
以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧:首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。
相比之下用SysTick来的简单方便点。
接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。
STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。
于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
在烦躁之际只有试下将接DQ的IO分别拉低和拉高看能不能读入正确的信号。
结果果然是读入数据不对,原来我将IO配成开漏输出后相当然的以为读数据是用GPIO_ReadOutputDataBit(),这正是问题所在,后来将读入的函数改为GPIO_ReadInputDataBit()就OK了。
现在温度是现实出来了,但跟我家里那台德胜收音机上显示的温度相差2度,都不知道是哪个准了,改天再找个温度计验证下。
下面引用一段DS18B20的时序描述,写的很详细:DS18B20的控制流程根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。
每次对DS18B20的操作都要进行以上三个步骤。
复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
发送RAM指令:RAM指令用于单片机对DS18B20内部RAM进行操作,如读取寄存器的值,或者设置寄存器的值。
具体的RAM和RAM指令请查阅DS18B20的数据手册。
下面简单介绍:1、ROM操作命令:DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
一旦总线检测到从属器件的存在,它便可以发出器件ROM操作指令,所有ROM操作指令均为8位长度,主要提供以下功能命令:1 )读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位序列号。
如果总线上存在多于一个的节点,则此指令不能使用。
2 )ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20进行读写操作。
3 )搜索ROM(指令码0XF0H):用于确定接在总线上DS18B20的个数和识别所有的64位ROM序列号。
当系统开始工作,总线主机可能不知道总线上的器件个数或者不知道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。
4 )跳过ROM(指令码0XCCH):此指令只适合于总线上只有一个节点;该命令通过允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。
5 )报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温度超过设定的上限或者下限值的DS18B20才会作出响应。
只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。
储存在EEPROM内的触发器用于告警。
2、RAM指令DS18B20有六条RAM命令:1)温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。
2)读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM的第1个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。
如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
3)写暂存器(指令码0X4EH):将上下限温度报警值和配置数据写入到RAM的2、3、4字节,此命令后跟需要些入到这三个字节的数据。
4)复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM中,用以掉电保存。
5)重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到RAM 的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。
6)读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号给主CPU。
对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,器件都会给出其电源方式的信号。
“0”表示寄生电源供电。
“1”表示外部电源供电。
下面是结合实际测试总结出来的DS18B20的操作流程:1、DS18B20的初始化(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)。
(3)数据线拉到低电平“0”。
(4)延时490微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
2、DS18B20的写操作(1)数据线先置低电平“0”。
(2)延时确定的时间为2(小于15)微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为62(大于60)微秒。
(5)将数据线拉到高电平,延时2(小于15)微秒。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
3、 DS18B20的读操作(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时2(小于15)微秒。
(5)将数据线拉高“1”,同时端口应为输入状态。
(6)延时4(小于15)微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时62(大于60)微秒。
顺便把程序也贴上来吧,给大家参考下。
使用的方法:只要调用一次 ds18b20_start() 来初始化DS18B20,然后每次读温度时直接调用ds18b20_read()就可以了。
如ds18b20_start();while(1){for(i=1000000;i>0;i--);val = ds18b20_read();}[cpp]view plaincopy1//========================================================2// DS18B20.C By ligh3//========================================================4#include "STM32Lib//stm32f10x.h"5#include "DS18B20.h"6#define EnableINT()7#define DisableINT()8#define DS_PORT GPIOA9#define DS_DQIO GPIO_Pin_110#define DS_RCC_PORT RCC_APB2Periph_GPIOA11#define DS_PRECISION 0x7f //精度配置寄存器 1f=9位; 3f=10位; 5f=11位;7f=12位;12#define DS_AlarmTH 0x6413#define DS_AlarmTL 0x8a14#define DS_CONVERT_TICK 100015#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)16#define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO)17#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)18static unsigned charTempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09};19void Delay_us(u32 Nus)20{21 SysTick->LOAD=Nus*9; //时间加载22 SysTick->CTRL|=0x01; //开始倒数23while(!(SysTick->CTRL&(1<<16))); //等待时间到达24 SysTick->CTRL=0X00000000; //关闭计数器25 SysTick->VAL=0X00000000; //清空计数器26}27unsigned char ResetDS18B20(void)28{29 unsigned char resport;30 SetDQ();31 Delay_us(50);32 ResetDQ();33 Delay_us(500); //500us (该时间的时间范围可以从480到960微秒)34 SetDQ();35 Delay_us(40); //40us36 //resport = GetDQ();37while(GetDQ());38 Delay_us(500); //500us39 SetDQ();40return resport;41}42void DS18B20WriteByte(unsigned char Dat)43{44 unsigned char i;45for(i=8;i>0;i--)46 {47 ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数48 Delay_us(5); //5us49if(Dat & 0x01)50 SetDQ();51else52 ResetDQ();53 Delay_us(65); //65us54 SetDQ();55 Delay_us(2); //连续两位间应大于1us56 Dat >>= 1;57 }58}59unsigned char DS18B20ReadByte(void)60{61 unsigned char i,Dat;62 SetDQ();63 Delay_us(5);64for(i=8;i>0;i--)65 {66 Dat >>= 1;67 ResetDQ(); //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后68 Delay_us(5); //5us69 SetDQ();70 Delay_us(5); //5us71if(GetDQ())72 Dat|=0x80;73else74 Dat&=0x7f;75 Delay_us(65); //65us76 SetDQ();77 }78return Dat;79}80void ReadRom(unsigned char *Read_Addr) 81{82 unsigned char i;83 DS18B20WriteByte(ReadROM);84for(i=8;i>0;i--)85 {86 *Read_Addr=DS18B20ReadByte();87 Read_Addr++;88 }89}90void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)91{92 DisableINT();93 ResetDS18B20();94 DS18B20WriteByte(SkipROM);95 DS18B20WriteByte(WriteScratchpad);96 DS18B20WriteByte(AlarmTL);97 DS18B20WriteByte(AlarmTH);98 DS18B20WriteByte(Precision);99 ResetDS18B20();100 DS18B20WriteByte(SkipROM);101 DS18B20WriteByte(CopyScratchpad);102 EnableINT();103while(!GetDQ()); //等待复制完成 ///////////104}105void DS18B20StartConvert(void)106{107 DisableINT();108 ResetDS18B20();109 DS18B20WriteByte(SkipROM);110 DS18B20WriteByte(StartConvert);111 EnableINT();112}113void DS18B20_Configuration(void)114{115 GPIO_InitTypeDef GPIO_InitStructure;116 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);117 GPIO_InitStructure.GPIO_Pin = DS_DQIO;118 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出119 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度120 GPIO_Init(DS_PORT, &GPIO_InitStructure);121}122void ds18b20_start(void)123{124 DS18B20_Configuration();125 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL); 126 DS18B20StartConvert();127}128unsigned short ds18b20_read(void)129{130 unsigned char TemperatureL,TemperatureH;131 unsigned int Temperature;132 DisableINT();133 ResetDS18B20();134 DS18B20WriteByte(SkipROM);135 DS18B20WriteByte(ReadScratchpad);136 TemperatureL=DS18B20ReadByte();137 TemperatureH=DS18B20ReadByte();138 ResetDS18B20();139 EnableINT();140if(TemperatureH & 0x80)141 {142 TemperatureH=(~TemperatureH) | 0x08;143 TemperatureL=~TemperatureL+1;144if(TemperatureL==0)145 TemperatureH+=1;146 }147 TemperatureH=(TemperatureH<<4)+((TemperatureL&0xf0)>>4); 148 TemperatureL=TempX_TAB[TemperatureL&0x0f];149 //bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位150 Temperature=TemperatureH;151 Temperature=(Temperature<<8) | TemperatureL;152 DS18B20StartConvert();153 return Temperature;154}155//============================================156// DS18B20.H157//============================================158#ifndef __DS18B20_H159#define __DS18B20_H160#define SkipROM 0xCC //跳过ROM161#define SearchROM 0xF0 //搜索ROM162#define ReadROM 0x33 //读ROM163#define MatchROM 0x55 //匹配ROM164#define AlarmROM 0xEC //告警ROM165#define StartConvert 0x44 //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1166#define ReadScratchpad 0xBE //读暂存器的9个字节167#define WriteScratchpad 0x4E //写暂存器的温度告警TH和TL168#define CopyScratchpad 0x48 //将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1169#define RecallEEPROM 0xB8 //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1170#define ReadPower 0xB4 //读电源的供电方式:0为寄生电源供电;1为外部电源供电171void ds18b20_start(void);172unsigned short ds18b20_read(void);173#endif。