基于stm32f103zet6之DS18B20的学习

发布者:GoldenSerenity最新更新时间:2017-09-06 来源: eefocus关键字:stm32f103zet6  DS18B20 手机看文章 扫描二维码
随时随地手机看文章

任何一个DS18B20其内部64位ROM用于存储位移的芯片ID(这就为我们的多点采集提供了极大的方便),我使用3pin封装的芯片,值得注意的是:DS18B20使用一根数据线一根地线也能正常工作,也就是VCC并不是必须的,什么原因呢?因为DS18B20在内部有一个寄生电容,当我们的数据线的电压范围在3.3--5V之间的时候,他会转存为power,所以当我们外部断电之后,这个power就为IC提供了电源,这很好的起到了一个节能的作用。。

还有一些其他的特点总结如下:

--全数字温度转换及输出。
-- 先进的单总线数据通信。
--最高12位分辨率,精度可达土0.5摄氏度。
--12位分辨率时的最大工作周期为750毫秒。
--可选择寄生工作方式。
--检测温度范围为–55°C ~+125°C (–67°F ~+257°F)
--内置EEPROM,限温报警功能。
--64位光刻ROM,内置产品序列号,方便多机挂接。
--多样封装形式,适应不同硬件系统。

一、硬件介绍

1、首先看一看DS13B20的整体框图

总结一下我自己对这几个部分的理解:

1、电源检测用于检测是外部提供电源还是使用数据线转换的power

2、64为ROM用于读取芯片ID

3、温度灵敏元件用于DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位

4、接下来就是高低温触发器了,

5、还有配置寄存器,配置寄存器是配置不同的位数来确定温度和数字的转化。配置寄存器的结构格式如下

R1、R2与控制器分辨率关系如下:

测温操作 DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。

所以能够很清楚的看到转换位数和转换时间之间的关系。

温度寄存器的格式如下:


二、接下来看看如何控制这个芯片

a、协议:

单总线串行通信协议,这个与普通的spi协议有一点点区别

b、操作流程:一下操作流程是我参照网上的,写的比较容易理解

1,复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。
 
2,存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。
 
3,控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B20芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。ROM指令在下文有详细的介绍。
 
4,控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。
 
5,执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。数据的读写方法将有下文有详细介绍。
 
若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。其它的操作流程也大同小异,在此不多介绍。

除此之外,还有一篇文章或许能够解决你的一些关于DS13b20的疑惑,这是我在百度空间转载过来的

http://blog.csdn.net/king_bingge/article/details/8808631好的,如果读完了这篇文章,那么下面对代码进行分析也不成问题了

三、代码分析

1、首先是一段获取温度的主代码


  1. /************************************************************************************** 

  2. * 名    称: DS18B20_Get_Temp 

  3. * 功    能: 从ds18b20得到温度值,精度:0.1C 

  4. * 参    数: 无 

  5. * 返 回 值: 温度值 (-550~1250)  

  6. **************************************************************************************/  

  7. short DS18B20_Get_Temp(void)  

  8. {  

  9.     u8 temp;  

  10.     u8 TL,TH;  

  11.     short tem;              //2bytes  

  12.     DS18B20_Start ();                   // ds1820 start convert  

  13.     DS18b20_Reset();  

  14.     DS18B20_Check();       

  15.     DS18B20_Write_Byte(0xcc);       // skip rom  

  16.     DS18B20_Write_Byte(0xbe);       // convert        

  17.     TL=DS18B20_Read_Byte();             // LSB     

  18.     TH=DS18B20_Read_Byte();             // MSB    

  19.                   

  20.     if(TH>7)             //判断正负  

  21.     {  

  22.             TH=~TH;  

  23.             TL=~TL;   

  24.             temp=0;         //温度为负    

  25.     }else temp=1;               //温度为正          

  26.     tem=TH;                 //获得高八位  

  27.     tem<<=8;      

  28.     tem+=TL;                //获得低八位  

  29.     tem=(float)tem*0.625;           //转换       

  30.     if(temp)return tem;             //返回温度值  

  31.     else return -tem;      

  32. }   

说道读取温度就得看看这个表了



下面的就是一个官方的示例表,说明了我们转换的时候要注意的地方


注意精度上电默认的12位的。那么如何确定精度的呢?我问了我一个学长,是这样解释的,小数部分是4位,那么最小分辨率就是2的4次方分之一

也就是1/16. = 0.0625

2、开始信号


  1. /************************************************************************************** 

  2. * 名    称: DS18B20_Start 

  3. * 功    能: 开始信号 

  4. * 参    数: 无 

  5. * 返 回 值: 无  

  6. **************************************************************************************/  

  7. void DS18B20_Start(void)// ds1820 start convert  

  8. {                                            

  9.   DS18b20_Reset();       

  10.     DS18B20_Check();       

  11.   DS18B20_Write_Byte(0xcc);// skip rom  

  12.   DS18B20_Write_Byte(0x44);// convert  

  13. }   

