DS18B20时序分析:

以下是STM32的驱动代码:

  1. #include "bsp_ds18b20.h"
  2.  
  3. static void DS18B20_GPIO_Config(void)
  4. {
  5.  
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7.  
  8. RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
  9.  
  10. GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  11.  
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13.  
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.  
  16. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
  17.  
  18. GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
  19. }
  20.  
  21. static void DS18B20_Mode_IPU(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStructure;
  24.  
  25. GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  26.  
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  28.  
  29. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
  30. }
  31.  
  32. static void DS18B20_Mode_Out_PP(void)
  33. {
  34. GPIO_InitTypeDef GPIO_InitStructure;
  35. GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  36.  
  37. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  38.  
  39. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.  
  41. GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
  42. }
  43.  
  44. static void DS18B20_Rst(void)
  45. {
  46.  
  47. DS18B20_Mode_Out_PP();
  48.  
  49. DS18B20_DATA_OUT(LOW);
  50. Delay_us(750);
  51.  
  52. DS18B20_DATA_OUT(HIGH);
  53.  
  54. Delay_us(15);
  55. }
  56.  
  57. static uint8_t DS18B20_Presence(void)
  58. {
  59. uint8_t pulse_time = 0;
  60.  
  61. DS18B20_Mode_IPU();
  62.  
  63. while( DS18B20_DATA_IN() && pulse_time<100 )
  64. {
  65. pulse_time++;
  66. Delay_us(1);
  67. }
  68. if( pulse_time >=100 )
  69. return 1;
  70. else
  71. pulse_time = 0;
  72.  
  73. while( !DS18B20_DATA_IN() && pulse_time<240 )
  74. {
  75. pulse_time++;
  76. Delay_us(1);
  77. }
  78. if( pulse_time >=240 )
  79. return 1;
  80. else
  81. return 0;
  82. }
  83.  
  84. static uint8_t DS18B20_Read_Bit(void)
  85. {
  86. uint8_t dat;
  87.  
  88. DS18B20_Mode_Out_PP();
  89. DS18B20_DATA_OUT(LOW);
  90. Delay_us(10);
  91.  
  92. DS18B20_Mode_IPU();
  93. //Delay_us(2);
  94.  
  95. if( DS18B20_DATA_IN() == SET )
  96. dat = 1;
  97. else
  98. dat = 0;
  99.  
  100. Delay_us(45);
  101.  
  102. return dat;
  103. }
  104.  
  105. uint8_t DS18B20_Read_Byte(void)
  106. {
  107. uint8_t i, j, dat = 0;
  108.  
  109. for(i=0; i<8; i++)
  110. {
  111. j = DS18B20_Read_Bit();
  112. dat = (dat) | (j<<i);
  113. }
  114.  
  115. return dat;
  116. }
  117.  
  118. void DS18B20_Write_Byte(uint8_t dat)
  119. {
  120. uint8_t i, testb;
  121. DS18B20_Mode_Out_PP();
  122.  
  123. for( i=0; i<8; i++ )
  124. {
  125. testb = dat&0x01;
  126. dat = dat>>1;
  127. if (testb)
  128. {
  129. DS18B20_DATA_OUT(LOW);
  130. Delay_us(8);
  131.  
  132. DS18B20_DATA_OUT(HIGH);
  133. Delay_us(58);
  134. }
  135. else
  136. {
  137. DS18B20_DATA_OUT(LOW);
  138. /* 60us < Tx 0 < 120us */
  139. Delay_us(70);
  140.  
  141. DS18B20_DATA_OUT(HIGH);
  142. Delay_us(2);
  143. }
  144. }
  145. }
  146.  
  147. void DS18B20_Start(void)
  148. {
  149. DS18B20_Rst();
  150. DS18B20_Presence();
  151. DS18B20_Write_Byte(0XCC);
  152. DS18B20_Write_Byte(0X44);
  153. }
  154.  
  155. uint8_t DS18B20_Init(void)
  156. {
  157. DS18B20_GPIO_Config();
  158. DS18B20_Rst();
  159.  
  160. return DS18B20_Presence();
  161. }
  162.  
  163. float DS18B20_Get_Temp(void)
  164. {
  165. uint8_t tpmsb, tplsb;
  166. short s_tem;
  167. float f_tem;
  168.  
  169. DS18B20_Rst();
  170. DS18B20_Presence();
  171. DS18B20_Write_Byte(0XCC);
  172. DS18B20_Write_Byte(0X44);
  173.  
  174. DS18B20_Rst();
  175. DS18B20_Presence();
  176. DS18B20_Write_Byte(0XCC);
  177. DS18B20_Write_Byte(0XBE);
  178.  
  179. tplsb = DS18B20_Read_Byte();
  180. tpmsb = DS18B20_Read_Byte();
  181.  
  182. s_tem = tpmsb<<8;
  183. s_tem = s_tem | tplsb;
  184.  
  185. if( s_tem < 0 )
  186. f_tem = (~s_tem+1) * 0.0625;
  187. else
  188. f_tem = s_tem * 0.0625;
  189.  
  190. return f_tem;
  191. }
  192.  
  193. /*************************************END OF FILE******************************/

