您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > DS18B20温度传感器详解带c程序
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内部结构64位ROM和单线接口电源检测存储器和控制器高速缓存存储器8位CRC生成器温度灵敏元件低温触发器TL高温触发器TH配置寄存器内部结构图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指令集A.READ_ROM[33H]读ROM//可读出64位编码B.MATCH_ROM[55H]匹配ROM//以此指令对某一个1820操作C.SKIP_ROM[CCH]跳过ROM//用于总线只有一个1820D.SEARCH_ROM[F0H]搜索ROM//用于一次读取多个1820的64位编码E.ALARM_SEARCH[ECH]报警搜索ROM//从多个1820中搜索哪个在报警(3)DS18B20功能指令(暂存器指令集)A.温度转换[44H]启动DS18B20进行温度转换B.读暂存器[BEH]读暂存器9个字节内容C.写暂存器[4EH]将数据写入暂存器的TH、TL字节D.复制暂存器[48H]把暂存器的TH、TL字节写到E2RAM中E.重新调E2RAM[B8H]把E2RAM中的TH、TL字节写到暂存器TH、TL字节F.读电源供电方式[B4H]启动DS18B20发送电源供电方式的信号给主CPU运行流程4.1多个读取步骤4.2单个读取步骤4.3读取到的字节时序介绍5.1初始化主控器发送脉冲至少480usDS18B20等待15~60usVpu单总线GND主控器接收至少480usDS18B20发送存在脉冲60~240us5.2写时间隙5.3读时间隙6.开发板原理图引脚为电源为对比度调节()此处接()此处接地此处接接数据此处接端背光灯正极(加限流)背光灯负极液晶模块步进电机模块数码管模块串口通信模块红外接收电路晶振电路继电器电路蜂鸣器电路复位电路电源电路灯电路矩阵键盘模块开发板原理图全必祥小作7.源程序#includereg52.h//晶振为11.0592MHz#defineuintunsignedint#defineucharunsignedcharsbitDQ=P2^5;//接温度传感器sbitduan=P2^6;//数码管段选sbitwei=P2^7;//数码管位选ucharcodenumw[]={0x01,0x02,0x04,0x08,0x10,//数码管位选0x20,0x40,0x80,0x00};ucharcodenumd[]={0x3f,0x06,0x5b,0x4f,0x66,//数码管段选显示(0—9)0x6d,0x7d,0x07,0x7f,0x6f};ucharcodenumdg[]={0xbf,0x86,0xdb,0xcf,0xe6,//数码管“个”位段选显示因为保留一位小数,0xed,0xfd,0x87,0xff,0xef};//所以各位后要显示小数点,所以需要重新编码(0—9)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;i8;i++){DQ=0;DQ=dat&0x01;delay(4);//DS18B20采样单片机写给DQ线上的数据(45us)***************DQ=1;dat=1;}delay(4);}/******************读一个字节函数****************/ucharread_byte(){ucharvaul,i;DQ=1;//先拉高电平,为读作准备for(i=0;i8;i++){DQ=0;vaul=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=(temph=4)+((templ&=0xf0)4);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=numw[i];wei=0;P1=0x00;//消影duan=1;switch(i){case0:if(zf==0)P1=numfh[zf];elseif(bai!=0)P1=numd[bai];elseif(shi!=0)P1=numd[shi];elseP1=numdg[ge];break;case1:if(zf==0&&shi!=0)P1=numd[shi];elseif(zf==0&&shi==0)P1=numdg[ge];elseif(zf!=0&&bai!=0)P1=numd[shi];elseif(zf!=0&&bai==0&&shi!=0)P1=numdg[ge];elseif(zf!=0&&bai==0&&shi==0)P1=numd[fen];break;case2:if(zf==0&&shi!=0)P1=numdg[ge];elseif(zf==0&&shi==0)P1=numd[fen];elseif(zf!=0&&bai!=0)P1=numdg[ge];elseif(zf!=0&&bai==0&&shi!=0)P1=numd[fen];elseif(zf!=0&&bai==0&&shi==0)P1=0x63;break;case3:if(zf==0&&shi!=0)P1=numd[fen];elseif(zf==0&&shi==0)P1=0x63;elseif(zf!=0&&bai!=0)P1=numd[fen];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&&b
本文标题:DS18B20温度传感器详解带c程序
链接地址:https://www.777doc.com/doc-4631335 .html