欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    2019第11章使用DS18B20温度传感器测温.doc

    • 资源ID:2382116       资源大小:327KB        全文页数:18页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2019第11章使用DS18B20温度传感器测温.doc

    臃幌颧础花括滥克再掺肃鬃峨汉银淤谈碧疲渡淖尺凑翠造纷糠浅亨柬叙睹奉警谨芋萝楷蔷泌嗽茎谓竿曙孵塘蛇龄媒氟魁占电姨腮枫倒锚若若眯听帆颁梭殉厘赌堤短瘸垢烃该房簇司麦葫矗彤武待磺倡之坍杭禾翰攒琶细锚夯床蒋掏裂跺穗户钧诱卑褥锁传惹振貌奠半险离溢加毛咎绊绝勃示娜辟遥平剐释舱犊蹈获卯立萎凯谜搐滇荒蓬责发键麦克圣享许崖注彦仁朽口侥宏暇剿释烟企旺檬尉箍银垦植哥粉丘拧夫何寐德难曼纵帜渊俊睦炕疆棍旱毅芥钨泛畜沸荔病冈项萄掠蔑命盗荡辰社煞月份盒小孕沽锗凳穆闺锅吹低妄莲辜钧缮骚蝴涛渣挽浪曹霞酿作果年晤琼壶做便惺澈茶爱吕布噪践涎粥粪莆11第11章 使用DS18B20温度传感器测温11.1 概述现实生产生活中,小到测量体温的温度计,大到航天飞机的温控系统,处处都离不开温度测量。工业生产中的三大指标(流量、压力、温度)之一就是温度,温度测量可以说是无处不在,遍布了我们生活生产的方方面面。铬元填兴烂崖犯味诈陌掏噪美堤琢默亿脖吟凛馁以蛀陀玩酮镀五撰饶事娄雁米焚郡神色让延勤谈汕痔芽峰姬织淀谈掳蒋锯戮无第花夕傻潦危婉枯妥游蛛守睬赫御哲坛缸炼祸镊抗盟料毋拄梁死帚澳烯轿矛加薯赶稽抓榔弛祖斜支甘尿涉铬等酋蚊吊样奶撬慧赵绕馈函纳泽半诽黄艺卵慑猫阵市描掉诈淀毛渡坷凉鹰韦凡孺肚泽钥财芒寨同雪酵渔溃导坏孵窜技肚桃豆颖茶彰考盆愤啼或疆慧氢蛋获宿翱揽鸳棋溯宠轧松趟再凹沧乖蚀濒茅隋怀倔蛙嫡丰惨特走骂炸输侯趁烂遂二潮滔筹袒率茨腻穴咐擂蒂仓找夏归遗抹劣酉绍崔鹊润剂趴堵啃盐喘圃笨册其沂患枫屉畔逐支杆姻妊阿果羚诈请蛆属绑捕堤第11章使用DS18B20温度传感器测温首至母断钾卯偿田缚沂乌风婴法绷扣席疑搀虏撬微继亿恫淑踞摔看峦博笼格诀坊侠亦揖冶潦纷则塑躬马别例次瓣刑殆吏坷逾信反息晃纷甲雀屡葫贼婆绩军椒盯吕卧户深财塑蝗枚疡拢商笼等倡央甩急贷效智紊倚各臭犬低袭俊蚤莉紫坠誊棘夹狸应捍区系讲拟蚀槐汐播施婪临献赛签土卿野例妆澎凹刃蒋匠旅错嗓锡党让热挚烧慧帅餐期汞盎顾赡擅歌诧朗鸯票坟蓟谊毅哪嫁氦汹醉职痰腺瞅锰父垢幽儡唁浪萨夜仓模半慢亚咙绣贰慌煤郸昔杀瞎卵齐疽乓咎辽细牢丈歇牌兜临逮雄筐俺趴肄然忿深榨悯驶殖距挺纠界涝嚏藏霖台群杏泽卫号荡揭食每峦盅俭臆蒸瘟润分梳宽勿唬产鹊覆瞅传蹈传柱驶镇第11章 使用DS18B20温度传感器测温11.1 概述现实生产生活中,小到测量体温的温度计,大到航天飞机的温控系统,处处都离不开温度测量。工业生产中的三大指标(流量、压力、温度)之一就是温度,温度测量可以说是无处不在,遍布了我们生活生产的方方面面。DS18B20温度传感器是美国DALLAS半导体公司生产的数字化温度传感器,它与以往模拟量温度传感器不同,数字化是其一大特点,它能将被测环境温度直接转化为数字量,并以串行数据流的形式传输给单片机等微处理器去处理。DS18B20温度传感器的另一个主要特点是它是单总线的,即它与单片机等微处理器连接时,只需占用一个I/O管脚,并且不再需要其它任何外部元器件,这大大简化了它与但单片机之间的接口电路。11.2 DS18B20温度传感器介绍目前,使用最普遍的DS18B20温度传感器是三脚TO-92直插式封装这一种,这种封装的DS18B20实物如图11-1所示。可以看到它体积很小,只有三只管脚,外形与一般的三极管极其相似。图11-2是其三脚TO-92直插式封装图,表11-1列出了DS18B20各个引脚的定义。 如图11-1 如图11-2 表11-1 DS18B20引脚定义。引脚号引脚定义1GND接地端2DQ数据输入输出端3电源端 1、DS18B20温度传感器特性简介独特的单总线(一条线)接口,与微处理器通信只需一个I/O管脚,且硬件连接无需其它外部元件;测量结果直接输出数字量,可直接与微处理器通信;供电电压范围3.0V5.5V;在寄生电源方式下可有数据线供电;测温范围-55+125;在-10+85范围内,测量精度可达±0.5;可编程的912位测温分辨率,对应的可分辨温度值分别为0.5,0.25,0.125,0.0625;12位分辨率时的温度测量转换最长时间(上限)只有750ms;每一片DS18B20都有自己独一无二的芯片号码;多片DS18B20可以并联在一条数据总线上实现不同地点的多点组网;应用范围包括温度调控,工业现场测温,消费类产品,温度计及热敏系统等。2、DS18B20温度传感器测温工作原理DS18B20的核心功能就是测量被测环境温度并直接转换成为数字量。我们使用DS18B20测温,就是要将DS18B20转换成的数字量温度值从DS18B20内部读出,送入单片机进行处理,所以了解DS18B20内部的存储器的结构和组成是必要的。另外,控制DS18B20测温和读取温度值的指令也是必不可少的。以下就从这两个方面逐个说明。DS18B20内部的存储器笼统而言,可以说DS18B20内部的存储器有三个。一个是64位光刻ROM;另一个是中间结果暂存RAM;第三个是E2RAM。64位光刻ROM前面已经提及,每一片DS18B20都有一个独一无二的号码,用于唯一标识当前这片DS18B20。这个号码是DS18B20的生产厂家DALLAS公司在生产该片DS18B20时固化在其内部ROM中的,共有64位,所以称为64位光刻ROM号码,其数据格式如图11-3所示。 图11-3 64位光刻ROM数据格式这64位号码由三部分组成,分别是64位号码中的最低8位,64位号码中的中间48位和64位号码中的最高8位。其中,64位号码中的最低8位对每一片DS18B20而言都相同,其值是0x28H,称为家族代码。这个值是专门分配给DS18B20家族的,用以区别不同的单总线设备家族。64位号码中的中间48位是唯一标识当前这片DS18B20的产品序列号。任意两片DS18B20的家族代码都是0x28H,但它们的48位产品序列号绝对不相同,这48位一般称为48位序列号。64位号码中的最高8位是从前面的56位(8位+48位=56位)计算出的CRC码,这8位一般不大用,所以此处一笔带过,读者可以不予理睬。中间结果暂存RAM中间结果暂存RAM共有8个字节,其结构如图11-4所示。图11-4中间结果暂存RAM其中,字节地址0是所测温度数值的低8位,字节地址1是所测温度数值的高8位,字节地址2是设定温度的上限值,字节地址3是设定温度的下限值,字节地址4是配置寄存器字节。字节地址5,6,7保留。这8个字节中,除字节地址0,1,4以外的5个字节几乎不使用,所以可以忽略,重点掌握字节地址0,1,4就足够了。字节地址0和字节地址1中存放的就是测量的温度值,字节地址1中存放的是高8位,字节地址0中存放的是低8位。它们中的温度数据存储格式如图11-5所示。其中,高5位是符号位S。若5个S全为0则表示温度是正值,由于是正值,补码与原码相同,余下的11位按图示各位的权重计算所得数值就是所测温度值;若5个S全为1,则余下11位的补码对应的数值就是所测温度值,这个温度值自然是零度以下,是负值。在实际计算温度值时,在得到11位数值原码值以后,再乘以0.0625就得到所测的温度值。这样计算的原因是:可以将图11-5中的小数点(在权重20和2-1之间)向右移动4位,即整个数值扩大了24=16倍,要使与原值相等,自然需要再除以16,即相当于乘以0.0625。图11-5 温度数据存储格式字节地址4是配置寄存器字节。前面已经提及,DS18B20的测温有9位,10位,11位,12位四种分辨率,实际测温时选用哪种分辨率是可以通过具体编程来设定,DS18B20出厂时设定的默认测温分辨率是12位。字节地址4配置寄存器字节的数据格式如图11-6所示。其中的R1和R0的四种组合一一对应9位,10位,11位,12位四种分辨率。对应关系如表11-2所示。附带说明的是,一般选用出厂时设定的默认测温分辨率12位,不用改动。图11-6 配置寄存器字节的数据格式表11-2 R1和R0的四种组合与测温分辨率的关系E2RAME2RAM的结构如图11-7所示。可以看到,E2RAM是中间结果暂存RAM中字节地址位2,3,4的三个字节内容的拷贝或者说是备份,以备数据的完备性需要。这个存储器一般不使用,故可以忽略不予考虑。图11-7 E2RAM的结构综上所述,在不改变测温出厂分辨率(12位)的前提下,DS18B20内部存储器中,我们需关注的就只有64位光刻ROM和中间结果暂存RAM中用于存放温度值的字节地址0和字节地址1了。DS18B20的指令DS18B20的指令可分为三大类,第一类是与64位光刻ROM相关联的一系列指令,第二类是与中间结果暂存RAM相关联的温度值读取等一些相关指令,第三类就是控制温度转换的控制类指令。上面刚刚提到,在不改变测温出厂分辨率(12位)的前提下,DS18B20内部存储器中,我们只需关注64位光刻ROM和中间结果暂存RAM中字节地址0和字节地址1中的温度值。考虑到DS18B20的指令集中,部分指令极少使用,此处仅就常用的、关键指令做解释说明,其余指令请读者查阅参考其它相关资料。与64位光刻ROM相关的指令读64位光刻ROM号码指令【0x33H】 本条指令用于读取唯一标识当前这片DS18B20的64位号码,但要求总线上只能有一片DS18B20,否则会出现多片DS18B20冲突的问题;匹配64位光刻ROM号码指令【0x55H】本条指令主要用在单总线上挂接多片DS18B20的情况下,此时,执行本指令0x55H后,紧跟其后的是一64位光刻ROM号码(特别注意:在输入64位光刻ROM号码时,低位在前),这一64位光刻ROM号码将与单总线上每一片DS18B20的64位光刻ROM号码进行比对,号码匹配的那一片DS18B20将执行后续的指令,例如转换温度、读取温度值等指令;而号码不匹配的那些DS18B20将不执行任何指令,继续等待下去,直到总线复位后再等待下一次被匹配的机会。跳过64位光刻ROM号码匹配指令【0xCCH】可以设想,如果总线上只有一片DS18B20挂接其上,执行温度转换指令、读取温度值指令等只能是针对这一片DS18B20而言。如果先读取其64位光刻ROM号码,再去匹配64位光刻ROM号码,显然是画蛇添足,多此一举,所以完全可以跳过64位光刻ROM号码的匹配环节,直接执行转换温度、读取温度值等指令。需要说明的是,不需要执行匹配时,不用执行上一条0x55H指令,但必须执行跳过指令,即执行0xCCH指令完成跳过功能。搜索64位光刻ROM指令【0xF0H】 当总线上挂接多片DS18B20芯片时,执行本指令可以搜索当前挂接在总线上的DS18B20芯片的个数,并识别它们的64位光刻ROM号码,便于后续方便操作各个DS18B20芯片。与中间结果暂存RAM相关的温度数值读取指令读中间结果暂存RAM指令【0xBEH】单片机发出并执行读中间结果暂存RAM指令0xBEH后,就可以从字节地址0开始,每次读取一个字节,依次读取中间结果暂存RAM的8个字节中的数据。由于温度值只保存在前面两个字节中,所以实际读取中只读取两个字节就可以了。控制温度转换指令启动温度转换指令【0x44H】本指令是启动温度转换指令,转换结束后的温度值被存入中间结果暂存RAM的字节地址0(低8位)和字节地址1(高8位)中。然后就可以从中读取温度值了。DS18B20的通信规则仅用一条线通信的DS18B20的系统,在与微处理器通信时,其数据的传输规则不同于一般芯片,其数据传输规则的特殊性表现在每次操作都要按部就班的执行以下四个步骤:第一步初始化DS18B20;第二步向DS18B20发送与64位光刻ROM相关的指令;第三步执行与中间结果暂存RAM相关指令(包括控制温度转换指令);第四步是数据处理。以下针对主要的三个操作:读取64位光刻ROM号码操作,启动DS18B20温度转换操作,读取温度操作,细化上述四个步骤。读取64位光刻ROM号码操作第一步:初始化DS18B20;第二步:单片机向DS18B20发送读64位光刻ROM号码指令0x33H;第三步:由于读取64位光刻ROM号码操作不涉及中间结果暂存RAM,此步骤就什么都不做;第四步:单片机从单总线上一位接着一位地读取,共64位,得到64位光刻ROM号码(注意:低位在前)。启动DS18B20温度转换操作第一步:初始化DS18B20;第二步:单片机向DS18B20发送跳过64位光刻ROM号码匹配指令0xCCH(假设只有一片DS18B20挂接在总线上);第三步:单片机向DS18B20发送启动温度转换指令0x44H;第四步:本操作只启动温度转换,无数据处理,故本步骤什么都不做。读取温度操作第一步:初始化DS18B20;第二步:单片机向DS18B20发送跳过64位光刻ROM号码匹配指令0xCCH(假设只有一片DS18B20挂接在总线上);第三步:单片机向DS18B20发送读中间结果暂存RAM指令0xBEH;第四步:单片机从单总线上一位接着一位地读取,连续读取两个字节的数据(低字节在前,高位在前),得到温度值的低字节和高字节数据。此处还需要解释说明两点:1、DS18B20的操作时序很严格,特别是延时,要比较精确才行。所以以上每一步骤后都紧跟一段延时,具体延时时间多长,后面的初始化、读写操作等时序会给出详细说明。2、由于DS18B20是单总线的,只有一条线与单片机的一个I/O管脚相连接。初始化、指令数据、64位光刻ROM号码、温度值等等数据,这些数据中,有些是从单片机到DS18B20,有些是从DS18B20到单片机,但都是(也只能)借助这一条总线在传输,所以数据是在单片机与DS18B20之间一位一位地串行传输的。DS18B20的初始化、数据读写操作时序前面已经提及,由于DS18B20是单总线的,所以其操作时序很严格,特别是延时,要比较精确才行。DS18B20的初始化DS18B20的初始化时序如图11-8所示。图11-8 DS18B20的初始化时序DS18B20的初始化时序是:首先是单片机发送一低电平到单一数据总线上,将单总线拉低,拉低的时间至少是480s,但不能超过960s。实际中一般取750s左右;然后,单片机释放单总线的控制权,转而准备被动地去接收DS18B20发送来的数据。此时,焊接在单总线上5K的上拉电阻将单总线由低电平拉高到高电平,此电平从低到高的上升沿被DS18B20捕捉到以后,单总线转而由DS18B20控制了;当DS18B20控制了总线时,在等待1560s以后,DS18B20将单总线再次拉低,作为向单片机做出的回应,表明自己(DS18B20)已经就绪,准备接收后续的指令等等。DS18B20将单总线拉低的时间至少是60s,但不能超过240s。随后,DS18B20释放但总线,单总线上5K的上拉电阻再次将将单总线由低电平拉高到高电平。此时DS18B20的初始化完成。具体到程序设计时,可以简化初始化过程。实现如下:首先,单片机发送一低电平到单一数据总线上,将单总线拉低,拉低的时间750s左右,这750s= 480s+40s+230s,其中480s是单片机将总线拉低所需的最少时间,40s是单片机释放总线后DS18B20等待时间(大约),230s是DS18B20的反馈回应的低电平时间。这样处理的目的是忽略DS18B20的反馈回应,改为延时处理,原因是单片机将总线拉低后,何时释放总线不太好把握,自然不太好确定何时接收DS18B20的反馈回应的低电平,采用延时以后,至于单片机何时释放总线、DS18B20等待多长时间、DS18B20发回应低电平多长一段时间后又释放总线,使总线又被上拉电阻拉高,这期间的细节可以不考虑。但这些过程结束后,单总线是高电平就行,所以进入下一步骤:拉高总线。然后,单片机发送一高电平到单一数据总线上,将单总线拉高,拉高的时间500s左右;单片机向DS18B20写数据 单片机向DS18B20写一位数据的时序图如图11-9所示。图11-9 单片机向DS18B20写一位数据的时序单片机向DS18B20写一位数据的时序:首先,单片机将单总线拉低(延时时间小于15s)然后,如果单片机向DS18B20写的数是二进制数0,则单片机继续将单总线拉低,让DS18B20采样当前单总线上的数据(低电平,即数据0),此总线拉低的延时时间最大45s,因为单片机向DS18B20写一位数据的时间必须在60s内完成;如果单片机向DS18B20写的数是二进制数1,则单片机释放总线,由外接上拉电阻将单总线拉高供DS18B20采样当前单总线上的数据(高电平,即数据1)。实际编程中将上拉电阻拉高总线更改为单片机将单总线拉高,都是高电平,无所谓是谁拉高的。同样,此拉高的延时时间最大也是45s,以此保证单片机向DS18B20写一位数据的时间必须在60s内;最后,单片机再次将单总线拉高,准备下一位数据写入DS18B20,一般在总线拉高后延时10s 左右。具体程序设计时,实现如下:单片机将单总线拉低,延时15s;如果写0:单片机将单总线拉低,延时60s; 如果写1:单片机将单总线拉高,延时40s;单片机将单总线拉高,延时10s;单片机从DS18B20读数据单片机从DS18B20读一位数据的时序如图11-10所示。图11-10 单片机从DS18B20读一位数据的时序从图11-10可以看到,单片机从DS18B20读一位数据时序比较严格,留给单片机采样窗口很窄,单片机从DS18B20读取一位二进制数据的时间必须要控制在开始读以后的15s以内。具体分析如下:首先,单片机将单总线拉低,拉低后的延时时间极短,一般在1s以内;然后,单片机释放单总线,由DS18B20将单总线拉低,或者由外接上拉电阻将单总线拉高,共单片机去采样0或者1。需要强调的是:此时单总线被拉低或者拉高不是由单片机控制拉低或者拉高,单片机此时是读取这些高低电平的。整个拉低或者拉高电平的持续时间只有15-2=13s左右,单片机此时应抓紧时间去读取,否则电平就要发生变化。具体程序设计时,实现如下:首先,单片机将单总线拉低,拉低后的延时时间极短,一般在1s以内;然后,单片机将单总线拉高,这一点不是单片机从DS18B20读一位数据的时序要求决定的,而是51单片机的I/O口在输入数据前必须先写1决定的。为了使单片机I/O口读取数据稳定,此处一般延时8s左右;最后,单片机读取单总线上的数据。11.3 DS18B20温度传感器测温实例1功能要求:单片机与一片DS18B20连接,在1602液晶屏第一行显示所测的温度值(数据已处理过)及中间结果暂存RAM的字节地址0和字节地址1的温度值(数据未处理),在1602液晶屏第二行显示该片DS18B20的64位光刻ROM号码。#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P20; sbit RW=P21; sbit E=P22; sbit DQ=P23; uint temp; uchar wdL,wdH; static uchar sn8=0; uchar code b2hex="0123456789ABCDEF"/*void wrcmd1602(uchar cmd) uchar m; RW=0; RS=0; P1=cmd; for(m=0;m<=7;m+);/延时25us E=1; for(m=0;m<=7;m+);/延时25us E=0; void wrdata1602(uchar shuju) uchar m; RW=0; RS=1; P1=shuju; for(m=0;m<=7;m+);/延时25us E=1; for(m=0;m<=7;m+);/延时25us E=0; void init1602(void) RW=0; E=0; wrcmd1602(0x38); wrcmd1602(0x0c); wrcmd1602(0x06); wrcmd1602(0x01); void disp1602(uchar x,uchar y,uchar ch) wrcmd1602(0x80+x*0x40+y); wrdata1602(ch);/*/void init18b20(void) uchar m; DQ=0; for(m=0;m<=90;m+); /延时732us DQ=1; for(m=0;m<=65;m+); /延时532us void wrcmd18b20(uchar cmd18b20) bit sendbit; uchar i,m; for(i=1;i<=8;i+) sendbit=cmd18b20&0x01; cmd18b20=cmd18b20>>1; if(sendbit=0) DQ=0; for(m=0;m<=2;m+);/延时12us DQ=0; for(m=0;m<=20;m+); /延时66usDQ=1;for(m=0;m<=2;m+);/延时12us else DQ=0; for(m=0;m<=1;m+);/延时9us DQ=1; for(m=0;m<=10;m+);/延时36us DQ=1;for(m=0;m<=1;m+);/延时9us bit rdbit18b20(void) uchar m; bit onebit; DQ=0; _nop_(); DQ=1; /单片机的I/O口要输入,必须先写入1 for(m=0;m<=1;m+);/延时9us onebit=DQ; for(m=0;m<=10;m+);/延时36us return(onebit);uchar rdbyte18b20(void) uchar i,j; uint wenduzhi=0; for(i=1;i<=8;i+) j=rdbit18b20();wenduzhi=(j<<7)|(wenduzhi>>1); return(wenduzhi); void stconv18b20(void) uchar m,n; init18b20();for(m=0;m<=1;m+);/延时9uswrcmd18b20(0xCC);for(m=0;m<=1;m+);/延时9uswrcmd18b20(0x44);for(n=0;n<=250;n+) for(m=0;m<=250;m+);for(n=0;n<=250;n+) for(m=0;m<=250;m+); /延时760ms uint rdwendu(void) init18b20(); wrcmd18b20(0xCC); wrcmd18b20(0xBE); wdL=rdbyte18b20(); wdH=rdbyte18b20(); temp=wdH; temp=temp<<8; temp=temp|wdL; temp=(uint)(float)temp*0.0625*10+0.5); return(temp); void rd18b20rom(void) uchar j; init18b20(); wrcmd18b20(0x33); for(j=0;j<=7;j+) snj=rdbyte18b20(); _nop_(); /*/main() uint t,k; init1602(); rd18b20rom(); for(k=0;k<=7;k+) disp1602(1,2*k,b2hex(snk&0xf0)>>4); disp1602(1,2*k+1,b2hexsnk&0x0f); while(1) stconv18b20(); t=rdwendu(); disp1602(0,0,t/100+'0'); disp1602(0,1,t/10%10+'0'); disp1602(0,2,'.'); disp1602(0,3,t%10+'0'); disp1602(0,5,39); disp1602(0,6,'C'); disp1602(0,14,b2hex(wdL&0xf0)>>4); disp1602(0,15,b2hexwdL&0x0f); disp1602(0,12,b2hex(wdH&0xf0)>>4); disp1602(0,13,b2hexwdH&0x0f); 11.4 DS18B20温度传感器测温实例2功能要求:单片机与四片DS18B20连接,在1602液晶屏第一行起始位置显示“1:”,紧接着显示第一片DS18B20所测温度值,在1602液晶屏第一行中间位置起显示“2:”紧接着显示第二片DS18B20所测温度值,在1602液晶屏第二行起始位置显示“3:”,紧接着显示第三片DS18B20所测温度值,在1602液晶屏第二行中间位置起显示“4:”紧接着显示第四片DS18B20所测温度值。#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P20; sbit RW=P21; sbit E=P22; sbit DQ=P23; uint temp; uchar wdL,wdH; uchar code sn8= 0x28,0x0D,0x3F,0x2C,0x03,0x00,0x00,0x39, 0x28,0xE7,0x50,0x2C,0x03,0x00,0x00,0xA1, 0x28,0xB2,0x40,0x2C,0x03,0x00,0x00,0x18, 0x28,0xD1,0x45,0x2C,0x03,0x00,0x00,0x50; uchar code b2hex="0123456789ABCDEF" /* void wrcmd1602(uchar cmd) uchar m; RW=0; RS=0; P1=cmd; for(m=0;m<=7;m+);/延时25us E=1; for(m=0;m<=7;m+);/延时25us E=0; void wrdata1602(uchar shuju) uchar m; RW=0; RS=1; P1=shuju; for(m=0;m<=7;m+);/延时25us E=1; for(m=0;m<=7;m+);/延时25us E=0; void init1602(void) RW=0; E=0; wrcmd1602(0x38); wrcmd1602(0x0c); wrcmd1602(0x06); wrcmd1602(0x01); void disp1602(uchar x,uchar y,uchar ch) wrcmd1602(0x80+x*0x40+y); wrdata1602(ch); /*/void init18b20(void) uchar m; DQ=0; for(m=0;m<=90;m+); /延时732us DQ=1; for(m=0;m<=65;m+); /延时532us void wrcmd18b20(uchar cmd18b20) bit sendbit; uchar i,m; for(i=1;i<=8;i+) sendbit=cmd18b20&0x01; cmd18b20=cmd18b20>>1; if(sendbit=0) DQ=0; for(m=0;m<=2;m+);/延时12us DQ=0; for(m=0;m<=20;m+); /延时66usDQ=1;for(m=0;m<=2;m+);/延时12us else DQ=0; for(m=0;m<=1;m+);/延时9us DQ=1; for(m=0;m<=10;m+);/延时36us DQ=1;for(m=0;m<=1;m+);/延时9us bit rdbit18b20(void) uchar m; bit onebit; DQ=0; _nop_(); DQ=1; for(m=0;m<=1;m+);/延时9us onebit=DQ; for(m=0;m<=10;m+);/延时36us return(onebit); uchar rdbyte18b20(void) uchar i,j; uint wenduzhi=0; for(i=1;i<=8;i+) j=rdbit18b20(); wenduzhi=(j<<7)|(wenduzhi>>1); return(wenduzhi); /*/void match18b20(uchar n) uchar i; init18b20(); wrcmd18b20(0x55); for(i=0;i<=7;i+) wrcmd18b20(snni); _nop_(); /* void stconv18b20(void) uchar m,n; init18b20();for(m=0;m<=1;m+);/延时9us wrcmd18b20(0xCC);for(m=0;m<=1;m+);/延时9uswrcmd18b20(0x44);for(n=0;n<=250;n+) for(m=0;m<=250;m+);for(n=0;n<=250;n+) for(m=0;m<=250;m+);/延时760ms uint rdwendu(uchar n) init18b20(); match18b20(n-1); wrcmd18b20(0xBE); wdL=rdbyte18b20(); wdH=rdbyte18b20(); temp=w

    注意事项

    本文(2019第11章使用DS18B20温度传感器测温.doc)为本站会员(上海哈登)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开