当前位置:   article > 正文

DS18B20温度传感器(STM32F103C8T6)

ds18b20

一、前言

        使用LCD1602实时显示DS18B20传感器捕抓的环境温度(学习笔记整理)。

二、概述

(一)传感器说明

        DS18B20数字温度计提供9位温度读数。信息经过单线接口送入或送出DS18B20传感器,因此从中央处理器到DS18B20仅需要提供电源以及一根数据线,就可以工作。

(二)DS18B20的ROM指令表

ROM 指令表
指令约定代码功能
读ROM33H读取DS18B20温度传感器ROM中的编码(即64位地址)
符合ROM55H发送此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20使用之作出响应,为下一步对该DS18B20的读写作准备
搜索ROMF0H用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件作好准备
跳过ROMC0H忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于单片工作。
告警搜索ECH执行后只有温度超过设定值上限或下限才能做出响应

(三)DS18B20的RAM指令表

RAM 指令表
指令约定代码功能
温度变换44H启动DS18B20进行温度转换
读暂存器BEH读内部RAM中9字节的内容
写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令后,是传送两字节的数据
复制暂存器48H

将RAM中的第3、4字节的内容复制到EEPROM中

重调EEPROME8H将EEPROM中内容恢复到RAM中的第3、4字节
读供电方式B4H读DS18B20供电模式,寄生供电时为‘0’,外接电源供电时为’1‘

三、DS18B20单总线协议

1、DS18B20初始化

(1) 数据线拉到低电平“0”。

(2) 延时480微妙(该时间的时间范围可以从480到960微妙)。

(3) 数据线拉到高电平“1”。

(4) 延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

(5) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第3步的时间算起)最少要480微妙。

2、读时序

(1) 将数据线拉低“0”。

(2) 延时1微妙。

(3) 将数据线拉高“1”,释放总线准备读数据。

(4) 延时10微妙。 //等待数据稳定

(5) 读数据线的状态得到1个状态位,并进行数据处理。

(6) 延时45微妙。

(7) 重复1~7步骤,直到读完一个字节。

3、写时序

(1) 数据线先置低电平“0”

(2) 延时15微妙。

(3) 按从低位到高位的顺序发送数据(一次只发送一位)。

(4) 延时60微妙。

(5) 将数据线拉到高电平。

(6) 重复1~5步骤,直到发送完整的字节。

(7) 最后将数据线拉高。

四、硬件连接

五、程序例程