3、复位函数


  1. /************************************************************************************** 

  2. * 名    称: DS18b20_Reset 

  3. * 功    能: DS18b20复位函数 

  4. * 参    数: 无 

  5. * 返 回 值: 无 

  6. **************************************************************************************/  

  7. void DS18b20_Reset(void)  

  8. {  

  9.     DS18B20_SET_IO_IN;  

  10.     DS18B20_DATA_L;  

  11.     Delay_us(750);  

  12.     DS18B20_DATA_H;  

  13.     Delay_us(20);  

  14. }  


4、检测函数


  1. /************************************************************************************** 

  2. * 名    称: DS18B20_Check 

  3. * 功    能: 检测信号 

  4. * 参    数: 无 

  5. * 返 回 值: 0表示成功,1表示失败  

  6. **************************************************************************************/  

  7. u8 DS18B20_Check(void)  

  8. {  

  9.     u8 retry = 0;  

  10.     DS18B20_SET_IO_IN;  

  11.     while(DS18B20_DATA_IN && (retry < 200))  

  12.     {  

  13.         retry ++ ;  

  14.         Delay_us(1);  

  15.     }  

  16.     if(retry>=200)return 1;  

  17.     else retry=0;  

  18.         while (!DS18B20_DATA_IN && (retry<240))  

  19.     {  

  20.         retry++;  

  21.         Delay_us(1);  

  22.     };  

  23.     if(retry>=240)return 1;        

  24.     return 0;  

  25. }  


5、写字节函数


  1. /************************************************************************************** 

  2. * 名    称: DS18B20_Write_Byte 

  3. * 功    能: 写一个字节到DS18B20 

  4. * 参    数: 读到的数据 

  5. * 返 回 值: 无 

  6. **************************************************************************************/  

  7. void DS18B20_Write_Byte(u8 dat)       

  8. {               

  9.   u8 j;  

  10.   u8 testb;  

  11.     DS18B20_SET_IO_OUT;//SET PA0 OUTPUT;  

  12.     for (j=1;j<=8;j++)   

  13.     {  

  14.         testb=dat&0x01;  

  15.         dat=dat>>1;  

  16.         if (testb)   

  17.         {  

  18.             DS18B20_DATA_L;// Write 1  

  19.             Delay_us(2);                              

  20.             DS18B20_DATA_H;  

  21.             Delay_us(60);               

  22.         }  

  23.         else   

  24.         {  

  25.             DS18B20_DATA_L;// Write 0  

  26.             Delay_us(60);               

  27.             DS18B20_DATA_H;  

  28.             Delay_us(2);                            

  29.         }  

  30.     }  

  31. }  

6、读字节函数


  1. /************************************************************************************** 

  2. * 名    称: DS18B20_Read_Byte 

  3. * 功    能: 从DS18B20读取一个字节 

  4. * 参    数: 无 

  5. * 返 回 值: 读到的数据  

  6. **************************************************************************************/  

  7. u8 DS18B20_Read_Byte(void)    // read one byte  

  8. {          

  9.   u8 i,j,dat;  

  10.   dat=0;  

  11.     for (i=1;i<=8;i++)   

  12.     {  

  13.         j=DS18B20_Read_Bit();  

  14.     dat=(j<<7)|(dat>>1);  

  15.   }                           

  16.   return dat;  

  17. }  


7、还有一个分辨率的函数


  1. /************************************************************************************** 

  2. * 名    称: adjust_res 

  3. * 功    能: 调整分辨率 

  4. * 参    数: 分辨率值 

  5. * 返 回 值: 无 

  6. **************************************************************************************/  

  7.    

  8. /*void adjust_res(unsigned char res) ///res 分别等于 0x1f, 0x3f, 0x5f,0x7f温度读数分辨率分别对应 

  9.                            //              0.5, 0.25, 0.125,0.0625   

  10.         DS18b20_Reset();                       //复位 

  11.         DS18B20_Write_Byte(0xcc);              //跳过Rom 

  12.         DS18B20_Write_Byte(0x4e);              //写暂存器 

  13.         DS18B20_Write_Byte(0x02);              //写TH  

  14.         DS18B20_Write_Byte(0x01);              //写TL 

  15.         DS18B20_Write_Byte(res);               //写结构寄存器 

  16.         DS18b20_Reset();                       //复位 

  17.         DS18B20_Write_Byte(0xcc);              //跳过Rom  

  18.         DS18B20_Write_Byte(0x48);              //把暂存器内容写到EPRam中 

  19. }*/  


函数都比较容易,不细细分析,下面贴上一张效果图





DS18B20

中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位

DS18B20中的温度传感器可完成对温度的测量。


