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

    万次阅读 多人点赞 2019-04-11 17:08:55
    1、DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: 采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于...

    1、DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:

    • 采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。
    • 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。
    • 在使用中不需要任何外围元件。
    • 持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
    • 供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
    • 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
    • 负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
    • 掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

    2、DS18B20内部结构:

    DS18B20内部主要包括,64位ROM、2字节温度输出寄存器、1字节上下警报寄存器(TH和TL)和1字节配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同,这样就可以实现一根总线挂接多个DS18B20的目的。配置寄存器允许用户将温度 - 数字转换的分辨率设置为9,10,11或12位。DS18B20控制引脚需要一个上拉电阻,并通过开漏模式连接到总线。DS18B20无需外部电源也可运行,当总线为高电平时,通过DQ引脚提高电源,并将电存储在Cpp电容中,在总线处于低电平时为器件供电,这种方法称为“寄生电源”。另外DS18B20也可通过VDD供电。结构图如下:

     

    3、DS18B20内部构成:

     高速暂存存储器由9个字节组成,分为温度的低八位数据0、温度的高8位数据1、高温阈值2、低温阈值3、配置寄存器4、保留5、保留6、保留7和CRC校验8。器件断电时,EEPROM寄存器中的数据保留,上电后,EEPROM数据被重新加载到相应的寄存器位置,也可以使用命令随时将数据从EEPROM重新加载到暂存器中。

    4、温度寄存器数据格式:

    DS18B20中的温度传感器数据用16位二进制形式提供,其中S为符号位(正数S=0,负数S=1)。温度传感器的分辨率可由用户配置为9、10、11或12位,分别对应0.5℃、0.25 ℃、0.125℃和0.0625℃的增量。开机时的默认分辨率是12位。如果DS18B20配置为12位分辨率,那么温度寄存器中的所有位都将包含有效数据。对于11位分辨率,0位没有定义。对于10位分辨率,位1和0没有定义,对于9位分辨率,位2、位1和位0没有定义。

    5、TH和TL报警寄存器格式:

    TH和TL寄存器存储温度报警触发值,符号位S表示值是正还是负,对于正数,S=0,对于负数,S=1。DS18B20执行温度转换后,将温度值与用户定义的两个报警触发值进行比较,由于TH和TL是8位寄存器,因此在比较TH和TL时只使用温度寄存器的第11位到第4位,如果被测温度低于或等于TL值,或高于或等于TH值,则在DS18B20内部存在报警条件,并设置报警标志。主设备可以通过发出一个[EC]命令来检查总线上所有DS18B20的报警标志状态。TH和TL寄存器是非易失性的(EEPROM),当设备断电时,它们将保留数据。可以通过内存部分暂存器的字节2和字节3访问TH和TL。

    6、配置寄存器数据格式:

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

    7、 初始化时序:

    主机首先发出一个最少480微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

    做为从器件的DS18B20在一上电后就一直在检测总线上是否有至少480微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

    8、写操作时序:

     

     写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

    9、读操作时序:

     对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。

    10、DS18B20 单线通信功能是分时完成的,他有严格的时序概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3个步骤 :

    • 1、每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。

    • 2、发送一条 ROM 指令。

     

    •  3、发送存储器指令。

    11、 Sensor_Temp.c

    #include "sensor_temperature.h"
    #include "bsp_systick.h"		 
    							
    // 传感器复位函数
    void DS18B20_Reset(void)
    {
        DS18B20_DQ_OUT_L;
        SYSTICK_DelayUs(480);   
        DS18B20_DQ_OUT_H;
        SYSTICK_DelayUs(15);	
    }
    
    // 等待传感器响应函数
    bool DS18B20_Check(void) 	   
    {   
        uint8_t retry = 0;
        while(DS18B20_DQ_IN)  { if(retry++ > 60) { return false;} else { SYSTICK_DelayUs(1);	} }	
        retry = 0;	
        while(!DS18B20_DQ_IN) { if(retry++ > 240){ return false;} else { SYSTICK_DelayUs(1);	} }	
    	return true;
    }
    
    // 传感器初始化
    bool DS18B20_Init(void)
    {
        GPIO_InitTypeDef  GPIO_InitStructure;
    
        RCC_AHBPeriphClockCmd(DS18B20_RCC_ClockCmd , ENABLE);
    
        GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_Pin_x;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(DS18B20_GPIOx, &GPIO_InitStructure);
    
        DS18B20_Reset(); // 传感器复位
        return DS18B20_Check();
    }
    
    // 向传感器写数据
    void DS18B20_Write(uint8_t data)
    {
        for (uint8_t i=0; i<8; i++) 			
        {		
    	if(data&0x01)			
    	{
    	    DS18B20_DQ_OUT_L;
    	    SYSTICK_DelayUs(2);     
    	    DS18B20_DQ_OUT_H;
    	    SYSTICK_DelayUs(60);    	 
    	}
    	else 						
    	{
    	    DS18B20_DQ_OUT_L;
    	    SYSTICK_DelayUs(60);      
    	    DS18B20_DQ_OUT_H;
    	    SYSTICK_DelayUs(2);     
    	}
    	data >>= 1;
        }
    }
    
    // 从传感器读取一个Bit数据
    uint8_t DS18B20_Read_Bit(void) 
    {
        uint8_t data;
        DS18B20_DQ_OUT_L;
        DS18B20_DELAY_2US();
        DS18B20_DQ_OUT_H;
        DS18B20_DELAY_2US();
        data = DS18B20_DQ_IN;
        SYSTICK_DelayUs(50);
        return data;
    }
    
    // 从传感器中读取一个字节数据
    uint8_t	DS18B20_Read_Byte(void)
    {
        uint8_t data = 0;
        for(uint8_t i=0; i<8; i++)
        {
    	data >>= 1;
    	if(DS18B20_Read_Bit())
    	{
    	    data |= 0x80;			
    	}
        }
        return data;
    }
    
    
    // 向传感器发送指令,测量温度
    void DS18B20_Start(void)
    {
        DS18B20_Reset();
        DS18B20_Check();
        DS18B20_Write(0xCC); // 忽略ROM地址,直接发送命令
        DS18B20_Write(0x44); // 启动DS18B20单个温度转换
    }
    
    float data;
    // 读取传感器的值
    float	DS18B20_Get_Temp(void)
    {
        DS18B20_Start();
        DS18B20_Reset();
        DS18B20_Check();
        DS18B20_Write(0xCC); // 忽略ROM地址,直接发送命令
        DS18B20_Write(0xBE); // 读取暂存器中9字节数据
        data = ((uint16_t)DS18B20_Read_Byte() | DS18B20_Read_Byte()  << 8) * 0.0625f;
        return data;
    }
    

    8、Sensor_Temp.h

    #ifndef _BSP_TEMPERATURE_H_
    #define _BSP_TEMPERATURE_H_
    
    #include "stm32f0xx.h"
    #include <stdbool.h>
    
    #define DS18B20_RCC_ClockCmd			RCC_AHBPeriph_GPIOA
    #define DS18B20_GPIO_Pin_x			GPIO_Pin_0
    #define DS18B20_GPIO_NUMBER			0
    #define DS18B20_GPIOx				GPIOA
    										   
    #define	DS18B20_DQ_OUT_H	GPIO_SetBits(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)
    #define DS18B20_DQ_OUT_L	GPIO_ResetBits(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)
    #define	DS18B20_DQ_IN  		GPIO_ReadInputDataBit(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)
    
    // 定义内联延时函数
    static inline void DS18B20_DELAY_2US(void)
    {
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
    	__nop();__nop();__nop();__nop();		
    }	 		
    	
    
    void DS18B20_Reset(void);
    bool DS18B20_Check(void);
    bool DS18B20_Init(void);
    uint8_t DS18B20_Read_Bit(void);
    uint8_t DS18B20_Read_Byte(void);
    void DS18B20_Write_Byte(uint8_t dat);
    void DS18B20_Start(void);
    float DS18B20_Get_Temp(void);
    	
    #endif
    
    

    9、主函数

    int main()
    {
        SYSTICK_Init(1); // 滴答定时器初始化
        DS18B20_Init(); // 传感器初始化
        USART1_Init(); // 串口初始化
        while(1)
        {
    	printf("Temperature is: %f\r\n",DS18B20_Get_Temp());	
    	SYSTICK_DelayMs(800);
        }
    }

    参考资料地址:http://www.21ic.com/jichuzhishi/datasheet/DS18B20/data/187578.html

    展开全文
  • DS18B20温度传感器学习笔记

    千次阅读 多人点赞 2021-01-06 16:19:49
    DS18B20温度传感器 DS18B20是DALLAS公司的1-Wire(单总线)数字温度计芯片,温度测量范围从-55℃至+125℃。...鉴于以上优点DS18B20自问世以来就广泛的应用于恒温控制系统,消费类产品,电子温度计以及数字环境监测系统。

    DS18B20温度传感器

    DS18B20是DALLAS公司的1-Wire(单总线)数字温度计芯片,温度测量范围从-55℃至+125℃。

    DS18B20使用方便,单片机和DS18B20仅需连接一条数据线,在寄生供电方式下可以不接电源线,DS18B20工作所需的电源可以从数据线获得。

    与传统的温度测量方式不同,DS18B20的温度转换结果可直接从数据线读出,在-10℃至+85℃测量精度可达0.5℃。

    鉴于以上优点DS18B20自问世以来就广泛的应用于恒温控制系统,消费类产品,电子温度计以及数字环境监测系统。

    在这里插入图片描述
    基本功能:
    数字温度计的基本功能如下:

    1. AT89C51每间隔1秒向DS18B20发送测量温度指令,并读出当前环境温度;
    2. 在读出当前环境温度值后,用LCD1602显示温度转换的结果;

    DS18B20内部结构图:
    在这里插入图片描述
    DS18B20内部电路原理图:
    在这里插入图片描述

    重要之处:
    DS18B20的命令序列及操作时序
    1.命令序列
    典型的单总线命令序列如下:
    第一步:初始化;
    第二步:ROM命令;
    第三步:功能命令。
    每次访问单总线器件,必须严格遵守这个命令序列,如果出现序列混乱,则单总线器件不会响应主机。但是,这个准则对于搜索ROM命令和报警搜索命令列外,在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。

    (1)初始化
    基于单总线上的所有传输过程都是以初始化开始的,初始化过程中由主机发出的复位脉冲和从机响应的应答脉冲组成。应答脉冲使主机知道,总线上有从机设备,且准备就绪。

    bit Get18B20Ack()
    {
    bit ack;
    EA = 0; //禁止总中断
    IO_18B20 = 0; //产生 500us 复位脉冲
    DelayX10us(50);
    IO_18B20 = 1;
    DelayX10us(6); //延时 60us
    ack = IO_18B20; //读取存在脉冲
    while(!IO_18B20); //等待存在脉冲结束
    EA = 1; //重新使能总中断
    return ack;
    }
    

    首先单片机要拉低这个引脚,持续大概 480us 到 960us 之间的时间即可,我们的程序中持续了 500us。然后,单片机释放总线,就是给高电平,DS18B20 等待大概 15 到 60us 后,会主动拉低这个引脚大概是 60 到240us,而后 DS18B20 会主动释放总线,这样 IO 口会被上拉电阻自动拉高。

    由于 DS18B20 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断。然后第一步,拉低 DS18B20 这个引脚,持续 500us;第二步,延时 60us;第三步,读取存在脉冲,并且等待存在脉冲结束。

    (2)ROM命令
    总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样, 1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?

    在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。 DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少。
    我们这里只讲一条总线上只接一个器件的指令和程序。
    Skip ROM(跳过 ROM): 0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。

    (3) RAM 存储器操作指令

    Read Scratchpad(读暂存寄存器): 0xBE
    DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
    Convert Temperature(启动温度转换): 0x44
    当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。

    ///
    2、 DS18B20 的位读写时序///重点
    在这里插入图片描述
    当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us就可以了。图上显示的意思是,单片机先拉低 15us 之后, DS18B20 会在从 15us 到 60us 之间的时间来读取这一位, DS18B20 最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,最多不会超过60us, DS18B20 必然读取完毕,所以持续时间超过 60us 即可。

    当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写 0 类似的是, DS18B20 会在15us 到 60us 之间来读取这个 1。可以看出来, DS18B20 的时序比较严格,写的过程中最好不要有中断打断,但是在两个“位”之间的间隔,是大于 1 小于无穷的,那在这个时间段,我们是可以开中断来处理其它程序的。发送即写入一个字节的数据程序如下。

    void Write18B20(unsigned char dat)
    {
    unsigned char mask;
    EA = 0; //禁止总中断
    for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit
    {
    IO_18B20 = 0; //产生 2us 低电平脉冲
    _nop_();
    _nop_();
    if ((mask&dat) == 0) //输出该 bit 值
    IO_18B20 = 0;
    else
    IO_18B20 = 1;
    DelayX10us(6); //延时 60us
    IO_18B20 = 1; //拉高通信引脚
    }
    EA = 1; //重新使能总中断
    }
    

    //
    在这里插入图片描述
    当要读取 DS18B20 的数据的时候,我们的单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。从拉低这个引脚到读取引脚状态,不能超过 15us。大家从图 16-18 可以看出来,主机采样时间,也就是 MASTER SAMPLES,是在 15us 之内必须完成的,读取一个字节数据的程序如下。

    /* 从 DS18B20 读取一个字节,返回值-读到的字节 */
    unsigned char Read18B20()
    {
    	unsigned char dat;
    	unsigned char mask;
    
    	EA = 0;
    	for(mask=0x01; mask!=0; mask<<=1)
    	{
    		IO_18B20 = 0;
    		_nop_();
    		_nop_();
    		IO_18B20 = 1;
    		_nop_();
    		_nop_();
    		if(!IO_18B20)	//读取通信引脚上的值
    			dat &= ~mask;
    		else
    			dat |= mask;
    		DelayX10us(6);
    	}
    	EA = 1;
    
    	return dat;
    }
    

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

    展开全文
  • DS18B20

    千次阅读 2014-11-13 23:08:09
    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于...

    DS18B20详细中文资料

    来源:互联网 作者:
    关键字:18B   B20   DS      

    DS18B20的特点:

    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:

    ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

    ( 2 )测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。

    ( 3 )在使用中不需要任何外围元件。

    ( 4 )持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。

    ( 5 )供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。

    ( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。

    ( 7 ) 负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

    ( 8 )掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

    DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。

    DS18B20内部结构:

    主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X^8+X^5+X^4+1)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

     

    1.jpg

    DS18B20管脚排列:

    1. GND为电源地;

    2. DQ为数字信号输入/输出端;

    3. VDD为外接供电电源输入端(在寄生电源接线方式时接地)

    2.jpg 

    DS18B20内部构成:

    高速暂存存储器由9个字节组成,当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。

     3.jpg

    温度的低八位数据 0

    温度的高八位数据 1

    高温阀值 2

    低温阀值 3

    保留 4

    保留 5

    计数剩余值 6

    每度计数值 7

    CRC 校验 8

    DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。

    4.jpg 
     

    例如:

    +125℃的数字输出07D0H

    (正温度直接把16进制数转成10进制即得到温度值 )

    -55℃的数字输出为 FC90H。

    (负温度把得到的16进制数取反后加1 再转成10进制数)

    5.jpg

    DS18B20的工作时序:

    初始化时序

    6.jpg 

    主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

    做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

    写操作

    7.jpg 

    写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

    读操作

    8.jpg 

    对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成

    DS18B20 单线通信:

    DS18B20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3个步骤 :

    (1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。

    (2)发送一条 ROM 指令

    9.jpg 

    (3)发送存储器指令

    10.jpg 

    具体操作举例:

    现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是:

    1、主机先作个复位操作,

    2、主机再写跳过ROM的操作(CCH)命令,

    3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总线状态如下图。

    11.jpg 

    读取RAM内的温度数据。同样,这个操作也要接照三个步骤。

    1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。

    2、主机发出跳过对ROM操作的命令(CCH)。

    3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同样读取数据也是低位在前的。整个操作的总线状态如下图:

    12.jpg 

    C语言代码

    sbit DQ=P3^3;

    uchar t; //设置全局变量,专门用于延时程序

    bit Init_DS18B20(void)

    {

    bit flag;

    DQ=1;

    _nop_(); //??????????????? for(t=0;t<2;t++);

    DQ=0;

    for(t=0;t<200;t++);

    DQ=1;

    for(t=0;t<15;t++);//????????????????? for(t=0;t<10;t++);

    flag=DQ;

    for(t=0;t<200;t++);

    return flag;

    }

    uchar ReadOneChar(void)

    {

    uchar i=0;

    uchar dat;

    for(i=0;i<8;i++)

    {

    DQ=1;

    _nop_();

    DQ=0;

    _nop_();

    DQ=1; //人为拉高,为单片机检测DS18B20的输出电平做准备

    for(t=0;t<3;t++);//延时月9us ????????????????????????? for(t=0;t<2;t++);

    dat>>=1;

    if(DQ==1)

    {

    dat|=0x80;

    }

    else

    dat|=0x00;

    for(t=0;t<1;t++);//延时3us,两个个读时序间至少需要1us的恢复期 ??????????for(t=0;t<8;t++);

    }

    return dat;

    }

    void WriteOneChar(uchar dat)

    {

    uchar i=0;

    for(i=0;i<8;i++)

    {

    DQ=1;

    _nop_();

    DQ=0;

    _nop_();// ??????????????????????????????????????????????

    DQ=dat&0x01;

    for(t=0;t<15;t++);//延时约45us,DS18B20在15~60us对数据采样 ??????????????? for(t=0;t<10;t++);

    DQ=1; //释放数据线

    for(t=0;t<1;t++); //延时3us,两个写时序间至少需要1us的恢复期

    dat>>=1;

    }

    for(t=0;t<4;t++);

    }

    void ReadyReadTemp(void)

    {

    Init_DS18B20();

    WriteOneChar(0xcc);

    WriteOneChar(0x44);

    delaynms(1000); // ?????????????????????????? delaynms(200);

    Init_DS18B20();

    WriteOneChar(0xcc);

    WriteOneChar(0xbe);

    }


    展开全文
  • 温度模块DS18B20

    2020-05-10 15:28:37
    DS18B20 单线数字温度传感器,即“一线器件”,DS18B20的总线只有一根,数据的交换和控制都由这根线完成,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS...

    温度模块DS18B20

    DS18B20简介:
    DS18B20 单线数字温度传感器,即“一线器件”,DS18B20的总线只有一根,数据的交换和控制都由这根线完成,其具有独特的优点:
    ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
    ( 2 )测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
    ( 4 )多个DS1820可以存在于同一.条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测,以及过程监视和控制中的温度检测。
    ( 5 )供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。
    ( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
    DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
    原理图:
    在这里插入图片描述DS18B20的存储形式:
    DS18B20存储的温度值是以补码的形式存储的,所以读出来的温度值是实际温度值的补码,要把的转换为原码。
    正温度的话,原码就是补码本身,所以在12位分辨率下,温度的计算公式是:温度值=读取值*0.0625
    负温度的话,原码是补码减1再取反,所以在12位分辨率下,计算公式为:
    温度值= -(读取值减1再取反)*0.0625

    引脚功能:
    在这里插入图片描述
    DS18B20单总线的工作方式
    (1)DS18B20的初始化
    主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。   做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待
    初始化时序图:
    在这里插入图片描述

    (2)写操作命令
    主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。
    写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线恢复 。而DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
    写操作命令时序图:
    在这里插入图片描述
    (3)读操作命令
    对于读数据操作时序也分为读0时序和读1时序两个过程。
    读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。作为从机DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60微秒才能完成
    读操作命令时序图:
    在这里插入图片描述
    DS18B20的内部存储结构:
    DS18B20的存储器由一个高速暂存RAM和一个非易失性、电可擦除(E2)RAM组成。
    在这里插入图片描述
    在这里插入图片描述

    寄存器:
    在这里插入图片描述
    在这里插入图片描述
    出场设置默认R0、R1为11。也就是12位分辨率,也就是1位代表0.0625摄氏度。
    操作命令
    在这里插入图片描述
    在这里插入图片描述函数程序示例:
    初始化:

    unsigned char Ds18b20Init()
    {
     unsigned int i;
     DSPORT=0;    //将总线拉低480us~960us
     i=70; 
     while(i--);//延时642us
     DSPORT=1;   //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
     i=0;
     while(DSPORT) //等待DS18B20拉低总线
     {
      i++;
      if(i>5000)//等待>5MS
       return 0;//初始化失败 
     }
     return 1;//初始化成功
    }
    
    

    向DS18B20写入一个字节:

    void Ds18b20WriteByte(unsigned char dat)
    {
     unsigned int i,j;
     for(j=0;j<8;j++)
     {
      DSPORT=0;   //每写入一位数据之前先把总线拉低1us
      i++;
      DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
      i=6;
      while(i--); //延时68us,持续时间最少60us
      DSPORT=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
      dat>>=1;
     }
    }

    读取一个字节:

    unsigned char Ds18b20ReadByte()
    {
     unsigned char byte,bi;
     unsigned int i,j; 
     for(j=8;j>0;j--)
     {
      DSPORT=0;//先将总线拉低1us
      i++;
      DSPORT=1;//然后释放总线
      i++;
      i++;//延时6us等待数据稳定
      bi=DSPORT;  //读取数据,从最低位开始读取
      /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
      byte=(byte>>1)|(bi<<7);        
      i=4;  //读取完之后等待48us再接着读取下一个数
      while(i--);
     }    
     return byte;
    }

    开始转化温度命令:

    void  Ds18b20ChangTemp()
    {
     Ds18b20Init();
     Delay1ms(1);
     Ds18b20WriteByte(0xcc);  //跳过ROM操作命令   
     Ds18b20WriteByte(0x44);     //温度转换命令
    // Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
       
    }

    开始读取温度命令:

    void  Ds18b20ReadTempCom()
    { 
     Ds18b20Init();
     Delay1ms(1);
     Ds18b20WriteByte(0xcc);  //跳过ROM操作命令
     Ds18b20WriteByte(0xbe);  //发送读取温度命令
    }

    读取温度:

    int Ds18b20ReadTemp()
    {
     int temp=0;
     unsigned char tmh,tml;
     Ds18b20ChangTemp();     //先写入转换命令
     Ds18b20ReadTempCom();   //然后等待转换完后发送读取温度命令
     tml=Ds18b20ReadByte();  //读取温度值共16位,先读低字节
     tmh=Ds18b20ReadByte();  //再读高字节
     temp=tmh;
     temp<<=8;
     temp|=tml;
     return temp;
    }
    展开全文
  • DS18B20温度传感器实验

    2018-03-03 18:32:54
    关于DS18B20原理电路和原理文件 DS18B20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优点
  • 可以发现DS18B20的可操作口只有一个,一个口的元件我们以下称之为单总线元件,单总线元件显然的优点就是节约MCU的I/O口,可以腾出更多的I/O口给其他原件使用。 但是单总线元件也有缺点,就是操作非常麻烦。假如我们...
  • DS18B20 fpga控制逻辑用verilogHDL进行控制,DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。...
  • ESP8266--驱动DS18B20

    千次阅读 2019-01-15 15:35:45
    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ①、采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干...
  • 针对目前采用的热敏电阻测量方法,提出了采用单总线数字式温度传感器DS18B20和单片机组成的新型温度测量仪。...经试验基于单总线器件DS18B20的温度测量仪,具有测量准确、测温范围宽、体积小、控制方便等优点
  • DS18b20详解

    千次阅读 2015-09-26 09:13:34
    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合...
  • Ds18b20的使用

    万次阅读 多人点赞 2018-05-31 21:22:48
    一、概述:Ds18b20是最常见的数字温度传感器,有着诸多优点,比如:体积小;精度高(12位时精度可以达到0.625摄氏度,出厂默认12位);接线简单,无需外围短路;封装形式多样,能满足不同应用需求等等。但是,“鱼与...
  • DS18B20嵌入式驱动程序

    千次阅读 2019-03-15 10:31:44
    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于...
  • 关于ds18b20程序

    2009-05-05 18:01:55
    DS18B20温度传感器 * * C51 * * yajou 2008-06-28 无CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /**********************...
  • DS18B20温度传感器的Arduino驱动程序

    千次阅读 热门讨论 2018-06-16 15:46:15
    DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。...但是DS18B20不具备DHT11所具有的湿度测量功能,DS18B20优点是精度高(比DHT11...
  • DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于...
  • DS18B20的原理与应用

    千次阅读 2017-07-04 19:52:50
    原文地址:DS18B20的原理与应用作者:黑暗幽灵DS18B20的特点: DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器...
  • atmega16应用之DS18B20温度传感器

    千次阅读 2019-01-08 18:02:20
    DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: (1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合...
  • DS18B20仿真和程序

    2010-08-12 01:35:25
    DS18B20是一个很常用的数字温度传感器,具有电路简单,使用方便等优点(用单片机即可)
  • 摘要:该论文结合实际使用经验,完成了DS18B20数字温度传感器在基于单片机的温度检测系统中的应用。本设计有效的提高了控制系统的实时性改善了温度测量的自动化程度,具有较高的实用价值。该系统可应用于仓库测温、...
  • 【记录】DS18B20的应用电路

    万次阅读 2014-12-12 23:07:12
     DS18B20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优点。下面就是DS18B20几个不同应用方式下的测温电路图: 1.1、DS18B20寄生电源供电方式电路图  如下面图4所示,在寄生电源供电方式下,
  • 该温度控制系统以STC89C52单片机为核心,采用DS18B20数字温度传感器采集温度,并以PWM形式输出,确保温度输出的稳定,再结合PID闭环控制,使系统能够更稳定地运行。先利用Proteus软件结合Keil软件仿真,再用STC89C52...
  • 基于一线总线DS18B20的多点温度监控系统 一线总线是达拉斯公司的专利,生产关于一线总线器件,例如温度传感器ds18b20,简单的说就是用一根总线来实现通讯,当然还需要配合电源vcc和gnd,说白了就是和电源共用一根地线...
  • Onewire单总线驱动DS18B20读取温度

    千次阅读 2020-06-03 18:02:14
    目录标题前言Onewire单总线Onewire单总线通信代码解析DS18B20芯片DS18B20用法代码解析 前言 基于蓝桥杯单片机,以实战为主,详细解析代码,理解原理。 Onewire单总线 1.定义:主机和从机通过1根线进行通信,在一条...
  • DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本文结合实际使用经验,介绍了DS18B20数字温度传感器在...
  • 单总线数字温度传感器DS18B20

    千次阅读 2012-05-31 18:04:29
    DS18B20特点 DS18B20 是单线数字温度传感器,即“一线器件”。...DS18B20具有独特的优点: ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线
  • DS18B20是美国DALLS半导体公司生产的1—WIRE数字温度传感器,它可直接实现数字化输出和测试,具有控制功能强、高精度、传输距离远、抗干扰能力强、微型化和微功耗等特点。为此,介绍了单线数字温度传感器DS18B20的...
  • DS18B20温度测量(1)理论知识

    千次阅读 2013-10-23 16:34:02
    见图 DS18B20与前产品DS1820的不同: DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0--5.5V。2.温度分辨力可编程。3.转换速率有很大提高.4.内部存储器映射关系发生变化。5.具有电源反接保护...
  • 基于DS18B20测温系统解决方案

    千次阅读 2013-08-14 16:15:57
    在工业现场,经常有监测环境温度的需求,本方案应用DS18B20为温度采集芯片,与英创嵌入式主板的GPIO相连,就可以组成完整的测温系统。由于DS18B20每条总线上可以最多接8个测温点,那么英创嵌入式主板至少可以接64个...
  • DALLAS公司的单总线数字温度传感器DSl8B20以其线路简单、硬件...其中,详细介绍了AT89C51对DS18B20的操作流程,及使用DS18B20时候的注意事项。该温度测量系统具有结构简单、价格低廉、扩展方便和应用广泛等一系列优点

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
关键字:

ds18b20优点