18B20温度传感器详解

传感器网CGQ.BZ · 2016-12-30 17:19:47 · 658次浏览

特性:

1.      单独的单线接口,只需1个接口引脚即可通信;

2.      不需要外部元件;

3.      可用数据线供电;

4.      不需备份电源;

5.      测量范围从-55°C  ~  +125°C, 增量为0.0625°C;

6.      以12位数字值方式读出温度;

7.      在1s内把温度变换为数字;

 

 

知识点:

1.      每个18B20包括唯一的64位长的序号放在ROM中;

开始8位产品类型编码" 接着48位每个器件唯一序号| 最后8位:前56位的CRC

2.      18B20最小单位刻度是0.0625°C, (这里后面解释)

  

DS18B20的控制流程

根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,片机控制DS18B20完成一次温度转换必须经过3个步骤:

1.     初始化;

2.      发送ROM指令;

3.      发送18B20功能指令。

@以上3个流程还有顺序不能颠倒且缺一不可,每次只要发送任何一条ROM指令,这个流程必须从第1再开始才能发送另外的ROM指令;

一,初始化

 

 

  1. /*  

  2. *******************************************************************************  

  3. **  

  4. **                             GPIO_DQ_Out_Mode(void)  

  5. **  

  6. **  

  7. **  功能描述:设置DQ引脚为开漏输出模式  

  8. **  

  9. **  参  数  :无  

  10. **  

  11. **  返回值  :无  

  12. **  

  13. *******************************************************************************  

  14. */  

  15. void GPIO_DQ_Out_Mode(void)  

  16. {  

  17.     GPIO_InitTypeDef GPIO_InitStructure ;  

  18.       

  19.     GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ;  

  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;  

  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //开漏输出  

  22.     GPIO_Init(DQ_GPIO ,&GPIO_InitStructure) ;  

  23. }  

  24.   

  25. /*  

  26. *******************************************************************************  

  27. **  

  28. **                                GPIO_DQ_Input_Mode(void)  

  29. **  

  30. **  

  31. **  功能描述:设置DQ引脚为浮空输入模式  

  32. **  

  33. **  参  数  :无  

  34. **  

  35. **  返回值  :无  

  36. **  

  37. *******************************************************************************  

  38. */  

  39. void GPIO_DQ_Input_Mode(void)  

  40. {  

  41.     GPIO_InitTypeDef GPIO_InitStructure ;  

  42.       

  43.     GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ;  

  44.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;  

  45.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //浮空输入  

  46.     GPIO_Init(DQ_GPIO ,&GPIO_InitStructure) ;  

  47. }  

  48.   

  49. /*  

  50. *******************************************************************************  

  51. **                                  Tx_ResetPulse(void)  

  52. **  

  53. **  

  54. **  功能描述:发送复位脉冲  

  55. **  

  56. **  参  数  :无  

  57. **  

  58. **  返回值  :无  

  59. **  

  60. *******************************************************************************  

  61. */  

  62. void Tx_ResetPulse(void)  

  63. {  

  64.    GPIO_DQ_Out_Mode() ;  

  65.       

  66.     DQ_Write_0() ;  //复位脉冲  

  67.     Delay_10us(50) ; //至少保持480us  

  68.     DQ_Write_1() ;  //加速上升沿速度  

  69.     Delay_10us(1) ;  

  70. }  

  71. /*  

  72. *******************************************************************************  

  73. **  

  74. **                              Rx_PresencePulse(void)  

  75. **  

  76. **  

  77. **  功能描述:接受应答信号  

  78. **  

  79. **  参  数  :无  

  80. **  

  81. **  返回值  :无  

  82. **  

  83. *******************************************************************************  

  84. */  

  85. void Rx_PresencePulse(void)  

  86. {  

  87.     GPIO_DQ_Input_Mode() ;  

  88.     while( DQ_ReadBit()) ;  //等待DS18b20应答  

  89.     while( DQ_ReadBit() == 0) ; //DS18b20将总线拉低60~240us ,然后总线由上拉电阻拉高  

  90.     Delay_10us(30) ;  

  91.     GPIO_DQ_Out_Mode() ;    //接受完成,主机重新控制总线  

  92. }  

  93. /*  

  94. *******************************************************************************  

  95. **                                 DS18B20_Init(void)  

  96. **  

  97. **  

  98. **  功能描述:初始化DS18b20  

  99. **  

  100. **  参    数:无  

  101. **   

  102. **  返回值  :无  

  103. **  

  104. *******************************************************************************  

  105. */  

  106. void DS18B20_Init(void)  

  107. {  

  108.     Tx_ResetPulse();  

  109.     Rx_PresencePulse();   

  110. }  

 

 

Tx_ResetPulse:函数:主机总线发送复位脉冲

PresencePulse函数:主机读取18B20返回的存在脉冲(电平持续60-240us)

 

二.写时序

 

 

  1. /*  

  2. *******************************************************************************  

  3. **  

  4. **                      Write_OneByte_ToDS18b20(unsigned char data)  

  5. **  

  6. **  

  7. **  功能描述:写一个字节到DS18b20  

  8. **  

  9. **  参  数  :无  

  10. **  

  11. **  返回值  :无  

  12. **  

  13. *******************************************************************************  

  14. */  

  15. void Write_OneByte_ToDS18b20(unsigned char data)  

  16. {  

  17.     unsigned char i ;  

  18.     GPIO_DQ_Out_Mode() ;  

  19.     for(i="0 ;i<8 ;i++)  

  20.     {  

  21.         if(data&0x01)    //低位在前  

  22.         {  

  23.             //写1  

  24.             DQ_Write_0() ; //写时间空隙总是从总线的低电平开始  

  25.             Delay_10us(1) ;  //15us内拉高  

  26.             DQ_Write_1() ;  

  27.             Delay_10us(8) ; //整个写1时隙不低于60us  

  28.         }  

  29.         else  

  30.         {  

  31.             //写0  

  32.             DQ_Write_0() ;  

  33.             Delay_10us(11) ; //保持在60us到120us之间  

  34.             DQ_Write_1() ;  

  35. Delay_10us(1) ;

文章推荐: