精华内容
下载资源
问答
  • DS18B20温度传感器

    2014-06-03 12:35:26
    DS18B20温度传感器的使用驱动软件包!
  • DS18B20 温度传感器

    2011-04-22 14:59:48
    DS18B20 温度传感器 使用verilog实现,里面是18b20的工程文件
  • ds18b20温度传感器

    2012-04-01 20:25:59
    ds18b20 温度传感器 精确度高 准确 51单片机 mega16单片机
  • 数字温度传感器DS18B20) 传感器参数

    数字温度传感器(DS18B20)

    DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

    在这里插入图片描述

    传感器参数

    • 测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°

    • 返回16位二进制温度数值

    • 主机和从机通信使用单总线,即使用单线进行数据的发送和接收

    • 在使用中不需要任何外围元件,独立芯片即可完成工作。

    • 掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

    • 每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值

    • 宽电压供电,电压2.5V~5.5V

    • DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

    传感器引脚及原理图

    DS18B20传感器的引脚及封装图如下:

    在这里插入图片描述
    DS18B20一共有三个引脚,分别是:

    • GND:电源地线
    • DQ:数字信号输入/输出端。
    • VDD:外接供电电源输入端。

    单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

    注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻

    DS18B20上拉电阻

    首先我们要知道什么是漏极开路

    首先看一下 场效应管(MOSFET)
    在这里插入图片描述
    场效应管 是电压控制型元器件,只要对栅极施加一定电压,DS就会导通。

    漏极开路:MOS管的栅极G和输入连接,源极S接公共端,漏极D悬空(开路)什么也没有接,直接输出 ,这时只能输出低电平和高阻态,不能输出高电平

    那么这个时候会出现三种情况:

    1. 图a为正常输出(内有上拉电阻):场效应管导通时,输出低电位输出低电位,截止时输出高电位。

    2. 图b为漏极开路输出,外接上拉电阻:场效应管导通时,驱动电流是从外部的VCC流经电阻通过MOSFET到GND,输出低电位,截止时输出高电位。

    3. 图c为漏极开路输出,无外接上拉电阻:场效应管导通时输出低电位,截止呈高阻态(断开)。
      在这里插入图片描述

    总结:

    开漏输出只能输出低电平,不能输出高电平。漏极开路输出高电平时必须在输出端与正电源(VCC)间外接一个上拉电阻。否则只能输出高阻态。

    DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。 其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过MOS下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。 因此,需要外接上拉电阻,否则无法输出1。



    外接上拉电阻阻值:

    DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ,

    所以正常选择4.7K电阻,或者相近的电阻值。



    DS18B20寄生电源

    DSl8B20的另一个特点是不需要再外部供电下即可工作。当总线高电平时能量由单线上拉电阻经过DQ引脚获得。高电平同时充电一个内部电容,当总线低电平时由此电容供应能量。这种供电方法被称为“寄生电源”。另外一种选择是DSl8B20由接在VDD的外部电源供电
    在这里插入图片描述

    DS18B20内部构成

    主要由以下3部分组成: 64 位ROM,高速暂存器,存储器

    64 位ROM存储独有的序列号

    ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。

    高速暂存器包含:

    • 温度传感器
    • 一个字节的温度上限和温度下限报警触发器(TH和TL)
    • 配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率,

    存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)
    在这里插入图片描述

    DS18B20高速缓存器

    高速暂存器由9个字节组成

    • 字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
    • 字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
    • 字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
    • 字节5~7 保留位。芯片内部使用
    • 字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
      在这里插入图片描述

    DS18B20温度读取与计算

    DS18B20采用16位补码的形式来存储温度数据温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

    高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0

    剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义

    在这里插入图片描述

    对应的温度计算:


    当五个符号位S=0时,温度为正值,直接将后面的11位二进制转换为十进制,再乘以0.0625(12位分辨率),就可以得到温度值;

    当五个符号位S=1时,温度为负值,先将后面的11位二进制补码变为原码(符号位不变,数值位取反后加1),再计算十进制值。再乘以0.0625(12位分辨率),就可以得到温度值;

    例如:

    +125℃的数字输出07D0(00000111 11010000)
     
    转换成10进制是2000,对应摄氏度:0.0625x2000=125°C

    -55℃的数字输出为 FC90。
      
    首先取反,然后+1,转换成原码为:11111011 01101111
    数值位转换成10进制是870,对应摄氏度:-0.0625x870=-55°C

    在这里插入图片描述
    代码:

    unsigned int Templ,Temp2,Temperature;  //Templ低八位,Temp2高八位
    unsigned char Minus Flag=0;  //负温度标志位
    
    if(Tenp2&0xFC//判断符号位是否为1
    {
    	Minus Flag=l; //负温度标志位置1
    	Temperature=((Temp2<<8)|Temp1); //高八位第八位进行整合
    	Temperature=((Temperature)+1); //讲补码转换为原码,求反,补1
    	Temperature*=0.0625;//求出十进制
    }
    else   //温度为正值
    {
    	Minus Flag=0;  //负温度标志位置0
    	Temperature =((Temp2<<8) |Temp1)*0.0625;
    }
    

    配置寄存器

    在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。
    在这里插入图片描述

    单总线系统

    在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是10H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。
    在这里插入图片描述

    一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。

    DS18B20工作步骤

    DS18B20的工作步骤可以分为三步:

    1.初始化DS18B20
    2.执行ROM指令
    3.执行DS18B20功能指令

    其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

    1.初始化DS18B20

    任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。

    初始化具体时序步骤如下:

    • 1.单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。
    • 2.这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答。
    • 3.DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功
    • 4.DS18B20拉低电平60~240us之后,会释放总线。
      在这里插入图片描述
      代码如下:
    /*****初始化DS18B20*****/
    unsigned int Init_DS18B20(void)
    {
      unsigned int x=0;
      DQ = 1;      //DQ复位
      delay(4);    //稍做延时
      DQ = 0;      //单片机将DQ拉低
      delay(60);   //精确延时,大于480us
      DQ = 1;      //拉高总线
      delay(8);
      x = DQ;      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
      delay(4);
      return x;
    }
    

    2.写时序

    总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据

    单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线
    单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线.

    在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。

    注意:2次写周期之间至少间隔1us

    在这里插入图片描述

    /*****写一个字节*****/
    void WriteOneChar(unsigned char dat)
    {
      unsigned char i=0;
      for (i=8; i>0; i--)
      {
        DQ = 0;
        DQ = dat&0x01;  //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0
    	delay(4);
        DQ = 1;
        dat>>=1;
      }
      delay(4);
    }
    
    

    DS18B20写入的功能命令:

    ROM指令:

    采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
    如果是单个DS18B20,直接写跳过ROM指令0xCC即可
    在这里插入图片描述

    RAM指令,DS18B20的一些功能指令

    常用的是:

    温度转换 0x44

    开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中

    读取温度 0xBE
    读取高速暂存器存储的数据
    在这里插入图片描述

    读时序

    读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0

    DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。

    在这里插入图片描述
    注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1ps的恢复时间

    同时注意:主机只有在发送读暂存器命令(0xBE)或读电源类型命令(0xB4)后,立即生成读时隙指令,DS18B20才能向主机传送数据。 也就是先发读取指令,再发送读时隙

    最后一点: 写时序注意是先写命令的低字节,比如写入跳过ROM指令0xCC(11001100),写的顺序是“零、零、壹、壹、零、零、壹、壹”,

    读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 我们正常使用DS18B20读取温度读取两个温度字节即可



    51例程

    sbit DQ=P1^0;	//定义DS18b20的管脚
    
    /*****延时子程序*****/
    void delay(unsigned int t)
    {
    	for(;t>0;t--);
    }
    
    
    /*****初始化DS18B20*****/
    unsigned char Init_DS18B20(void)
    {
      unsigned char x=0;
      DQ = 1;      //DQ复位
      delay(8);    //稍做延时
      DQ = 0;      //单片机将DQ拉低
      delay(80);   //精确延时,大于480us
      DQ = 1;      //拉高总线
      delay(8);
      x = DQ;      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
      delay(4);
      return x;
    }
    
    /*****读一个字节*****/
    unsigned char ReadOneChar(void)
    {
      unsigned char i=0;
      unsigned char dat = 0;
      for (i=8;i>0;i--)
      {
        DQ = 0;     // 给脉冲信号
        dat>>=1;
        DQ = 1;     // 给脉冲信号
        if(DQ)
        	dat|=0x80;
    	delay(4);
      }
      return(dat);
    }
    
    /*****写一个字节*****/
    void WriteOneChar(unsigned char dat)
    {
      unsigned char i=0;
      for (i=8; i>0; i--)
      {
        DQ = 0;
        DQ = dat&0x01;
    	delay(4);
        DQ = 1;
        dat>>=1;
      }
      delay(4);
    }
    
    /*****读取温度*****/
    int ReadTemperature(void)
    {
      	unsigned char a=0;
      	unsigned char b=0;
      	unsigned int t=0;
      	t=Init_DS18B20();
      	if(t) return Real_temp;
      	WriteOneChar(0xCC);  //跳过读序号列号的操作
      	WriteOneChar(0x44);  //启动温度转换
      	t=Init_DS18B20();
      	if(t) return Real_temp;
      	WriteOneChar(0xCC);  //跳过读序号列号的操作
      	WriteOneChar(0xBE);  //读取温度寄存器
      	a=ReadOneChar();     //读低8位
      	b=ReadOneChar();     //读高8位
      	t=b;
      	t<<=8;
      	t=t|a;
      	if(t<=0||t>0x900) 
    	return Real_temp;
    	t=t*0.625+0.5;
      	return(t);
    }
    
    

    STM32例程

    DS18B20.C

    #include "ds18b20.h"
    #include "delay.h"	
    
    //复位DS18B20
    void DS18B20_Rst(void)	   
    {                 
    	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 	//拉低DQ
        delay_us(750);    	//拉低750us
        DS18B20_DQ_OUT=1; 	//DQ=1 
    	delay_us(15);     	//15US
    }
    //等待DS18B20的回应
    //返回1:未检测到DS18B20的存在
    //返回0:存在
    u8 DS18B20_Check(void) 	   
    {   
    	u8 retry=0;
    	DS18B20_IO_IN();	//SET PG11 INPUT	 
        while (DS18B20_DQ_IN&&retry<200)
    	{
    		retry++;
    		delay_us(1);
    	};	 
    	if(retry>=200)return 1;
    	else retry=0;
        while (!DS18B20_DQ_IN&&retry<240)
    	{
    		retry++;
    		delay_us(1);
    	};
    	if(retry>=240)return 1;	    
    	return 0;
    }
    //从DS18B20读取一个位
    //返回值:1/0
    u8 DS18B20_Read_Bit(void) 	 
    {
        u8 data;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 
    	delay_us(2);
        DS18B20_DQ_OUT=1; 
    	DS18B20_IO_IN();	//SET PG11 INPUT
    	delay_us(12);
    	if(DS18B20_DQ_IN)data=1;
        else data=0;	 
        delay_us(50);           
        return data;
    }
    //从DS18B20读取一个字节
    //返回值:读到的数据
    u8 DS18B20_Read_Byte(void)     
    {        
        u8 i,j,dat;
        dat=0;
    	for (i=1;i<=8;i++) 
    	{
            j=DS18B20_Read_Bit();
            dat=(j<<7)|(dat>>1);
        }						    
        return dat;
    }
    //写一个字节到DS18B20
    //dat:要写入的字节
    void DS18B20_Write_Byte(u8 dat)     
     {             
        u8 j;
        u8 testb;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
        for (j=1;j<=8;j++) 
    	{
            testb=dat&0x01;
            dat=dat>>1;
            if (testb) 
            {
                DS18B20_DQ_OUT=0;	// Write 1
                delay_us(2);                            
                DS18B20_DQ_OUT=1;
                delay_us(60);             
            }
            else 
            {
                DS18B20_DQ_OUT=0;	// Write 0
                delay_us(60);             
                DS18B20_DQ_OUT=1;
                delay_us(2);                          
            }
        }
    }
    //开始温度转换
    void DS18B20_Start(void) 
    {   						               
        DS18B20_Rst();	   
    	DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0x44);	// convert
    } 
    
    //初始化DS18B20的IO口 DQ 同时检测DS的存在
    //返回1:不存在
    //返回0:存在    	 
    u8 DS18B20_Init(void)
    {
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	 //使能PORTG口时钟 
    	
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//PORTG.11 推挽输出
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
     	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     	GPIO_Init(GPIOG, &GPIO_InitStructure);
    
     	GPIO_SetBits(GPIOG,GPIO_Pin_11);    //输出1
    
    	DS18B20_Rst();
    
    	return DS18B20_Check();
    }  
    //从ds18b20得到温度值
    //精度:0.1C
    //返回值:温度值 (-550~1250) 
    short DS18B20_Get_Temp(void)
    {
        u8 temp;
        u8 TL,TH;
    	short tem;
        DS18B20_Start ();  			// ds1820 start convert
        DS18B20_Rst();
        DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0xbe);	// convert	    
        TL=DS18B20_Read_Byte(); 	// LSB   
        TH=DS18B20_Read_Byte(); 	// MSB  
    	    	  
        if(TH>7)
        {
            TH=~TH;
            TL=~TL; 
            temp=0;					//温度为负  
        }else temp=1;				//温度为正	  	  
        tem=TH; 					//获得高八位
        tem<<=8;    
        tem+=TL;					//获得底八位
        tem=(float)tem*0.625;		//转换     
    	if(temp)return tem; 		//返回温度值
    	else return -tem;    
    }
    
    
    

    DS18B20.H

    #ifndef __DS18B20_H
    #define __DS18B20_H 
    #include "sys.h"   
    
    //IO方向设置
    #define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
    #define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
    IO操作函数											   
    #define	DS18B20_DQ_OUT PGout(11) //数据端口	PA0 
    #define	DS18B20_DQ_IN  PGin(11)  //数据端口	PA0 
       	
    u8 DS18B20_Init(void);//初始化DS18B20
    short DS18B20_Get_Temp(void);//获取温度
    void DS18B20_Start(void);//开始温度转换
    void DS18B20_Write_Byte(u8 dat);//写入一个字节
    u8 DS18B20_Read_Byte(void);//读出一个字节
    u8 DS18B20_Read_Bit(void);//读出一个位
    u8 DS18B20_Check(void);//检测是否存在DS18B20
    void DS18B20_Rst(void);//复位DS18B20    
    #endif
    
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 15、DS18b20温度传感器.zip
  • DS18B20温度传感器实验

    2021-01-04 00:52:39
    DS18B20温度传感器实验
  • 在这里和大家分享一个DS18B20温度传感器的C语言程序,感兴趣的朋友可以看看。
  • DS18B20温度传感器.zip

    2020-07-29 09:09:23
    本资源可以实现利用51单片机上面的DS18B20温度传感器模块测量温度后,在单片机的7段数码管上显示温度数值的功能,显示位数为小数点后两位。
  • #DS18B20 温度传感器与Python ##Run on Raspberry Pi 我用 Archlinux 运行这个 ###我使用了 Systemd/定时器 ds18b20.timer [Unit] Description=Run ds18b20 for temperature [Timer] OnBootSec=1min ...
  • ds18b20温度传感器
  • DS18B20温度传感器实验.7z
  • 51单片机DS18B20温度传感器详解

    万次阅读 多人点赞 2016-01-26 20:27:04
    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成...

    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。

    一.DS18B20温度传感器

    1.引脚图

    这里写图片描述

    2.DS18B20内部结构图

    这里写图片描述
    主要由2部分组成:64位ROM、9字节暂存器,如图所示。

    (1) 64 位ROM。它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。

    (2) 9字节暂存器包含:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。

    3.64位ROM结构图

    这里写图片描述

    8位CRC:是单总线系列器件的编码,DS18B20定义为28H。
    48位序列号:是一个唯一的序列号。
    8位系列码:由CRC产生器生产,作为ROM中的前56位编码的校验码。

    4.9字节暂存器结构图

    这里写图片描述

    以上是内部9 个字节的暂存单元(包括EEPROM)。
    字节0~1 是温度存储器,用来存储转换好的温度。
    字节2~3 是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
    字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
    字节5~7 保留位。
    字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。

    5.温度寄存器结构图

    这里写图片描述

    温度寄存器由两个字节组成,分为低8位和高8位。一共16位。
    其中,第0位到第3位,存储的是温度值的小数部分。
    第4位到第10位存储的是温度值的整数部分。
    第11位到第15位为符号位。全0表示是正温度,全1表示是负温度。
    表格中的数值,如果相应的位为1,表示存在。如果相应的位为0,表示不存在。

    6.配置寄存器

    这里写图片描述

    精度值:
    9-bit 0.5℃
    10-bit 0.25℃
    11-bit 0.125℃
    12-bit 0.0625℃

    7.温度/数据关系

    这里写图片描述

    注意:如果温度是一个负温度,要将读到的数据减一再取反

    二.单总线协议

    1.单总线通信初始化

    这里写图片描述

    初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。主机通过拉低单总线480-960μs产生复位脉冲;然后由主机释放总线,并进入接收模式。主机释放总线时,会产生一由低电平跳变为高电平的上升沿,单总线器件检测到该上升沿后,延时15~60μs,接着单总线器件通过拉低总线60~240μsμ来产生应答脉冲。主机接收到从机的以应答脉冲后,说明有单总线器件在线,到此初始化完成。然后主机就可以开始对从机进行ROM命令和功能命令操作。

    2.位写入时序

    这里写图片描述

    写时隙:当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1的时间隙和写0时间隙。所有写时间隙必须最少持续60us,包括两个写周期间至少1us的恢复时间。DQ引脚上的电平变低后,DS18B20在一个15us到60us的时间窗口内对DQ引脚采样。如果DQ引脚是高电平,就是写1,如果DQ引脚是低电平,就是写0。主机要生成一个写1时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15us内允许数据线拉到高电平。主机要生成一个写0时间隙,必须把数据线拉到低电平并保持60us。

    3.位读取时序

    这里写图片描述

    当主机把总线从高电平拉低,并保持至少1us后释放总线;并在15us内读取从DS18B20输出的数据。

    4.DS18B20的ROM操作命令
    用途:主要是用于选定在单总线上的DS18B20,分为5个命令
    (1).读出ROM,代码为33H,用于读出DS18B20的序列号,即64位激光ROM代码。
    (2).匹配ROM,代码为55H,用于识别(或选中)某一特定的DS18B20进行操作。
    (3).搜索ROM,代码为F0H,用于确定总线上的节点数以及所有节点的序列号。
    (4).跳过ROM,代码为CCH,当总线仅有一个DS18B20时,不需要匹配 。
    (5).报警搜索,代码为ECH,主要用于鉴别和定位系统中超出程序设定的报警温度界限的节点。

    三.驱动程序

    测试平台:
    单片机:STC89C52RC,晶振12MHZ

    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit DQ=P3^7;  //定义数据线
    
    void delay_us(uchar n)    //延时约16微妙
    {
        while(n--);
       }

    1.初始化

    void DS18B20_init()
    {
           DQ=1;
           delay_us(1);     //稍作延时
           DQ=0;
           delay_us(80);    //延时480到960us
           DQ=1;
           i = 0;
           while(DQ)    //等待DS18B20拉低总线
           {
               delay_us(100);
               i++;
               if(i>5)//约等待>5MS
               {
                   return 0;//初始化失败
               }    
           }
    }

    2.写字节

    void write_byte(uchar dat)   //写一个字节
    {
       uchar i;
       for(i=0;i<8;i++)
       {
          DQ=0;  //每写入一位数据之前先把总线拉低1us
          _nop_();
         DQ=dat&0x01;    //取最低位写入
         delay_us(10);   //延时68us,持续时间最少60us
         DQ=1;   //然后释放总线
         dat=dat>>1;    //从低位开始写
       }
       delay_us(10);
    }

    3.读字节

    uchar read_byte()    //读一个字节
    {
      uchar i,dat=0;
      for(i=0;i<8;i++)
      {
         DQ=0;  //先将总线拉低1us
         _nop_();
         DQ=1;  //然后释放总线
         _nop_();_nop_();
         _nop_();_nop_();
         if(DQ) dat=dat|0x80;   //每次读一位
         dat=dat>>1;       //从最低位开始读
         delay_us(10);   //读取完之后等待48us再接着读取下一个数
       }
       return dat;
    }

    4.读温度

    uint read_temper ()
    {    
       uchar a,b;         
       uint t=0;
       DS18B20_init();       
       delay_us(15);
       write_byte(0xcc);   //跳过ROM操作命令
       write_byte(0x44);     //发送启动温度转换命令
       DS18B20_init();       
       delay_us(15);
       write_byte(0xcc);    //跳过ROM操作命令
       write_byte(0xbe);      //发送读温度寄存器命令
       a=read_byte();    //先读低八位
       b=read_byte();      //再读高八位
       t=b;        
       t<<=8;      //左移八位
       t=t|a;      //t为16位的数,使高八位为b的值,低八位为a的值  
       return t;    //返回温度值
    }

    5.温度转换

    uint temper_change()
    {
        uint temper;
        float tp;
        temper=read_temper();
        if(temper<0)    //考虑负温度的情况
        {
            temper=temper-1;
            temper=~temper;
            tp=temper*0.0625;  //16位温度转换成10进制的温度
            temper=tp*100+0.5;   //留两个小数点,并四舍五入
        }
        else
        {
            tp=temper*0.0625;  //16位温度转换成10进制的温度
            temper=tp*100+0.5;  //留两个小数点,并四舍五入
        }
        return temper;
    }

    注意:在主函数中调用temper_change()函数返回的temper即为温度值。由于单总线对时序要求严格,我们的延时函数可能并不适用于你的单片机,所以请根据需要自行进行修改

    展开全文
  • avr-ds18b20 ds18b20是用于控制DS18B20温度传感器的AVR库。 它可以轻松地为avr-gcc支持的每个微控制器avr-gcc 。 用法示例 # include # include # include # include < ds18b20> int main ( ) { int temp; ...
  • DS18B20温度传感器实验,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好,proteus直接可以运行...
  • ds18b20 温度传感器

    2013-05-24 15:38:40
    温度传感器 ds18b20,单片机程序,能用。
  • ds18b20温度传感器原理

    万次阅读 多人点赞 2018-01-01 13:55:01
    DS18b20温度传感器

    一、DS18B20型智能温度传感器的工作原理

    1、DS18B20基本知识及管脚

    DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单、体积小的特点。因此用它来组成一个测温系统,线路简单,在一根通信线上,可以挂很多这样的数字温度计,十分方便。DS18B20是美国DALLAS公司新推出的一种可组网数字式温度传感器,与DS1820相似,DS18B20也能够直接读取被测物体的温度值。但是与DS1820相比,DS18B20的功能更强大些。它体积小,电压适用范围宽(3~5V),用户还可以通过编程实现9~12位的温度读数,即具有可调的温度分辨率,因此它的实用性和可靠性比同类产品更高。另外,DS18B20有多种封装可选,如TO-92, SOIC及CSP封装。图5-5即为DS18B20的引脚排列图。其引脚功能见表5-1。



    2、DS18B20内部结构

    DS18B20内部结构如图5-6所示,主要由4部分组成:温度传感器、64位ROM、非挥发的温度报警触发器TH和TI、配置寄存器。由图5-6可见,DS18B20只有一个数据输入输出口,属于单总线专用芯片之一。DS18B20工作时被测温度值直接以“单总线”的数字方式传输,大大提高了系统的抗干扰能力。其内部采用在线温度测量技术,测量范围为55~125°C,在-10~85℃时,精度为±0.5°C。每个DS18B20在出厂时都已具有唯一的64位序列号,因此一条总线上可以同时挂接多个DS18B20,而不会出现混乱现象。另外用户还可自设定非易失性温度报警上下限值TH和TL(掉电后依然保存)。DS18B20在完成温度变换后,所测温度值将自动与存储在TH和TL内的触发值相比较,如果测温结果高于TH或低于TL, DS18B20内部的告警标志就会被置位,表示温值超出了测量范围,同时还有报警搜索命令识别出温度超限的DS18B20。

    ① 64位闪存ROM的结构如图5-7所示。


    首先是8位的产品单线系列编码,接着是每个器件的唯一的序号,共有48位,最重要的8位是前面56位的CRC校验码(循环冗余校验码),这也是多个DS18B20可以采用一线进行通信的原因。

    ②非易失性温度报警触发器TH和TL,可通过软件写人用户报警上下限。

    ③高速暂存存储器。DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的(E2) RAM。后者用于存储TH和TL值。数据先写人RAM,经校验后再传给(E2)RAM。而配置寄存器为高速暂存器中的第5个字节,它的内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如图5-8所示。低5位一直都是1,  TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,即用于设置分辨率,如表5-2所示(DS18B20出厂时被设置为12位)。



    如表5-2可见,设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要在分辨率和转换时间之间权衡考虑。高速暂存存储器除了配置寄存器外,还有其他8个字节,其分配如图5-9所示。其中温度信息(第1、 2字节),TH和TL值第3、4字节,第6~8字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。


    当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可通过单线接口读到该数据,读取时高位在后、低位在前,数据格式以0.0625°C/LSB形式表示。温度值格式如图5-10所示。符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。表5-3是对应的一部分温度值。



    DS18B20完成温度转换后,就把测得的温度值与TH、TL进行比较,若T>TH或T< TL,则将该器件内的告警标志置位,并对主机发出的警告搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行告警搜索。

    ④CRC的产生。在64位ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值进行比较,以判断主机收到的ROM数据是否正确。

    3、DS18B20的测温原理

    DS18B20的内部测温电路框图如图5-11所示,图中低温度系数振荡器的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数振荡器随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置人减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到。时温度寄存器的值将加1,减法计数器1的预置将重新被装人,减法计数器1重新开始对低温度系数振荡器产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图5-11中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。


    由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

    1. DS18B20的初始时序

    DS18B20的初始时间如图5-12所示。


    2. DS18B20的读时序

    对于DS18B20的读时序分为读0时序和读1时序两个过程,见图5-13。


    对于DS18B20的读时序是从主机把单总线拉低之后,在15us之内须释放单总线,以便DSl8B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us。

    3. DS18B20的写时序

    对于DS18B20的写时序仍然分为写0时序和写1时序两个过程,见图5-14。


    对于DS18B20写。时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15~45us之间正确地采集I/O总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内须释放单总线。


    二、基于DS18B20构成的单片机温控系统

    DS18B20的硬件连接(以51单片机为例),DS18B20与单片机的接口极其简单,只需将DS18B20的信号线与单片机的一位双向端口相连即可。如图5-15(a)所示。此时应注意将VDD、DQ、 GND三线焊接牢固。另外也可用两个端口,即接收口与发送口分开,这样读写操作就分开了,不会出现信号竞争的问题。如图5-15(b)所示,此图是采用寄生电源方式,将DS18B20的 VDD与GND接在一起。如若VDD脱开未接好,传感器将只送85. 0℃的温度值。一般测温电缆线采用屏蔽4芯双绞线,其中一对接地线与信号线,另一对接VDD和地线,屏蔽层在源端单点接地。




    展开全文
  • DS18B20温度传感器在protues仿真软件下的电路仿真测试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,270
精华内容 2,108
关键字:

ds18b20温度传感器