你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2174|回复: 1

【HAL库每天一例】第070例: OneWire_DS18B20温度传感器

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-7-20 09:38:25 | 显示全部楼层 |阅读模式
HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-103. OneWire_DS18B20温度传感器

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-103. OneWire_DS18B20温度传感器
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  DS18B20温度传感器
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP6        PD3         AM2303/DS18B20       已接入
  
【3】操作及现象
    使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安
装驱动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串
口调试助手窗口可接收到信息。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg



bsp_DS18B20.h文件内容
  1. #ifndef __ONEWIRE_DS18B20_H__
  2. #define        __ONEWIRE_DS18B20_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"

  5. /* 类型定义 ------------------------------------------------------------------*/
  6. /* 宏定义 -------------------------------------------------------------------*/
  7. /***********************   DS18B20 连接引脚定义  **************************/
  8. #define DS18B20_Dout_GPIO_CLK_ENABLE()              __HAL_RCC_GPIOD_CLK_ENABLE()
  9. #define DS18B20_Dout_PORT                           GPIOD
  10. #define DS18B20_Dout_PIN                            GPIO_PIN_3

  11. /***********************   DS18B20 函数宏定义  ****************************/
  12. #define DS18B20_Dout_LOW()                          HAL_GPIO_WritePin(DS18B20_Dout_PORT,DS18B20_Dout_PIN,GPIO_PIN_RESET)
  13. #define DS18B20_Dout_HIGH()                         HAL_GPIO_WritePin(DS18B20_Dout_PORT,DS18B20_Dout_PIN,GPIO_PIN_SET)
  14. #define DS18B20_Data_IN()                                  HAL_GPIO_ReadPin(DS18B20_Dout_PORT,DS18B20_Dout_PIN)

  15. /* 扩展变量 ------------------------------------------------------------------*/
  16. /* 函数声明 ------------------------------------------------------------------*/
  17. uint8_t DS18B20_Init(void);
  18. void DS18B20_ReadId( uint8_t * ds18b20_id);
  19. float DS18B20_GetTemp_SkipRom(void);
  20. float DS18B20_GetTemp_MatchRom(uint8_t *ds18b20_id);

  21. #endif /* __ONEWIRE_DS18B20_H__ */
  22. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码


bsp_DS18B20.c文件内容
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_DS18B20.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: DS18B20温度传感器底层驱动程序
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "DS18B20/bsp_DS18B20.h"

  19. /* 私有类型定义 --------------------------------------------------------------*/
  20. /* 私有宏定义 ----------------------------------------------------------------*/
  21. #define Delay_ms(x)   HAL_Delay(x)
  22. /* 私有变量 ------------------------------------------------------------------*/
  23. /* 扩展变量 ------------------------------------------------------------------*/
  24. /* 私有函数原形 --------------------------------------------------------------*/
  25. static void DS18B20_Mode_IPU(void);
  26. static void DS18B20_Mode_Out_PP(void);
  27. static void DS18B20_Rst(void);
  28. static uint8_t DS18B20_Presence(void);
  29. static uint8_t DS18B20_ReadBit(void);
  30. static uint8_t DS18B20_ReadByte(void);
  31. static void DS18B20_WriteByte(uint8_t dat);
  32. static void DS18B20_SkipRom(void);
  33. static void DS18B20_MatchRom(void);

  34. /* 函数体 --------------------------------------------------------------------*/
  35. /**
  36.   * 函数功能:
  37.   * 输入参数: 无
  38.   * 返 回 值: 无
  39.   * 说    明:无
  40.   */
  41. static void DS18B20_Delay(uint16_t time)
  42. {
  43.         uint8_t i;

  44.   while(time)
  45.   {   
  46.           for (i = 0; i < 10; i++)
  47.     {
  48.       
  49.     }
  50.     time--;
  51.   }
  52. }

  53. /**
  54.   * 函数功能: DS18B20 初始化函数
  55.   * 输入参数: 无
  56.   * 返 回 值: 无
  57.   * 说    明:无
  58.   */
  59. uint8_t DS18B20_Init(void)
  60. {
  61.   DS18B20_Dout_GPIO_CLK_ENABLE();
  62.   
  63.   DS18B20_Mode_Out_PP();
  64.         
  65.         DS18B20_Dout_HIGH();
  66.         
  67.         DS18B20_Rst();
  68.   
  69.   return DS18B20_Presence ();
  70. }


  71. /**
  72.   * 函数功能: 使DS18B20-DATA引脚变为上拉输入模式
  73.   * 输入参数: 无
  74.   * 返 回 值: 无
  75.   * 说    明:无
  76.   */
  77. static void DS18B20_Mode_IPU(void)
  78. {
  79.   GPIO_InitTypeDef GPIO_InitStruct;
  80.   
  81.   /* 串口外设功能GPIO配置 */
  82.   GPIO_InitStruct.Pin   = DS18B20_Dout_PIN;
  83.   GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
  84.   GPIO_InitStruct.Pull  = GPIO_PULLUP;
  85.   HAL_GPIO_Init(DS18B20_Dout_PORT, &GPIO_InitStruct);
  86.         
  87. }

  88. /**
  89.   * 函数功能: 使DS18B20-DATA引脚变为推挽输出模式
  90.   * 输入参数: 无
  91.   * 返 回 值: 无
  92.   * 说    明:无
  93.   */
  94. static void DS18B20_Mode_Out_PP(void)
  95. {
  96.   GPIO_InitTypeDef GPIO_InitStruct;
  97.   
  98.   /* 串口外设功能GPIO配置 */
  99.   GPIO_InitStruct.Pin = DS18B20_Dout_PIN;
  100.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  101.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  102.   HAL_GPIO_Init(DS18B20_Dout_PORT, &GPIO_InitStruct);         
  103. }

  104. /**
  105.   * 函数功能: 主机给从机发送复位脉冲
  106.   * 输入参数: 无
  107.   * 返 回 值: 无
  108.   * 说    明:无
  109.   */
  110. static void DS18B20_Rst(void)
  111. {
  112.         /* 主机设置为推挽输出 */
  113.         DS18B20_Mode_Out_PP();
  114.         
  115.         DS18B20_Dout_LOW();
  116.   
  117.         /* 主机至少产生480us的低电平复位信号 */
  118.         DS18B20_Delay(750);
  119.         
  120.         /* 主机在产生复位信号后,需将总线拉高 */
  121.         DS18B20_Dout_HIGH();
  122.         
  123.         /*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/
  124.         DS18B20_Delay(15);
  125. }

  126. /**
  127.   * 函数功能: 检测从机给主机返回的存在脉冲
  128.   * 输入参数: 无
  129.   * 返 回 值: 0:成功,1:失败
  130.   * 说    明:无
  131.   */
  132. static uint8_t DS18B20_Presence(void)
  133. {
  134.         uint8_t pulse_time = 0;
  135.         
  136.         /* 主机设置为上拉输入 */
  137.         DS18B20_Mode_IPU();
  138.         
  139.         /* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号
  140.          * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
  141.          */
  142.         while( DS18B20_Data_IN() && pulse_time<100 )
  143.         {
  144.                 pulse_time++;
  145.                 DS18B20_Delay(1);
  146.         }        
  147.         /* 经过100us后,存在脉冲都还没有到来*/
  148.         if( pulse_time >=100 )
  149.                 return 1;
  150.         else
  151.                 pulse_time = 0;
  152.         
  153.         /* 存在脉冲到来,且存在的时间不能超过240us */
  154.         while( !DS18B20_Data_IN() && pulse_time<240 )
  155.         {
  156.                 pulse_time++;
  157.                 DS18B20_Delay(1);
  158.         }        
  159.         if( pulse_time >=240 )
  160.                 return 1;
  161.         else
  162.                 return 0;
  163. }

  164. /**
  165.   * 函数功能: 从DS18B20读取一个bit
  166.   * 输入参数: 无
  167.   * 返 回 值: 读取到的数据
  168.   * 说    明:无
  169.   */
  170. static uint8_t DS18B20_ReadBit(void)
  171. {
  172.         uint8_t dat;
  173.         
  174.         /* 读0和读1的时间至少要大于60us */        
  175.         DS18B20_Mode_Out_PP();
  176.         /* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */
  177.         DS18B20_Dout_LOW();
  178.         DS18B20_Delay(10);
  179.         
  180.         /* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */
  181.         DS18B20_Mode_IPU();
  182.         //Delay_us(2);
  183.         
  184.         if( DS18B20_Data_IN() == SET )
  185.                 dat = 1;
  186.         else
  187.                 dat = 0;
  188.         
  189.         /* 这个延时参数请参考时序图 */
  190.         DS18B20_Delay(45);
  191.         
  192.         return dat;
  193. }

  194. /**
  195.   * 函数功能: 从DS18B20读一个字节,低位先行
  196.   * 输入参数: 无
  197.   * 返 回 值: 读到的数据
  198.   * 说    明:无
  199.   */
  200. static uint8_t DS18B20_ReadByte(void)
  201. {
  202.         uint8_t i, j, dat = 0;        
  203.         
  204.         for(i=0; i<8; i++)
  205.         {
  206.                 j = DS18B20_ReadBit();               
  207.                 dat = (dat) | (j<<i);
  208.         }
  209.         
  210.         return dat;
  211. }

  212. /**
  213.   * 函数功能: 写一个字节到DS18B20,低位先行
  214.   * 输入参数: dat:待写入数据
  215.   * 返 回 值: 无
  216.   * 说    明:无
  217.   */
  218. static void DS18B20_WriteByte(uint8_t dat)
  219. {
  220.         uint8_t i, testb;
  221.         DS18B20_Mode_Out_PP();
  222.         
  223.         for( i=0; i<8; i++ )
  224.         {
  225.                 testb = dat&0x01;
  226.                 dat = dat>>1;               
  227.                 /* 写0和写1的时间至少要大于60us */
  228.                 if (testb)
  229.                 {                        
  230.                         DS18B20_Dout_LOW();
  231.                         /* 1us < 这个延时 < 15us */
  232.                         DS18B20_Delay(8);
  233.                         
  234.                         DS18B20_Dout_HIGH();
  235.                         DS18B20_Delay(58);
  236.                 }               
  237.                 else
  238.                 {                        
  239.                         DS18B20_Dout_LOW();
  240.                         /* 60us < Tx 0 < 120us */
  241.                         DS18B20_Delay(70);
  242.                         
  243.                         DS18B20_Dout_HIGH();               
  244.                         /* 1us < Trec(恢复时间) < 无穷大*/
  245.                         DS18B20_Delay(2);
  246.                 }
  247.         }
  248. }

  249. /**
  250.   * 函数功能: 跳过匹配 DS18B20 ROM
  251.   * 输入参数: 无
  252.   * 返 回 值: 无
  253.   * 说    明:无
  254.   */
  255. static void DS18B20_SkipRom ( void )
  256. {
  257.         DS18B20_Rst();                  
  258.         DS18B20_Presence();                 
  259.         DS18B20_WriteByte(0XCC);                /* 跳过 ROM */        
  260. }

  261. /**
  262.   * 函数功能: 执行匹配 DS18B20 ROM
  263.   * 输入参数: 无
  264.   * 返 回 值: 无
  265.   * 说    明:无
  266.   */
  267. static void DS18B20_MatchRom ( void )
  268. {
  269.         DS18B20_Rst();                  
  270.         DS18B20_Presence();                 
  271.         DS18B20_WriteByte(0X55);                /* 匹配 ROM */        
  272. }


  273. /*
  274. * 存储的温度是16 位的带符号扩展的二进制补码形式
  275. * 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位
  276. *
  277. *         |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
  278. * 低字节  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
  279. *
  280. *
  281. *         |-----符号位:0->正  1->负-------|-----------整数-----------|
  282. * 高字节  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |
  283. *
  284. *
  285. * 温度 = 符号位 + 整数 + 小数*0.0625
  286. */
  287. /**
  288.   * 函数功能: 在跳过匹配 ROM 情况下获取 DS18B20 温度值
  289.   * 输入参数: 无
  290.   * 返 回 值: 温度值
  291.   * 说    明:无
  292.   */
  293. float DS18B20_GetTemp_SkipRom ( void )
  294. {
  295.         uint8_t tpmsb, tplsb;
  296.         short s_tem;
  297.         float f_tem;
  298.         
  299.         
  300.         DS18B20_SkipRom ();
  301.         DS18B20_WriteByte(0X44);                                /* 开始转换 */
  302.         
  303.         
  304.         DS18B20_SkipRom ();
  305.   DS18B20_WriteByte(0XBE);                                /* 读温度值 */
  306.         
  307.         tplsb = DS18B20_ReadByte();                 
  308.         tpmsb = DS18B20_ReadByte();
  309.         
  310.         
  311.         s_tem = tpmsb<<8;
  312.         s_tem = s_tem | tplsb;
  313.         
  314.         if( s_tem < 0 )                /* 负温度 */
  315.                 f_tem = (~s_tem+1) * 0.0625;        
  316.         else
  317.                 f_tem = s_tem * 0.0625;
  318.         
  319.         return f_tem;         
  320. }

  321. /**
  322.   * 函数功能: 在匹配 ROM 情况下获取 DS18B20 温度值
  323.   * 输入参数: ds18b20_id:用于存放 DS18B20 序列号的数组的首地址
  324.   * 返 回 值: 无
  325.   * 说    明:无
  326.   */
  327. void DS18B20_ReadId ( uint8_t * ds18b20_id )
  328. {
  329.         uint8_t uc;
  330.                
  331.         DS18B20_WriteByte(0x33);       //读取序列号
  332.         
  333.         for ( uc = 0; uc < 8; uc ++ )
  334.           ds18b20_id [ uc ] = DS18B20_ReadByte();        
  335. }

  336. /**
  337.   * 函数功能: 在匹配 ROM 情况下获取 DS18B20 温度值
  338.   * 输入参数: ds18b20_id:存放 DS18B20 序列号的数组的首地址
  339.   * 返 回 值: 温度值
  340.   * 说    明:无
  341.   */
  342. float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
  343. {
  344.         uint8_t tpmsb, tplsb, i;
  345.         short s_tem;
  346.         float f_tem;
  347.         
  348.         
  349.         DS18B20_MatchRom ();            //匹配ROM
  350.         
  351.   for(i=0;i<8;i++)
  352.                 DS18B20_WriteByte ( ds18b20_id [ i ] );        
  353.         
  354.         DS18B20_WriteByte(0X44);                                /* 开始转换 */

  355.         
  356.         DS18B20_MatchRom ();            //匹配ROM
  357.         
  358.         for(i=0;i<8;i++)
  359.                 DS18B20_WriteByte ( ds18b20_id [ i ] );        
  360.         
  361.         DS18B20_WriteByte(0XBE);                                /* 读温度值 */
  362.         
  363.         tplsb = DS18B20_ReadByte();                 
  364.         tpmsb = DS18B20_ReadByte();
  365.         
  366.         
  367.         s_tem = tpmsb<<8;
  368.         s_tem = s_tem | tplsb;
  369.         
  370.         if( s_tem < 0 )                /* 负温度 */
  371.                 f_tem = (~s_tem+1) * 0.0625;        
  372.         else
  373.                 f_tem = s_tem * 0.0625;
  374.         
  375.         return f_tem;                 
  376. }

  377. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
串口调试助手截图.jpg


回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-7-21 09:59:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版