1、DS18B20.c文件

  1. #include "ds18b20.h"
  2. /*******************************************************************************
  3. * 函 数 名 : DS18B20_IO_IN
  4. * 函数功能 : DS18B20_IO输入配置
  5. * 输 入 : 无
  6. * 输 出 : 无
  7. *******************************************************************************/
  8. void DS18B20_IO_IN(void)
  9. {
  10. GPIO_InitTypeDef GPIO_InitStructure;
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  14. }
  15. /*******************************************************************************
  16. * 函 数 名 : DS18B20_IO_OUT
  17. * 函数功能 : DS18B20_IO输出配置
  18. * 输 入 : 无
  19. * 输 出 : 无
  20. *******************************************************************************/
  21. void DS18B20_IO_OUT(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStructure;
  24. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  25. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  26. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  27. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  28. }
  29. /*******************************************************************************
  30. * 函 数 名 : DS18B20_Reset
  31. * 函数功能 : 复位DS18B20
  32. * 输 入 : 无
  33. * 输 出 : 无
  34. *******************************************************************************/
  35. void DS18B20_Reset(void)
  36. {
  37. DS18B20_IO_OUT(); //SET PG11 OUTPUT
  38. DS18B20_DQ_OUT=0; //拉低DQ
  39. delay_us(750); //拉低750us
  40. DS18B20_DQ_OUT=1; //DQ=1
  41. delay_us(15); //15US
  42. }
  43. /*******************************************************************************
  44. * 函 数 名 : DS18B20_Check
  45. * 函数功能 : 检测DS18B20是否存在
  46. * 输 入 : 无
  47. * 输 出 : 1:未检测到DS18B20的存在,0:存在
  48. *******************************************************************************/
  49. u8 DS18B20_Check(void)
  50. {
  51. u8 retry=0;
  52. DS18B20_IO_IN();//SET PG11 INPUT
  53. while (DS18B20_DQ_IN&&retry<200)
  54. {
  55. retry++;
  56. delay_us(1);
  57. };
  58. if(retry>=200)
  59. return 1;
  60. else
  61. retry=0;
  62. while (!DS18B20_DQ_IN&&retry<240)
  63. {
  64. retry++;
  65. delay_us(1);
  66. };
  67. if(retry>=240)
  68. return 1;
  69. return 0;
  70. }
  71. /*******************************************************************************
  72. * 函 数 名 : DS18B20_Read_Bit
  73. * 函数功能 : 从DS18B20读取一个位
  74. * 输 入 : 无
  75. * 输 出 : 1/0
  76. *******************************************************************************/
  77. u8 DS18B20_Read_Bit(void) // read one bit
  78. {
  79. u8 data;
  80. DS18B20_IO_OUT();//SET PG11 OUTPUT
  81. DS18B20_DQ_OUT=0;
  82. delay_us(2);
  83. DS18B20_DQ_OUT=1;
  84. DS18B20_IO_IN();//SET PG11 INPUT
  85. delay_us(12);
  86. if(DS18B20_DQ_IN)
  87. data=1;
  88. else
  89. data=0;
  90. delay_us(50);
  91. return data;
  92. }
  93. /*******************************************************************************
  94. * 函 数 名 : DS18B20_Read_Byte
  95. * 函数功能 : 从DS18B20读取一个字节
  96. * 输 入 : 无
  97. * 输 出 : 一个字节数据
  98. *******************************************************************************/
  99. u8 DS18B20_Read_Byte(void) // read one byte
  100. {
  101. u8 i,j,dat;
  102. dat=0;
  103. for (i=1;i<=8;i++)
  104. {
  105. j=DS18B20_Read_Bit();
  106. dat=(j<<7)|(dat>>1);
  107. }
  108. return dat;
  109. }
  110. /*******************************************************************************
  111. * 函 数 名 : DS18B20_Write_Byte
  112. * 函数功能 : 写一个字节到DS18B20
  113. * 输 入 : dat:要写入的字节
  114. * 输 出 : 无
  115. *******************************************************************************/
  116. void DS18B20_Write_Byte(u8 dat)
  117. {
  118. u8 j;
  119. u8 testb;
  120. DS18B20_IO_OUT();//SET PG11 OUTPUT;
  121. for (j=1;j<=8;j++)
  122. {
  123. testb=dat&0x01;
  124. dat=dat>>1;
  125. if (testb)
  126. {
  127. DS18B20_DQ_OUT=0;// Write 1
  128. delay_us(2);
  129. DS18B20_DQ_OUT=1;
  130. delay_us(60);
  131. }
  132. else
  133. {
  134. DS18B20_DQ_OUT=0;// Write 0
  135. delay_us(60);
  136. DS18B20_DQ_OUT=1;
  137. delay_us(2);
  138. }
  139. }
  140. }
  141. /*******************************************************************************
  142. * 函 数 名 : DS18B20_Start
  143. * 函数功能 : 开始温度转换
  144. * 输 入 : 无
  145. * 输 出 : 无
  146. *******************************************************************************/
  147. void DS18B20_Start(void)// ds1820 start convert
  148. {
  149. DS18B20_Reset();
  150. DS18B20_Check();
  151. DS18B20_Write_Byte(0xcc);// skip rom
  152. DS18B20_Write_Byte(0x44);// convert
  153. }
  154. /*******************************************************************************
  155. * 函 数 名 : DS18B20_Init
  156. * 函数功能 : 初始化DS18B20的IO口 DQ 同时检测DS的存在
  157. * 输 入 : 无
  158. * 输 出 : 1:不存在,0:存在
  159. *******************************************************************************/
  160. u8 DS18B20_Init(void)
  161. {
  162. GPIO_InitTypeDef GPIO_InitStructure;
  163. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
  164. GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
  165. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  166. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  167. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  168. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  169. DS18B20_Reset();
  170. return DS18B20_Check();
  171. }
  172. /*******************************************************************************
  173. * 函 数 名 : DS18B20_GetTemperture
  174. * 函数功能 : 从ds18b20得到温度值
  175. * 输 入 : 无
  176. * 输 出 : 温度数据
  177. *******************************************************************************/
  178. float DS18B20_GetTemperture(void)
  179. {
  180. u16 temp;
  181. u8 a,b;
  182. float value;
  183. DS18B20_Start(); // ds1820 start convert
  184. DS18B20_Reset();
  185. DS18B20_Check();
  186. DS18B20_Write_Byte(0xcc);// skip rom
  187. DS18B20_Write_Byte(0xbe);// convert
  188. a=DS18B20_Read_Byte(); // LSB
  189. b=DS18B20_Read_Byte(); // MSB
  190. temp=b;
  191. temp=(temp<<8)+a;
  192. if((temp&0xf800)==0xf800)
  193. {
  194. temp=(~temp)+1;
  195. value=temp*(-0.0625);
  196. }
  197. else
  198. {
  199. value=temp*0.0625;
  200. }
  201. return value;
  202. }

2、主函数

  1. int main(void)
  2. {
  3. float temper = 0.0;
  4. char display_temp[20] = {0};
  5. Usart1_Pin_Init(115200);
  6. printf("初始化成功\r\n");
  7. Sys_Delay_Init();
  8. Lcd1602_Init();
  9. DS18B20_Init();
  10. delay_ms(50);
  11. while(1)
  12. {
  13. temper=DS18B20_GetTemperture();
  14. if(temper<0)
  15. {
  16. printf("检测的温度为:-");
  17. }
  18. else
  19. {
  20. printf("检测的温度为: ");
  21. }
  22. printf("%.2f°C\r\n",temper);
  23. sprintf(display_temp,"TEMP:%.3f",temper);
  24. Lcd1602_DisplayString(1,1,(u8 *)display_temp); //显示温度值
  25. }
  26. }

六、实验结果

相关程序和资料,有需要者自行下载

网盘链接:

        链接:https://pan.baidu.com/s/1kW9866jJ9AQYM4YLc1kEUw 
        提取码:o3m4

 如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/152023
推荐阅读
相关标签
  

闽ICP备14008679号