DS18B20温度传感器详解带c程序.pdf

上传人:b****3 文档编号:3219376 上传时间:2022-11-20 格式:PDF 页数:17 大小:2.67MB
下载 相关 举报
DS18B20温度传感器详解带c程序.pdf_第1页
第1页 / 共17页
DS18B20温度传感器详解带c程序.pdf_第2页
第2页 / 共17页
DS18B20温度传感器详解带c程序.pdf_第3页
第3页 / 共17页
DS18B20温度传感器详解带c程序.pdf_第4页
第4页 / 共17页
DS18B20温度传感器详解带c程序.pdf_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

DS18B20温度传感器详解带c程序.pdf

《DS18B20温度传感器详解带c程序.pdf》由会员分享,可在线阅读,更多相关《DS18B20温度传感器详解带c程序.pdf(17页珍藏版)》请在冰豆网上搜索。

DS18B20温度传感器详解带c程序.pdf

DS18B20温度传感器温度传感器(详细案列详细案列+程序程序)硬件介绍1.1主要特征

(1)独特的单线接口方式,只需一个接口引脚即可通信;

(2)每一个DS18B20都有一个唯一的64位ROM序列码;(3)在使用中不需要任何外围元件;(4)可用数据线供电,电压范围:

+3.0V-+5.5V;(5)测温范围:

-55-+125,在-10-+85范围内精度为+0.5,分辨率为0.0625;(6)通过编程可实现9-12位的数字读数方式。

温度转换成12位数字信号所需时间最长为750ms,而在9位分辩模式工作时仅需93.75ms;(7)用户可自设定非易失性的报警上下限值;(8)告警搜索命令可识别和定位那些超过报警限值的DS18B20;(9)多个DS18B20可以并联在惟一的三线上,实现多点测温;(10)电源极性接反时,DS18B20不会因发热而烧毁,但不能正常工作;1.2外形与接线引脚图接线图DS18B20引脚定义:

DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

内部结构与介绍2.1内部结构6464位位ROMROM和和单线单线接口接口电电源源检检测测存储器和控制器存储器和控制器高速高速缓存缓存存储器存储器88位位CRCCRC生成器生成器温度灵敏元件温度灵敏元件低温触发器低温触发器TLTL高温触发器高温触发器THTH配置寄存器配置寄存器内部结构图2.2DS18B20内部存储器及温度数据格式对于DS18B20内部存储器结构(见下图),它包括一个暂存RAM和一个非易失性电可擦除EERAM,后者存放报警上下限TH、TL。

当改变TH、TL中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读出其中内容进行验证。

如果正确,当主机发送复制暂存器命令,暂存器的第二、三字节将被复制到TH、TL中,这样处理有利于确保该数据在单总线上传输的完整性7。

(暂存RAM)EERAM结构(电可擦写RAM)暂存存储器作用是在单线通信时确保数据的完整性,它由8字节组成,头两个字节表示测得的温度读数。

以12位转化为例说明温度高低字节存放形式(温度的存储形式如表3.1)及计算:

12位转化后得到的12位数据,存储在18B20的两个高低8位的RAM中,二进制中的前面5位是符号位。

如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1,再乘于0.0625才能得到实际温度8。

表3.1温度的存储形式高8位SSSSS262524低8位232221202-12-22-32-4S=1时表示温度为负,S=0时表示温度为正,其余低位以二进制补码形式表示,最低位为1时表示0.0625。

温度/数字对应关系如表3.2所示。

表3.2DS18B20温度/数字对应关系表温度()输出的二进制码对应的十六进制码+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100010191H+10.125000000001010001000A2H+0.500000000000010000008H000000000000000000000H-0.51111111111111000FFF8H-10.1251111111101101110FF5EH-25.06251111111001101111FF6FH-551111110010010000FC90H执行序列与介绍3.1执行序列

(1)初始化

(2)ROM指令集AREAD_ROM33H读ROM/可读出64位编码BMATCH_ROM55H匹配ROM/以此指令对某一个1820操作CSKIP_ROMCCH跳过ROM/用于总线只有一个1820DSEARCH_ROMF0H搜索ROM/用于一次读取多个1820的64位编码EALARM_SEARCHECH报警搜索ROM/从多个1820中搜索哪个在报警(3)DS18B20功能指令(暂存器指令集)A温度转换44H启动DS18B20进行温度转换B读暂存器BEH读暂存器9个字节内容C写暂存器4EH将数据写入暂存器的TH、TL字节D复制暂存器48H把暂存器的TH、TL字节写到E2RAM中E重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节F读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU运行流程4.1多个读取步骤4.2单个读取步骤4.3读取到的字节时序介绍5.1初始化主控器发送脉冲主控器发送脉冲至少至少480480ususDSDS1818BB2020等待等待15156060ususVpuVpu单总线单总线GNDGND主控器接收主控器接收至少至少480480ususDSDS1818BB2020发送发送存在脉冲存在脉冲6060240240usus5.2写时间隙5.3读时间隙6.开发板原理图7源程序#include/晶振为11.0592MHz#defineuintunsignedint#defineucharunsignedcharsbitDQ=P25;/接温度传感器sbitduan=P26;/数码管段选sbitwei=P27;/数码管位选ucharcodenumw=0x01,0x02,0x04,0x08,0x10,/数码管位选0x20,0x40,0x80,0x00;ucharcodenumd=0x3f,0x06,0x5b,0x4f,0x66,/数码管段选显示(09)0x6d,0x7d,0x07,0x7f,0x6f;ucharcodenumdg=0xbf,0x86,0xdb,0xcf,0xe6,/数码管“个”位段选显示因为保留一位小数,0xed,0xfd,0x87,0xff,0xef;/所以各位后要显示小数点,所以需要重新编码(09)ucharcodenumfh=0x40,0x00;/温度+符号位/*1ms延时函数*/voiddelay0(uintz)ucharx,y;for(x=z;x0;x-)for(y=110;y0;y-);/*15us延时函数*/voiddelay(uintz)while(z-);/*初始化DS18B20函数*/voidreset_ds18b20()ucharstat=0;DQ=1;delay(8);DQ=0;delay(80);/600us/12mhzDQ=1;delay(8);stat=DQ;/高电平为存在,低电平为不存在(stat应该为0)delay(4);/while(!

DQ);/*等待DQ变为高电平/因为存在脉冲检测结束后自动拉高*/returnstat;/*写一个字节函数*/voidwrite_byte(uchardat)uchari;DQ=1;/先拉高电平,为写作准备for(i=0;i=1;delay(4);/*读一个字节函数*/ucharread_byte()ucharvaul,i;DQ=1;/先拉高电平,为读作准备for(i=0;i=1;DQ=1;if(DQ)vaul|=0x80;delay(4);returnvaul;/*读取温度值函数*/intread_temper()uchartempl,temph,flag;inttemp;reset_ds18b20();/复位操作write_byte(0xcc);/跳过ROMwrite_byte(0x44);/温度转换delay(300);/*reset_ds18b20();/复位操作write_byte(0xcc);/跳过ROMwrite_byte(0xbe);/读内部RAM内容templ=read_byte();temph=read_byte();flag=(temph&0x80)7;/判断高字节符号位是1还是0(1为负温度,0为正温度)if(flag=0)/temp=(temph4);temp=(templ+temph*256)*0.625;/将精度0.0625扩大10倍,因为temp为整形,小数部分读不到/此项目需要保留一位小数,所以x10,小数点后移一位/所以可得要保留几位小数点就扩大10的几次方elsetemp=(templ+temph*256)-1)*(-0.625);returntemp;/*显示函数*/voiddisplay(intnum)uchari,zf,bai,shi,ge,fen;if(num0)zf=0;/温度符号位num=num*(-1);elsezf=1;/温度+符号位bai=num/1000;shi=num%1000/100;ge=num%100/10;fen=num%10;for(i=0;i6;i+)wei=1;P1=numwi;wei=0;P1=0x00;/消影duan=1;switch(i)case0:

if(zf=0)P1=numfhzf;elseif(bai!

=0)P1=numdbai;elseif(shi!

=0)P1=numdshi;elseP1=numdgge;break;case1:

if(zf=0&shi!

=0)P1=numdshi;elseif(zf=0&shi=0)P1=numdgge;elseif(zf!

=0&bai!

=0)P1=numdshi;elseif(zf!

=0&bai=0&shi!

=0)P1=numdgge;elseif(zf!

=0&bai=0&shi=0)P1=numdfen;break;case2:

if(zf=0&shi!

=0)P1=numdgge;elseif(zf=0&shi=0)P1=numdfen;elseif(zf!

=0&bai!

=0)P1=numdgge;elseif(zf!

=0&bai=0&shi!

=0)P1=numdfen;elseif(zf!

=0&bai=0&shi=0)P1=0x63;break;case3:

if(zf=0&shi!

=0)P1=numdfen;elseif(zf=0&shi=0)P1=0x63;elseif(zf!

=0&bai!

=0)P1=numdfen;elseif(zf!

=0&bai=0&shi!

=0)P1=0x63;elseif(zf!

=0&bai=0&shi=0)P1=0x39;break;case4:

if(zf=0&shi!

=0)P1=0x63;elseif(zf=0&shi=0)P1=0x39;elseif(zf!

=0&bai!

=0)P1=0x63;elseif(zf!

=0&bai=0&shi!

=0)P1=0x39;elseP1=0x00;break;case5:

if(zf=0&shi!

=0)P1=0x39;elseif(zf!

=0&bai!

=0)P1=0x39;elseP1=0x00;break;duan=0;P1=0x00;/消影delay0(10);/*主函数*/voidmain()while

(1)display(read_temper();8效果图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1