关键字:stm32f103zet6  DS18B20 引用地址:基于stm32f103zet6之DS18B20的学习

上一篇:基于stm32f103zet6之UC/OS_II的学习1(初步移植OS--点灯大法)
下一篇:基于stm32f103zet6的FAT16文件系统学习4

推荐阅读最新更新时间:2024-03-16 15:36

PIC16F877单片机DS18B20数码管温度计仿真程序 可显示负温度
电路原理图如下: //********************************************************* // 实现的功能:数码管显示实时温度,支持负温度 // 芯片PIC16F877 // XT:4MHZ //********************************************************* #include pic.h //包含单片机内部资源预定义 #define LVP 0x3f39 // 晶振:XT;代码:没有代码保护;上电延时定时器关闭; // 低电压复位禁止;看门狗关闭 ;低电压编程禁止 __CONFIG (XT & UNPR
[单片机]
PIC16F877单片机<font color='red'>DS18B20</font>数码管温度计仿真程序 可显示负温度
51单片机基于DS18B20的温度检测并显示在lcd1602上
单片机源程序如下: #include reg52.h #include stdio.h sbit DQ =P1^3; sbit RS = P1^5; sbit RW = P1^6; sbit EN = P1^7; void delay(unsigned int i); void init_DS18B20(void); unsigned char read_DS18B20(void); void write_DS18B20(unsigned char dat); double read_temperature(void); void init_lcd(void); void lcd_write_dat(unsigned cha
[单片机]
51单片机基于<font color='red'>DS18B20</font>的温度检测并显示在lcd1602上
基于DS18B20的家用温度测量器方案设计
一、设计概况   本制作采用USB口作为供电端口,用DS18B20温度传感器进行温度信息采集,用AT89C2051单片机进行控制,采用四位共阳数码管显示,从而实现对温度的测量显示(系统框图如图1所示)。本设计可培养学生对单片机学习的兴趣,提高其制作与编程能力。 图1 系统框图 二、电路原理   采用PROteUS仿真软件进行原理图设计与程序仿真。电路如图2所示。 图2 电路图 1、电源   采用USB口供电,可将USB适配器接人电路板的USB口或直接接计算机USB口。这样,既节省了资源,又能够获得较为理想的工作电压。USB口的外形及电源口定义如图3所示。 图3 USB口的外形及电源口定义   2、温度
[单片机]
基于<font color='red'>DS18B20</font>的家用温度测量器方案设计
51单片机开发之DS18B20温度传感器
4.5 DS18B20温度传感器 4.5.1 原理图介绍 图4-5-1 实验板上的DS18B20模块接在单片机的P3.7 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以看上面图片。 4.5.2 DS18B20温度传感器介绍 DS18B20是常用的数字温度传感器,其输出的是数字信号,它的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。 DS18B20的主要特征如下: (1)、全数字温度转换及输出。 (2)、先进的单总线数据通信。(一根线即可采集温度) (3)、最高 12 位分辨率,精度可达土 0.5 摄氏度。 (4)、12 位分辨率时的最大工作周期为 750 毫秒。 (5)、可选择寄生工作
[单片机]
51单片机开发之<font color='red'>DS18B20</font>温度传感器
基于DS18B20的智能温度测量装置
作者Email: jsmo739@yeah.net 一、前言 温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。文章将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89C2051单片机为控制器构成的温度测量装置的工作原理及程序设计作了详细的介绍。该装置适用于
[单片机]
51单片机基础之DS18B20温度传感器
外型: 代码: main.c 文件 #include smg.h #include ds18b20.h /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { u8 i=0; int t
[单片机]
51单片机基础之<font color='red'>DS18B20</font>温度传感器
单片机中使用DS18B20温度传感器C语言程序(参考3)
#include reg51.h sbit DQ =P3^7; //定义通信端口 //延时函数 void delay(unsigned int i) { while(i--); } //初始化函数 Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); } //读一个字节 ReadOneChar(void
[单片机]
LonWorks现场总线技术在楼宇自动化温度测控系统中的应用
  目前,智能建筑得以迅猛发展,其关键是楼宇自动化系统BAS技术,其中楼宇温度测控的子系统用以实现室内温度的合理调节。目前,国内大都采用以单片机为核心组成区域控制系统,但由于这种系统在本质上采用了RS232、RS422/RS485等专用通信协议而形成“自动化孤岛”。应用现场总线控制系统FCS将系统的分散控制转换到现场控制,形成开放性的控制网络。   本文应用LonWorks现场总线技术设计了基于主机的Neuron智能节点,并通过单总线(1-Wire)数字温度传感器DS18B20与智能节点构成温度测控网络,有效地实现了对室内温度的实时监控与调节。 1 LonWorks技术   1.1LonWorks技术要点   Lo
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved