精华内容
下载资源
问答
  • ds18b20温度传感器编程指令功能 (1)ROM操作指令: 1. 读ROM指令 :Read ROM [33h] 这个命令允许总线控制器读到DS1820 8 位系列编码、唯一序列号和8 位CRC 码。只有在总线上存在单只DS1820 时候才能使用这个...
  • DS18B20温度传感器.zip

    2020-07-29 09:09:23
    本资源可以实现利用51单片机上面的DS18B20温度传感器模块测量温度后,在单片机的7段数码管上显示温度数值的功能,显示位数为小数点后两位。
  • DS18B20温度传感器的操作

    千次阅读 2019-03-16 10:34:22
    DS18B20 是美信公司一款温度传感器,单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。1-Wire 总线硬件接口很简单,只需要把 DS18B20 数据引脚和单片机一个 IO 口接上就可以了。硬件简单...

    DS18B20 是美信公司的一款温度传感器,单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上就可以了。硬件的简单,随之而来的,就是软件时序的复杂。该温度传感器对时间的精确要求较高。我们所需要用到的功能不多……
    DS18B20主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8+X5+X^4+1)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的(单片机不需要进行ROM匹配)。
    DS18B20采集完温度后,数据以2个字节的形式储存在寄存器中,其中S为符号位
    在这里插入图片描述
    下面是工作时序,根据蓝桥杯的驱动代码进行分析
    首先是初始化
    在这里插入图片描述1-Wire 总线开始前需要检测这条总线上是否存在 DS18B20这个器件。如果这条总线上存在 DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平,所以习惯上称之为检测存在脉冲。此外,获取存在脉冲不仅仅是检测是否存在 DS18B20,还要通过这个脉冲过程通知 DS18B20准备好,单片机要对它进行操作了。
    实粗线是我们的单片机 IO 口拉低这个引脚,虚粗线是 DS18B20 拉低这个引脚,细线是单片机和 DS18B20 释放总线后,依靠上拉电阻的作用把 IO 口引脚拉上去。51 单片机释放总线就是给高电平。
    具体操作时序为:单片机拉低IO口-----单片机拉高-----检测IO口是否有低电平返回
    然后就是注意时间了……

    //DS18B20设备初始化
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	EA=0;					//最好将中断关闭					
      	DQ = 1;					//DQ为芯片与单片机相连的IO口
      	Delay_OneWire(12);
      	DQ = 0;
      	Delay_OneWire(80);
      	DQ = 1;
      	Delay_OneWire(10); 
        initflag = DQ;     
      	Delay_OneWire(5);
      	EA=1;
      	return initflag;
    }
    

    下面是写和读的操作
    在这里插入图片描述
    首先是写
    写0的话,单片机直接拉低就可以了,DS18B20 会在从 15us 到 60us 之间的时间来读取这一位。
    写1的话,单片机需要先拉低,拉低时间需大于1us,然后再拉高,DS18B20 会在从 15us到 60us 之间的时间来读取这一位。

    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	EA=0;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;		//从低位开始写
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    	EA=1;
    }
    

    然后是读
    当要读取 DS18B20 的数据的时候,我们的单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。

    //从DS18B20读取一个字节
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
      	EA=0;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;			//先接受低位
    		DQ = 1;
    		if(DQ)
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	EA=1;
    	return dat;
    }
    

    最后便是操作的DS18B20的一些指令:
    跳过ROM匹配:
    在这里插入图片描述
    启动温度转换:在这里插入图片描述
    读取温度(注意先读到的是低字节的数据)
    在这里插入图片描述(针对蓝桥杯的驱动的修改……)

    //单总线延时函数
    void Delay_OneWire(unsigned int t)  
    {
    	unsigned char i;
    	while(t--)
    	{
    		for(i=0;i<8;i++);		//新加,延时8倍
    	}
    }
    

    在读取温度时的具体操作如下
    (1)初始化
    (2)跳过ROM匹配
    (3)发送温度转换指令
    (4)初始化
    (5)跳过ROM匹配
    (6)发送读取温度指令
    (7)依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。
    代码如下:

    //读取温度的集体操作
    void ReadTemp_DS18B20()
    {
    	uchar TH,TL;
    	
    	init_ds18b20();
    	Write_DS18B20(0xcc);	
    	Write_DS18B20(0x44);
    	
    	init_ds18b20();
    	Write_DS18B20(0xcc);
    	Write_DS18B20(0xbe);
    	
    	TL=Read_DS18B20();
    	TH=Read_DS18B20();
    	
    	Temp=(TH<<4)|(TL>>4);
    }
    

    经实验,可以读取温度值

    Reference
    https://blog.csdn.net/FunkyFrog821951259/article/details/56479880
    http://bbs.21ic.com/icview-2478740-1-1.html
    DS18B20datasheet

    展开全文
  • 名称:《利用FPGA实现与ds18b20温度传感器的通信》 内容:解析上位机下发的ascii码指令和数据,控制ds18b20传感器完成温度值的采集、实现温度值ascii码的实时上传、数码管同步显示以及越界报警功能 难点与创新...

    名称:《利用FPGA实现与ds18b20温度传感器的通信》

     

    内容:解析上位机下发的ascii码指令和数据,控制ds18b20传感器完成温度值的采集、实现温度值ascii码的实时上传、数码管同步显示以及越界报警功能

    难点与创新:上位机与FPGA通过ascii码通信、参数表配置和实现、底层时序实现和温度值换算、数码管和上位机实时动态显示温度值

    DS18B20为单线接口,功能操作为1bit的复位、读和写、本工程完成以下几个功能:

    1. 上位机串口发送ascii码与FPGA进行通信
    2. 实现DS18B20的温度值采集并通过数码管和上位机实时显示
    3. 限定值范围外报警功能
    4. 采用无缓存的rdy交互方式

    功能说明:

    1. 时序—>复位:复位工作周期为1000us,0~750us之间拉低总线电平,关闭输出三态,完成复位;写1bit:写工作周期为62us,开始拉低,在15us的时候决定写入点平,在60us关闭输出三态使能;读1bit:读工作周期为62us,在开始1us拉低,1us后关闭输出三态使能,在14us处采集输入数据。
    2. uart_rx模块以二进制方式接收上位机下发的指令,通过ascii2hex将其转化为对应的ascii码传递给opcode_dect,后模块对输入数据帧进行判断,如果是55D5,则将后面的2字节命令码+数据码组帧发送给control。control模块完成指令的判断将需要发送的命令码+数据传递给ds_intf_byte,ds_intf_byte将字节转化为bit数据传递给ds_intf_bit,后模块完成底层协议,协议参考“1”。而control控制读取温度值时,将温度值一方面通过数码管显示一方面通过串口上传上位机,一方面报警判断。
    3. 各模块详解:
      1. uart_rx模块:将输入9600bps的串行数据转化为8bit数据输出,并输出一个时钟周期的高电平标志位。
      2. ascii2hex模块:将输入的8bit数据转化为ascii码,输出为4bit数据和dout_vld,节,参考ascii码表其原理是一个ascii码对应一个字
      3. opcode_dect模块:判断数据的数据帧是否是0x55d5,如果是那么就将后面的2字节数据输出,并拉高两个dout_vld。
      4. control模块:对输入第一字节的命令码和第二字节的数据进行处理,如果收到了复位命令,则在第二字节接收完成后拉高复位使能一个时钟周期,如果收到了写命令,则将写使能拉高一个时钟周期,同时将写数据赋值给写寄存器;如果是读命令,则将读使能拉高一个时钟周期,根据读取温度值低位、高位、其他信息的不同,等待输入的数据标志位有效,将数据缓存到不同的寄存器;另外还有就是打开数码管显示命令,使能打开;设定温度上下限,将寄存器复制给相应温度上下限寄存器;开始温度值计算命令,高5位为符号位,[10:4]为温度值整数,右移4位(相当于*0.0625),[3:0]为小数,需要*0.0625*10000得到各个整数和小数位数据,组帧数据得到temp_uns;如果是数据上传命令,那么将上传7字节数据,数据帧格式为ds_uns_temp = {(8'h2b+temp_uns[31]*2),{4'b0,temp_uns[27:16]},8'h2e,temp_uns[15:0],8'h0a};

    其中+的十进制比-号的十进制小2,0x2e是小数点,0x0a是回车的十六进制数。需要注

    意的是,这里的0x2e已经是小数点的十六进制数,不需要转化了,而温度值temp_uns

    显示的是ascii码,是需要先转化为16进制数。

      1. seg_disp模块:数码管20us扫描每一根管子,每一根管子对应的显示都不同,跟数字对应,就是温度值的ascii码。
      2. ds_inft_byte模块:只要下游rdy==1,输入了读/写/复位使能信号,则将位使能拉高一个时钟周期,写使能和读使能都会启动8位的数据计数器。这里能够做到一次发送一位,时间间隔由下游决定是因为在下游rdy在使能一打开,立马就清零了,组合逻辑,所以每次只有等到下游模块处理完数据,拉高rdy,本模块才能发送和接收1bit数据。
      3. ds_intf_bit模块:会在读写复位使能来临时,首先rdy==0,然后开始本模块工作流程,实现时序参考上述功能说明的时序说明。本模块与底层ds18b20直接交互。
      4. hex2ascii模块:用到了一个FIFO,由于din和din_vld可能在rdy==0的时候送过来,而此时串口还在发送数据,因此本模块需要一个FIFO缓存din的值。FIFO先进先出,因此以h2a_en进制转化使能+4bit数据,以din_vld作为写使能,写入FIFO,读使能是下游准备好,而且不为空就打开读使能,需要注意的是,由于ascii进制转为16进制,4bit会直接转化位8bit,但是如果不需要转化,那么情况是:需要转换的数据会变成一个字节,不需要转换的数据需要两次读使能才能变成一个字节。在uart_tx模块只需要注意串口数据是低位在前,高位在后,先发送起始位低电平,最后发送停止位高电平即可。
    • 技术难点:
      1. FPGA与上位机的通信方式
      2. 参数表的配置方式
      3. 模块化设计之中枢控制模块control的内部功能协调方式(核心rdy标志的使用)
        1. 外设架构:命令模块 + 接口模块 + 外设,如果外设需要配置,则命令模块需要参数表,参数表中比如:{2’b01,8’hxx},其中0代表读使能关闭,1代表写使能打开,后面跟着是数据。
        2. 模块划分:一个架构(功能)一个模块、信号规范:多少个vld就代表多少个有效数据、eop和vld同时有效代表是整个包文错误、esp和vld同时有效代表是包文头
        3. 常用架构:
          1. 直接交互:不需要下游反馈
          2. 无缓存交互:下游rdy反馈
          3. 有缓存交互:下游有FIFO,快存满时才将rdy拉低
          4. 请求应答交互:req请求,一直等到ack应答才发送数据给下游
      4. Ds18b20数据手册时序解读和实现,包含读写时序和温度值转化关系的代码实现
      5. 数码管的动态显示
    展开全文
  • STM32 DS18B20温度传感器实验(HAL库)

    千次阅读 2021-02-08 11:25:09
    DS18B20温度传感器实验(HAL库)实验摘要DS18B20简述STMCubeMX引脚配置芯片选型引脚和时钟配置生成ARM-MDK工程编写DS18B20驱动文件新建工程项目组编写DS18B20.c写时序读时序读取温度编写DS18B20.h主程序实现功能...

    实验摘要

    本文主要关于如何用STM32系列单片机驱动DS18B20温度传感器实现温度的串口打印显示,本实验中STM32基于HAL库开发。本文全程记录实验过程,手把手教大家基于STM32的DS18B20温度采集实验。

    DS18B20简述

    首先,我们拿到DS18B20之后进行观察。
    DS18B20
    该器件只有3个引脚,分别为电源端VCC,地GND和数据线DQ。只有一条数据线,说明该器件是单总线器件。单总线器件好处是只占用一个单片机的一个I/O口。
    DS18B20通信协议通过查阅DS18B20中文资料获得,该部分将在驱动文件编写部分详细讲解。

    STMCubeMX引脚配置

    本文使用STMCubeMX软件进行引脚和时钟的配置

    芯片选型

    芯片选型
    本文选择STM32L431RC系列,根据自己的芯片选择。

    引脚和时钟配置

    引脚配置
    引脚主要配置外部时钟输入输出口,串口通信USART1用于打印温度数据,传感器数据DQ接口(此处使用PA5)。时钟配置
    将HCLK配置为80MHz。
    工程管理
    工程管理,设置项目名称和保存路径,选择MDK-ARM V5。
    代码生成
    Code Generator中建议勾选Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral,为每个外设生成独立的.c文件。

    生成ARM-MDK工程

    点击GENERATE CODE生成ARM-MDK工程。

    编写DS18B20驱动文件

    新建工程项目组

    项目组
    单击红圈出现项目组
    这里可以自行添加文件管理项目结构,清晰明了。这里我们可以在Group新建一个文件夹Hardware用于存放DS18B20的驱动文件。(DS18B20.CDS18B20.h
    接着在文件夹Hardware中添加DS18B20.CDS18B20.h

    编写DS18B20.c

    DS18B20中文资料
    链接: https://pan.baidu.com/s/1k060r4s_5XI1R9r00jDP2g 提取码: nmr4 .
    首先写一个粗略的微秒延时函数,用于单线协议中的延时。

    /****************************************************************************
    函数名:delay_us
    功能:微秒级延时
    输入:延时数据
    输出:无
    返回值:无
    备注:
    ****************************************************************************/
    void delay_us(uint32_t time)
    {
      time *= 10;
    	while(time)
    		time--;
    }
    

    初始化

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

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

    我们需要配置引脚为输入或输出模式,需要两个函数。
    发送复位信号和检测存在脉冲两个函数。
    引脚输入输出配置函数参考gpio.c中的void MX_GPIO_Init(void)函数编写。

    /****************************************************************************
    函数名:DS18B20_IO_IN
    功能:使DS18B20_DQ引脚变为输入模式
    输入:无
    输出:无
    返回值:无
    备注:DQ引脚为PA5
    ****************************************************************************/
    void DS18B20_IO_IN(void){
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.Pin = GPIO_PIN_5;
    	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
    }
    
    
    /****************************************************************************
    函数名:DS18B20_IO_OUT
    功能:使DS18B20_DQ引脚变为推挽输出模式
    输入:无
    输出:无
    返回值:无
    备注:DQ引脚为PA5
    ****************************************************************************/
    void DS18B20_IO_OUT(void){
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.Pin = GPIO_PIN_5;
    	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
    }
    
    
    /***************************************************************************
    函数名:DS18B20_Rst
    功  能:发送复位信号
    输  入: 无
    输  出:无
    返回值:无
    备  注:
    ***************************************************************************/
    void DS18B20_Rst(void){
    	DS18B20_IO_OUT();//引脚输出模式
    	
    	//拉低总线并延时750us
    	DS18B20_DQ_OUT_LOW;
    	delay_us(750);     
    	
    	//释放总线为高电平并延时等待15~60us
    	DS18B20_DQ_OUT_HIGH;
    	delay_us(15);
    }
    	
    
    /***************************************************************************
    函数名:DS18B20_Check
    功  能:检测DS18B20返回的存在脉冲
    输  入: 无
    输  出:无
    返回值:0:成功  1:失败   2:释放总线失败
    备  注:
    ***************************************************************************/
    uint8_t DS18B20_Check(void){
    	//定义一个脉冲持续时间
    	uint8_t retry = 0;
    	//引脚设为输入模式
    	DS18B20_IO_IN();
    	while(DS18B20_DQ_IN && retry < 200){
    		retry++;
    		delay_us(1);
    	}
    	
    	if(retry >= 200)
    		return 1;
    	else
    		retry = 0;
    	
    	//判断DS18B20是否释放总线
    	while(!DS18B20_DQ_IN && retry < 240){
    		retry++;
    		delay_us(1);
    	}
    	
    	if(retry >= 240)
    		return 2;
    	
    	return 0;
    }
    

    写时序

    写时序

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

    /***************************************************************************
    函数名:DS18B20_Write_Byte
    功  能:向DS18B20写一个字节
    输  入: 要写入的字节
    输  出:无
    返回值:无
    备  注:
    ***************************************************************************/
    void DS18B20_Write_Byte(uint8_t data){
    	uint8_t j;
    	uint8_t databit;
    	DS18B20_IO_OUT();
    	for(j=1;j<=8;j++){
    		databit=data&0x01;//取数据最低位
    		data=data>>1;     //右移一位
    		if(databit){      //当前位写1
    			DS18B20_DQ_OUT_LOW;
    			delay_us(2);
    			DS18B20_DQ_OUT_HIGH;
    			delay_us(60);
    		}else{          //当前位写0
    			DS18B20_DQ_OUT_LOW;
    			delay_us(60);
    			DS18B20_DQ_OUT_HIGH;
    			delay_us(2);
    		}
    	}
    }
    
    

    读时序

    读时序

    /***************************************************************************
    函数名:DS18B20_Read_Bit
    功  能:向DS18B20读一个位
    输  入: 无
    输  出:无
    返回值:读入数据
    备  注:
    ***************************************************************************/
    uint8_t DS18B20_Read_Bit(void){
    	uint8_t data;
    	DS18B20_IO_OUT();
    	DS18B20_DQ_OUT_LOW;
    	delay_us(2);
    	DS18B20_DQ_OUT_HIGH;
    	DS18B20_IO_IN();
    	delay_us(12);
    	
    	if(DS18B20_DQ_IN)
    		data = 1;
    	else
    		data = 0;
    	
    	delay_us(50);
    	return data;
    }
    
    
    /***************************************************************************
    函数名:DS18B20_Read_Byte
    功  能:向DS18B20读一个字节
    输  入: 无
    输  出:无
    返回值:读入数据
    备  注:
    ***************************************************************************/
    uint8_t DS18B20_Read_Byte(void){
    	uint8_t i,j,data;
    	data = 0;
    	for(i=1;i<=8;i++){
    		j = DS18B20_Read_Bit();
    		data = (j<<7)|(data>>1);
    		/*j=0或1,j<<7=0x00或0x80,和data右移一位相或,即把1/0写入最高位,下次再往右移位*/
    
    	}
    	return data;
    }
    
    

    读取温度

    基本时序操作已经完成,再根据资料中的ROM命令编写DS18B20的启动函数。由于我们只使用一个DS18B20,所以可以直接跳过ROM。

    DS18B20的ROM指令集

    在这里插入图片描述

    存储器指令

    在这里插入图片描述
    用到的指令

    指令名称 指令代码
    跳过ROM 0xCC
    温度变换 0x44
    读暂存器 0xBE
    /***************************************************************************
    函数名:DS18B20_Start
    功  能:DS18B20开启
    输  入: 无
    输  出:无
    返回值:无
    备  注:
    ***************************************************************************/
    void DS18B20_Start(void){
    	DS18B20_Rst();
    	DS18B20_Check();
    	DS18B20_Write_Byte(0xcc);//跳过ROM
    	DS18B20_Write_Byte(0x44);//温度变换命令
    }
    
    
    /***************************************************************************
    函数名:DS18B20_Init
    功  能:DS18B20初始化
    输  入: 无
    输  出:无
    返回值:无
    备  注:
    ***************************************************************************/
    uint8_t DS18B20_Init(void){
    	//引脚初始化
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.Pin = GPIO_PIN_5;
    	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    	GPIO_InitStructure.Pull = GPIO_PULLUP;
    	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
    	
    	DS18B20_Rst();
    	return DS18B20_Check();
    }
    
    /***************************************************************************
    函数名:DS18B20_Read_Temperature
    功  能:读取一次温度
    输  入: 无
    输  出:无
    返回值:读取到的温度数据
    备  注:适用于总线上只有一个DS18B20的情况
    ***************************************************************************/
    short DS18B20_Get_Temperature(uint8_t a){
    	uint8_t temp;
    	uint8_t TL,TH;
    	short temperature;
    	
    	DS18B20_Start();
    	DS18B20_Rst();
    	DS18B20_Check();
      DS18B20_Write_Byte(0xcc);//跳过ROM
    	DS18B20_Write_Byte(0xbe);//读暂存器
    	TL = DS18B20_Read_Byte();//低八位
    	TH = DS18B20_Read_Byte();//高八位
    	
    	//判断温度值是否为负数
    	if(TH>0x70){
    		TH = ~TH;
    		TL = ~TL;
    		temp = 0;
    	}else
    		temp = 1;
    	
    	temperature = TH;
    	temperature <<= 8;
    	temperature += TL;
    	temperature = (float)temperature*0.625;
    	if(temperature)
    		return temperature;
    	else
    		return -temperature;
    }
    

    在DS18B20.c开头包含头文件#include "DS18B20.h"

    #include "DS18B20.h"
    

    编写DS18B20.h

    #include "stm32l4xx_hal.h"
    #include "main.h"
    #define  DS18B20_DQ_OUT_HIGH       HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET)
    #define  DS18B20_DQ_OUT_LOW        HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET)
    #define  DS18B20_DQ_IN             HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin)
    

    头文件中要包含hal库头文件#include "stm32l4xx_hal.h"#include "main.h"
    定义三个引脚操作函数。

    主程序实现功能

    用户包含

    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "DS18B20.h"
    /* USER CODE END Includes */
    

    函数声明

    /* USER CODE BEGIN PFP */
    uint8_t DS18B20_Init(void);
    short DS18B20_Get_Temperature(void);
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 1 */
     float temperature;
    /* USER CODE END 1 */
    
    /* USER CODE BEGIN 2 */
      while(DS18B20_Init()){
    	printf("DS18B20 checked failed!!!\r\n");
    	HAL_Delay(500);
    	}
    	printf("DS18B20 checked success!!!\r\n");
      /* USER CODE END 2 */
    
    /* USER CODE BEGIN 3 */
        temperature = DS18B20_Get_Temperature();
    		if(temperature < 0)
    		printf("temperature = -%.2f degree\r\n",temperature/10);
    		else
    		printf("temperature = %.2f degree\r\n",temperature/10);
    		HAL_Delay(200);}
      /* USER CODE END 3 */
    

    重定向printf函数

    在usart.c中添加printf重定向函数,该函数在不同信号芯片可能有不同。

    #if 1
    #include <stdio.h>
    
    int fputc(int ch, FILE *stream)
    {
        /* 堵塞判断串口是否发送完成 */
        while((USART1->ISR & 0X40) == 0);
    
        /* 串口发送完成,将该字符发送 */
        USART1->TDR = (uint8_t) ch;
    
        return ch;
    }
    #endif
    

    包含头文件路径

    单击魔法棒图标在这里插入图片描述
    选择C/C++,在include path中添加文件路径。在这里插入图片描述
    >>New(Insert)>>
    在这里插入图片描述
    选择DS18B20.c和DS18B20.h的路径。
    在这里插入图片描述

    编译项目并下载到硬件中

    连接硬件线路

    在这里插入图片描述
    三条线路,连接之后DS18B20模块电源指示灯亮起。

    检验结果

    烧录程序,并打开串口助手,这里推荐win10应用市场的串口调试助手,可以免费下载。
    在这里插入图片描述
    我们看到温度数据可以被读取出来,可以用手捂一下传感器看温度是否有变化。实验完成!

    总结

    该实验完成了对DS18B20温度传感器的使用,主要重点是对单总线器件通信时序的学习,掌握了单总线器件时序的原理可以帮助我们使用其他的器件。

    展开全文
  • DS18B20温度传感器 英文资料 其中叙述了18b20的功能、原理和应用等。
  • 关于DS18B20温度传感器的时序详解及代码分析

    万次阅读 多人点赞 2016-02-26 00:00:46
    关于DS18B20温度传感器的时序详解及代码分析简要说明测温工作**:**DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量 ...

    关于DS18B20温度传感器的时序详解及代码分析

    简要说明测温工作**:**DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量
    递增。在上电状态下默认的精度为12位(所以最后获取的数据要乘以0.0625得到实际温度)。DS18B20启动后保持低功耗等待状态;
    当需要执行温度测量(和AD转换)时,总线控制器必须发出[44h]命令。在那之后,
    产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中(所以后期获取数据时,必须连续读取两次数据),下面介绍时序及相应代码(以12MHz的晶振为例,数据线定义为DQ)
    ,其中DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的,并采用的是单总线协议。
    操作顺序:初始化——>写相应的控制指令(用写数据函数完成)——>读取DS18B20所采集到的数据(用读数据函数完成)———>把采集的数据转化成实际的温度。

    延时函数: (15+15*z)us 的延时

    void delay_us(uint z)
    {
        for(z;z>0 ; z--)
        {
            _nop_();    _nop_();
            _nop_();    _nop_();
        }   
        _nop_();    _nop_();
    }

    *时序图及代码分析如下:*

    一、初始化(见下图)

    在初始化序列期间,总线控制器拉低总线并保持480us(改延时可以在480~960us之间,但需要在480us以内释放总线)以发出一个复位脉
    冲,然后释放总线,进入接收状态(等待DS18B20应答)。总线释放后,单总线由上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后其以拉低总线60-240us的方式发出存在脉冲。至此,初始化时序完毕。
    这里写图片描述

    初始化代码:
    带返回值,有利于检验。

    bit DS18B20_init()
    {
        bit ack = 1;
        DQ = 0;         //主机拉低总线
        delay_us(32);   //延时495us
        DQ = 1//释放总线,同时IO口产生的上升沿能被DS18B20所检测到
        delay_us(4);    //延时大于60us,确保接下来DS18B20能发出60~240us的存在脉冲应答
        ack = DQ;      //在此60~240us之内DQ被DS18B20所占用,若存在,则其会发送一个低电平信号,DQ被DS18B20拉低,则ack为0,反之为1
        delay_us(15);  //延时达240us,让DS18B20释放总线
        DQ = 1return(ack);
    }

    初始化代码写至此,其实我们便可以用数码管显示来检验初始化是否成功(即DS18B20有应答),数码管显示”0“,初始化失败,显示”1“,则初始化成功。

    二、DS18B20的写时序(见下图):
    主机在写时隙向DS18B20写入数据,其中分为写”0”时隙,和写”1”时隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。两种写时隙都通过主机拉低总线产生(见下图)为了产生写1时隙。
    在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于上拉电阻将总线恢复为高电平。为了产生写”0”时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。
    在主机产生写时隙后,DS18B20会在其后的15~60us的一个时间段内采样单总线(DQ)。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。
    综上所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

    这里写图片描述

    DS18B20的写时序代码
    写字节函数、由低位至高位,向DS18B20写入一个字节的数据。
    无返回值。
    形参byte是待写入的字节数据,读取8次,移位8次,保证每位都传输至DQ

    void DS18B20_write_byte(uchar byte)
    {
        uchar i;
        for(i=0 ; i<8 ; i++)
        {
            DQ = 0;           //拉低总线,产生写时隙
            _nop_();
            _nop_();          //大于1us的延时
            DQ = 1;           //15us之内释放总线
            _nop_();
            _nop_();          //适当延时
            DQ = byte & 0x01; //将字节低位写入单总线
            delay_us(3);      //在15~60us内等待DS18B20来采集信号
            DQ = 1//释放总线
            byte >>= 1;       //每次讲要读取的数据位移至最低位,
        }
    }

    三、DS18B20的读时序(见下图)
    主机发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[0xBE]或读电源模式指令[0xB4]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[0x44] (或召回EEPROM指令[0xB8])之后读时序,详见DS18B20 的芯片手册上的功能指令。
    所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。DS18B20 通过拉高或拉低总线上来传输”1”或”0”。当传输逻辑”0”结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us 内有效。因此,总线控制器在读时序开始后必须停止把I/O口驱动为低电15us,以读取I/O口状态。

    这里写图片描述

    DS18B20的读时序的代码
    读字节函数、由低位至高位,读取DS18B20所采集到的数据。
    带返回值,可结合前面的写时序,对写、读数据函数进行检验(后面会提到检验过程及效果)
    byte 是读取到的字节数据。其中,此函数读取8次,移位7次(实际移位8次)

    uchar DS18B20_read_write()
    {
        uchar i;
        uchar byte;         //byte为要接收到的数据
        for(i=0 ; i<8 ; i++)
        {
            DQ = 0;         //产生读时序
            _nop_();
            _nop_();        //简单延时
            DQ = 1//释放总线,有从机DS18B20占用
            byte >>= 1;     //先进行移位
            if(DQ)          //让DS18B20占用总线,发出采集到的信号
                byte |= 0x80;  //若DQ=1,则让当前byte最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。以上操作15us以内完成
            delay_us(3);    //延时60us
            DQ = 1//释放总线
            _nop_(); 
        }
    }

    下面简单说说如何检验写、读时序的程序:
    检验写、读的程序,本人采用DS18B20中特有的64位光刻ROM存储器(其中涉及一些指令,具体请见芯片的数据手册)。数据手册上说明,“64位光刻ROM的排列是:开始(最低)8位是产品类型标号,对于DS18B20来说都是(28H),接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

    这里写图片描述

    因为写函数刚好是从最低位开始读,所以我们先:
    调用函数:DS18B20_write_byte(0xcc);
    接着再调用函数:DS18B20_read_byte();
    用数码管,或者液晶,将读函数的返回值显示出来,正确的显示应该为:40。
    这样,我们便能确定我们的写,读函数的正误了。

    展开全文
  • DS18B20温度传感器

    2021-04-29 00:45:03
    DS18B20是一种常见数字温度传感器 ,他控制命令和数据都是以数字信号方式输入输出,相比较于模拟温度传感器具有功能强大,硬件简单 ,抗干扰性强等特点 。 2.测温范围 -55℃到128℃ 3.其他特征 可形成总线结构...
  • DS18B20温度传感器 选用芯片:AT89S52 函数功能:如下 /************************************************************************* 此程序功能如下:此程序为DS18B20使用程序。将DS18B20温度值读取出来,并显...
  • DS18B20温度传感器的Arduino驱动程序

    千次阅读 热门讨论 2018-06-16 15:46:15
    DS18B20是常用数字温度传感器,其输出是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高特点。前几天有位朋友让我帮忙写个DS18B20的Arduino驱动程序,忙了一个小时,终于成功了。对比DS18B20与...
  • ds18b20温度传感器

    2012-12-26 22:58:00
    本文以单片机AT89S52为核心的,从硬件和软件两个方面设计实现温度显示报警系统,报警...本系统采用DS18B20采集现场温度,用LED数码管显示温度值,并可根据需要设置控制温度的上限,系统具有超过设置上限自动报警的功能
  • DS18B20温度传感器程序

    2011-08-26 17:02:58
    温度传感器程序,利用DS18B20进行温度测量程序,可以在此基础上惊醒功能扩充,有什么不懂可以问我
  • 基于51单片机的ds18b20温度传感器实现水温控制系统,1602液晶显示,矩阵键盘设置用户温度,具有温度提示,温度报警功能
  • DS18B20是1-write总线。这种总线其实还是比较方便。这个芯片使用注意事项就是要严格按照事件序列来。 1、发送一个初始化命令(复位脉冲) 2、发送ROM命令 3、发送功能命令 其实rom命令主要是用来识别不同设备...
  • /**********************************...程序功能:利用单线制DS18B20温度传感器 LED数码管显示当前温度值 ********************************************/ #include <reg51.h> //DS18B20温度传感器程序...
  • DS18B20温度传感器-51单片机控制程序

    千次阅读 2019-12-11 21:47:20
    DS18B20数字温度传感器提供9-Bit到12-Bit摄氏温度测量精度和一个用户可编程非易失性且具有过温和低温触发报警报警功能DS18B20采用1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据...
  • 认识管脚 认识唯一标示64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化,还有9.、10等其他位转化...DS18b20de RAM指令表,用于发送对应代码值来触发某一温度存储功能 DS18b20初始化时序...
  • DS18B20温度传感器(单线通讯,严格按照时序图) 特点: 1、电压范围:3.0v~5.5V 2、独特单线接口,仅需一条串口线即可实现微处理器与DS18B20双向通讯; 3、支持电组网功能,实现组网多点测温 4、不...
  • 实验20:DS18B20温度传感器实验

    千次阅读 2020-04-20 18:07:07
    一、介绍 独特单总线接口方式,DS18B20在与微... 支持多点组网功能,多个DS18B20可以并联在唯一三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输不稳定。 ...
  • 总结:如何驱动DS18B20温度传感器

    千次阅读 2016-04-04 18:32:13
    最近在智能小车上加了实时温度检测的功能温度传感器DS18B20使用还是非常简单的,没有特别难的地方,但是对于初学者来说看懂时序图是第一件要做的事,我们先来看看介绍: DS18B20时序分析: 对于这样的...
  • DS18B20有三个引脚,其中两个引脚接入电源。单片机通过对第三个引脚进行高低电平输入和输出实现数据传输。 下面是DS18B20常用指令表,第三个引脚在接收到相应数据后能够制做出对应响应。 代码 功能 ...
  • 【1】本设计中以温度探头和作为传感装置,并以LED和蜂鸣器作为示警装置。二、功能●高温检测。传感器选用,当环境温度大于40℃,高温报警指示灯亮,LCD1602行显示温度。●环境烟雾浓度检测。传感器选用MQ2烟雾...
  • VERILOG设计FPGA接收串口UART发来指令设定温度报警值,实时采集DS18B20温度传感器并显示输出,完整QUARTUS 工程文件,FPGA芯片为CYCLONE4E系列中EP4CE15,可以做为你设计参考。
  •  ●对DS18B20的每次操作包括三步○初始化ROM命令功能命令常用ROM命令:0XCC 跳过ROM常用功能命令:0X44 转换温度和0XBE 读暂存器读取温度时数码管会闪烁原因消除85显示12位分辨率精度为0.0625,最大转换时间为...
  • Dht11与Ds18b20温度传感器使用

    千次阅读 2017-11-23 20:18:26
    说说使用感想DS18B20不愧是大厂的传感器功能丰富,但使用起来确实有点麻烦。 DHT11应该就是国产模仿吧,功能简单,没有唯一标识码,没有RAM,没有报警等等功能。 对照手册编写逻辑代码问题不大,关键就是STM32 ...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新改变功能快捷键合理创建标题,有助于目录生成如何改变文本样式插入链接与图片如何插入一段漂亮代码片生成一个适合你列表创建一个表格设定内容居中、居左、...
  • 该数字温度传感器接线方便,封装后可应用于多种场合,如管道式螺纹式磁铁吸附式不锈钢封装式等一系列主要根据应用场合不同而改变其外观封装后可用于电缆沟测温高炉水循环测温锅炉测温机房测温农业大棚测温等测温...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513
精华内容 205
关键字:

ds18b20温度传感器的功能