总结:如何驱动DS18B20温度传感器的更多相关文章

  1. DS18b20温度传感器基础使用

    认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...

  2. DS18B20温度传感器知识点总结

    2018-01-1818:20:48 感觉自己最近有点凌乱,一个很简单的问题都能困扰自己很久.以前能很好使用和调试的DS18B20温度传感器,今天愣是搞了很久,妈卖批. 仅仅一个上拉电阻就困扰了我很久 ...

  3. 单线制DS18B20温度传感器LED数码管显示当前的温度值

    /******************************************* 程序功能:利用单线制DS18B20温度传感器 LED数码管显示当前的温度值 ***************** ...

  4. STM32驱动DS18B20

    DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器.与传 统的热敏电阻等测温元件相比,它是一种新型的体积小.适用电压宽.与微处理器接口简单的 数字化温度传感器.一线 ...

  5. 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. 单片机学习(十二)1-Wire通信协议和DS18B20温度传感器

    目录 一.DS18B20 1. DS18B20简介 2. 电路原理图 3. 内部结构 内部完整结构框图 存储器结构 二.单总线(1-Wire BUS) 1. 单总线简介 2. 电路规范 3. 单总线的 ...

  7. nanopi的ds18b20温度传感器测试

    参考(抄袭)资料在这里 先接线,3.3v,gnd,数据输出脚,我是PG11 vim /boot/armbianEnv.txt overlays=w1-gpio param_w1_pin=PG11 pa ...

  8. 使用天祥TX-1C调试DS18B20温度传感器的收获

    翻查DS18B20的DataSheet编写操作函数,其过程遇到了不少坎,记下来备查. 对于单总线的DS18B20芯片,首先严格按照时序图写出正确的“写0”.“写1”和“读0.1”的基础函数,再以此写出 ...

  9. stm32 ds18b20 温度传感器

    相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74991985 举例 void DS18B20_in() { GPIO_InitTyp ...

随机推荐

  1. Solr 5.5.0 + tomcat 7.0.69 + zookeeper-3.4.6 Cloud部署

    Solr介绍:Solr是一个独立的企业级搜索应用服务器,Solr基于Lucene的全文搜索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了 ...

  2. java中&和&&的区别 位运算

    1.1. 逻辑与的运算符功能 1.1.1. 测试&& public static void main(String[] args) { int x=5; if (x==6 && ...

  3. iterm2 快捷键

    最近开始使用mac,用iterm2的终端,有些快捷键纪录下. 标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 或者 command + 左 ...

  4. Qt中事件分发源代码剖析

    Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的. 下面举例说明: 1)首先看看下面一段示例代码: i ...

  5. Spark:大数据的电花火石!

    什么是Spark?可能你很多年前就使用过Spark,反正当年我四六级单词都是用的星火系列,没错,星火系列的洋名就是Spark. 当然这里说的Spark指的是Apache Spark,Apache Sp ...

  6. window.open 打开子窗口,关闭所有的子窗口

    需求:通过window.open方法打开了子窗口,当关闭主窗口时,子窗口应当也关闭. 实现思路: 1.打开子窗口函数window.open(url,winName)的第二个参数winName可以唯一标 ...

  7. 怎么避免在类实现的cpp文件中不要多次进行类声明

    方法1: 类的头文件中写 #pragma once class MyTeacher { public: MyTeacher(); ~MyTeacher(); }; 方法2: 类的头文件中写 #ifnd ...

  8. [sersync] github镜像 二进制包

    这几天在搞数据的本地备份和远程备份的事情,用到了sersync这个国产的同步工具,可是发现他托管在google code,需要fanqiang才能下载, 于是就弄了一个github的镜像,顺便把64位 ...

  9. lk中内联调用的dsb()

    lk中内联调用的dsb() 比如lk的uart_dm_init()函数就调用了dsb() /* Configure the uart clock */ clock_config_uart_dm(id) ...

  10. Sql表注释

    1 创建表的时候写注释 create table test1 ( field_name int comment '字段的注释' )comment='表的注释'; 2 修改表的注释 alter tabl ...