当前位置:   article > 正文

传感器学习——DS18B20_if(t>63488)

if(t>63488)

DS18B20

        DS18B20是Dallas公司生产的数字温度传感器,具有体积小、适用电压宽、经济灵活的特点。它内部使用了onboard专利技术,全部传感元件及转换电路集成在一个形如三极管的集成电路内。DS18B20有电源线、地线及数据线3根引脚线,工作电压范围为3~5.5 V,支持单总线接口。


DS18B20的结构和工作原理

        DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C
DS18B20的外部结构如图1所示。其中,VDD为电源输入端,DQ为数字信号输入/输出端,GND为电源地

                                           在这里插入图片描述

        第0和第1字节为16位转换后的温度二进制值,其中前4位为符号位,其余12位为转换后的数据位(分辨率为12位)。如果温度大于0,则前4位值为0,只要将测到的数值乘上0.062 5即可得到实际温度值;如果温度小于0,则前4位为1,需将测得的数值取反加1后,再乘上0.062 5。第0和第1字节各位的二进制值如下:

                                         在这里插入图片描述

                                         在这里插入图片描述
        根据DS18B20的通信协议,MCU对其操作主要有如下3个步骤:读写之前,对DS18B20发送约500 μs的低电平进行复位;复位成功,发送ROM指令;发送RAM指令。MCU对DS18B20的具体操作流程如图4所示。

                                            在这里插入图片描述

程序源码

ds18b20.c

  1. #include "ds18b20.h"
  2. #include "delay.h"
  3. void DS18B20_Rst(void)
  4. {
  5. DS18B20_IO_OUT(); //SET PG11 OUTPUT
  6. DS18B20_DQ_OUT=0; //拉低DQ
  7. delay_us(750); //拉低750us
  8. DS18B20_DQ_OUT=1; //DQ=1
  9. delay_us(15); //15US
  10. }
  11. //等待ds18b20回应
  12. //返回1未检测到ds18b20的存在
  13. //返回0存在
  14. u8 DS18B20_Check(void)
  15. {
  16. u8 retry=0;
  17. DS18B20_IO_IN();//SET PG11 INPUT
  18. while (DS18B20_DQ_IN&&retry<200)
  19. {
  20. retry++;
  21. delay_us(1);
  22. };
  23. if(retry>=200)return 1;
  24. else retry=0;
  25. while (!DS18B20_DQ_IN&&retry<240)
  26. {
  27. retry++;
  28. delay_us(1);
  29. };
  30. if(retry>=240)return 1;
  31. return 0;
  32. }
  33. //从ds18b20读取一个位
  34. //返回值1/0
  35. u8 DS18B20_Read_Bit(void) // read one bit
  36. {
  37. u8 data;
  38. DS18B20_IO_OUT();//SET PG11 OUTPUT
  39. DS18B20_DQ_OUT=0;
  40. delay_us(2);
  41. DS18B20_DQ_OUT=1;
  42. DS18B20_IO_IN();//SET PG11 INPUT
  43. delay_us(12);
  44. if(DS18B20_DQ_IN)data=1;
  45. else data=0;
  46. delay_us(50);
  47. return data;
  48. }
  49. //从ds18b20读取一个字节
  50. //返回值:读到的数据
  51. u8 DS18B20_Read_Byte(void) // read one byte
  52. {
  53. u8 i,j,dat;
  54. dat=0;
  55. for (i=1;i<=8;i++)
  56. {
  57. j=DS18B20_Read_Bit();
  58. dat=(j<<7)|(dat>>1);
  59. }
  60. return dat;
  61. }
  62. //写一个字节到ds18b20
  63. //dat:要写入的字节
  64. void DS18B20_Write_Byte(u8 dat)
  65. {
  66. u8 j;
  67. u8 testb;
  68. DS18B20_IO_OUT();//SET PG11 OUTPUT;
  69. for (j=1;j<=8;j++)
  70. {
  71. testb=dat&0x01;
  72. dat=dat>>1;
  73. if (testb)
  74. {
  75. DS18B20_DQ_OUT=0;// Write 1
  76. delay_us(2);
  77. DS18B20_DQ_OUT=1;
  78. delay_us(60);
  79. }
  80. else
  81. {
  82. DS18B20_DQ_OUT=0;// Write 0
  83. delay_us(60);
  84. DS18B20_DQ_OUT=1;
  85. delay_us(2);
  86. }
  87. }
  88. }
  89. //开始温度转换
  90. void DS18B20_Start(void)// ds1820 start convert
  91. {
  92. DS18B20_Rst();
  93. DS18B20_Check();
  94. DS18B20_Write_Byte(0xcc);// skip rom
  95. DS18B20_Write_Byte(0x44);// convert
  96. }
  97. //初始化ds18b20的io口 DQ同时检测DS的存在
  98. //返回1:不存在
  99. //返回0:存在
  100. u8 DS18B20_Init(void)
  101. {
  102. GPIO_InitTypeDef GPIO_InitStructure;
  103. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  104. //GPIOG9
  105. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  106. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  107. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  108. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  109. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉­
  110. GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
  111. DS18B20_Rst();
  112. return DS18B20_Check();
  113. }
  114. //从ds18b20得到温度值
  115. //精度:0.1c
  116. //返回值:温度值(-550~1250)
  117. short DS18B20_Get_Temp(void)
  118. {
  119. u8 temp;
  120. u8 TL,TH;
  121. short tem;
  122. DS18B20_Start (); // ds1820 start convert
  123. DS18B20_Rst();
  124. DS18B20_Check();
  125. DS18B20_Write_Byte(0xcc);// skip rom
  126. DS18B20_Write_Byte(0xbe);// convert
  127. TL=DS18B20_Read_Byte(); // LSB
  128. TH=DS18B20_Read_Byte(); // MSB
  129. if(TH>7)
  130. {
  131. TH=~TH;
  132. TL=~TL;
  133. temp=0;//温度为负
  134. }else temp=1;//温度为正
  135. tem=TH; //获得高八位
  136. tem<<=8;
  137. tem+=TL;//获得低八位
  138. tem=(double)tem*0.625;//转换
  139. if(temp)return tem; //放回温度值
  140. else return -tem;
  141. }

ds18b20.h

  1. #ifndef __DELAY_H
  2. #define __DELAY_H
  3. #include <sys.h>
  4. void delay_init(u8 SYSCLK);
  5. void delay_ms(u16 nms);
  6. void delay_us(u32 nus);
  7. #endif


————————————————
版权声明:本文为CSDN博主「互相学习3」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46156693/article/details/104459040

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

闽ICP备14008679号