[DemoCode下载] 18B20单线传感器操作方法

[复制链接]
1396|18
 楼主| 598330983 发表于 2023-2-12 17:03 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     DS18B20.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Date: 19/06/17 3:56p $
  5. * [url=home.php?mod=space&uid=247401]@brief[/url] DS18B20 Driver
  6. *
  7. *****************************************************************************/
  8. #include "mini51series.h"
  9. /*---------------------------------------------------------------------------*/
  10. /* Macro definition                                                          */
  11. /*---------------------------------------------------------------------------*/
  12. #define  DQ                      P52            //DQ Pin

  13. #define  CMD_SKIP_ROM            0xCC
  14. #define  CMD_CONVERT_T           0x44
  15. #define  CMD_READ_SCRATCHPAD     0xBE
  16. /*---------------------------------------------------------------------------*/
  17. /* Functions                                                                 */
  18. /*---------------------------------------------------------------------------*/
  19. static void DS18B20_Reset(void);
  20. static void DS18B20_WriteByte(uint8_t u8dat);
  21. static uint8_t DS18B20_ReadByte(void);



  22. /**
  23.   * @brief  Read temperature from DS18B20
  24.   * @param  None
  25.   * [url=home.php?mod=space&uid=266161]@return[/url]  i16temp: temperature
  26.   */
  27. int16_t DS18B20_ReadTemperature(void)
  28. {
  29.     uint8_t  u8tempH, u8tempL;
  30.     int16_t  i16temp;

  31.     DS18B20_Reset();
  32.     DS18B20_WriteByte(CMD_SKIP_ROM);
  33.     DS18B20_WriteByte(CMD_CONVERT_T);

  34.     while (!DQ);                             //Waiting for conversion to complete

  35.     DS18B20_Reset();
  36.     DS18B20_WriteByte(CMD_SKIP_ROM);
  37.     DS18B20_WriteByte(CMD_READ_SCRATCHPAD);
  38.     u8tempL = DS18B20_ReadByte();            //Read temperature low byte
  39.     u8tempH = DS18B20_ReadByte();            //Read temperature high byte
  40.     i16temp = (u8tempH << 8) | u8tempL;

  41.     return (i16temp);
  42. }



  43. /**
  44.   * @brief  Reset the DS18B20 and check if the device is present
  45.   * @param  None
  46.   * @return None
  47.   */
  48. static void DS18B20_Reset(void)
  49. {
  50.     uint8_t i;
  51.     i = 1;

  52.     while (i)
  53.     {
  54.         DQ = 0;                              //Send a low level reset signal
  55.         CLK_SysTickDelay(480);               //Delay at least 480us
  56.         DQ = 1;                              //Release data line
  57.         CLK_SysTickDelay(60);                //Waiting for 60us
  58.         i = DQ;                              //Detect the presence of pulses
  59.         CLK_SysTickDelay(420);               //Waiting for the device to release the data line
  60.     }
  61. }


  62. /**
  63.   * @brief  Read 1 byte data from DS18B20
  64.   * @param  None
  65.   * @return u8dat: Read data
  66.   */
  67. static uint8_t DS18B20_ReadByte(void)
  68. {
  69.     uint8_t i;
  70.     uint8_t u8dat = 0;

  71.     for (i = 0; i < 8; i++)
  72.     {
  73.         u8dat >>= 1;
  74.         DQ = 0;                              //Start time slice
  75.         CLK_SysTickDelay(1);                 //Delay waiting
  76.         DQ = 1;                              //Ready to receive
  77.         CLK_SysTickDelay(1);                 //Reception delay

  78.         if (DQ) u8dat |= 0x80;               //Read data

  79.         CLK_SysTickDelay(60);                //Waiting for the end of time
  80.     }

  81.     return u8dat;
  82. }


  83. /**
  84.   * @brief  Write 1 byte of data to the DS18B20
  85.   * @param  u8dat            Write data
  86.   * @return None
  87.   */
  88. static void DS18B20_WriteByte(uint8_t u8dat)
  89. {
  90.     uint8_t i;

  91.     for (i = 0; i < 8; i++)
  92.     {
  93.         DQ = 0;                              //Start time slice
  94.         CLK_SysTickDelay(1);                 //Delay waiting

  95.         if (u8dat & 0x01) DQ = 1;            //Send data

  96.         CLK_SysTickDelay(60);                //Waiting for the end of time
  97.         DQ = 1;                              //Restore data line
  98.         CLK_SysTickDelay(1);                 //Recovery delay
  99.         u8dat >>= 1;
  100.     }
  101. }


 楼主| 598330983 发表于 2023-2-12 17:03 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Date: 19/06/17 3:56p $
  5. * @brief    MINI51 DS18B20 Driver Sample Code
  6. *
  7. * @note
  8. * Copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  9. *
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "mini51series.h"

  13. int16_t DS18B20_ReadTemperature(void);

  14. void SYS_Init(void)
  15. {
  16.     /* Unlock protected registers */
  17.     SYS_UnlockReg();

  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Init System Clock                                                                                       */
  20.     /*---------------------------------------------------------------------------------------------------------*/

  21.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  22.     CLK->PWRCON |= CLK_PWRCON_XTL12M | CLK_PWRCON_IRC22M_EN_Msk;

  23.     /* Waiting for clock ready */
  24.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

  25.     /* Switch HCLK clock source to XTL */
  26.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_XTAL, CLK_CLKDIV_HCLK(1));

  27.     /* STCLK to XTL STCLK to XTL */
  28.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_XTAL);

  29.     /* Enable IP clock */
  30.     CLK_EnableModuleClock(UART_MODULE);

  31.     /* Select IP clock source */
  32.     CLK_SetModuleClock(UART_MODULE, CLK_CLKSEL1_UART_S_XTAL, CLK_CLKDIV_UART(1));

  33.     /*---------------------------------------------------------------------------------------------------------*/
  34.     /* Init I/O Multi-function                                                                                 */
  35.     /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Set P0 multi-function pins for UART RXD and TXD */
  37.     SYS->P0_MFP &= ~(SYS_MFP_P01_Msk | SYS_MFP_P00_Msk);
  38.     SYS->P0_MFP |= (SYS_MFP_P01_RXD | SYS_MFP_P00_TXD);

  39.     /* To update the variable SystemCoreClock */
  40.     SystemCoreClockUpdate();

  41.     /* Lock protected registers */
  42.     SYS_LockReg();
  43. }

  44. void UART_Init(void)
  45. {
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Init UART                                                                                               */
  48.     /*---------------------------------------------------------------------------------------------------------*/
  49.     /* Reset IP */
  50.     SYS_ResetModule(SYS_IPRSTC2_UART_RST_Msk);

  51.     /* Configure UART and set UART Baudrate */
  52.     UART_Open(UART, 115200);

  53. }

  54. /*---------------------------------------------------------------------------------------------------------*/
  55. /* MAIN function                                                                                           */
  56. /*---------------------------------------------------------------------------------------------------------*/
  57. int main(void)
  58. {
  59.     float t;

  60.     /* Init System, IP clock and multi-function I/O */
  61.     SYS_Init(); //In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register.

  62.     /* Init UART for printf */
  63.     UART_Init();

  64.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  65.     printf("+-------------------------------------+ \n");
  66.     printf("|        DS18B20 Sample Code          | \n");
  67.     printf("+-------------------------------------+ \n");

  68.     /* Configure P5.2 as Quasi mode  */
  69.     GPIO_SetMode(P5, BIT2, GPIO_PMD_QUASI);

  70.     while (1)
  71.     {
  72.         t = DS18B20_ReadTemperature() * 0.0625;
  73.         printf("\n%f\n", t);
  74.         CLK_SysTickDelay(1000000);//delay 1 sec
  75.     }

  76. }


tpgf 发表于 2023-3-3 09:07 | 显示全部楼层
18B20是非常经典的温度传感器了  用的是iic总线通讯
nawu 发表于 2023-3-3 09:43 | 显示全部楼层
关于这个传感器的代码示例太多了  调试起来的难点还是在波形的精准上
aoyi 发表于 2023-3-3 10:29 | 显示全部楼层
看代码应该是 使用的普通的引脚模拟的是吗
zljiu 发表于 2023-3-3 10:37 | 显示全部楼层
为什么有时候在正常运行的时候会受到错误码呢
gwsan 发表于 2023-3-3 10:56 | 显示全部楼层
zljiu 发表于 2023-3-3 10:37
为什么有时候在正常运行的时候会受到错误码呢

估计可能有干扰信号了   然后还能恢复正常吗
tfqi 发表于 2023-3-3 11:10 | 显示全部楼层
gwsan 发表于 2023-3-3 10:56
估计可能有干扰信号了   然后还能恢复正常吗

这个说不好  这得看是什么原因导致总线上返回错误码的
AdaMaYun 发表于 2023-3-6 15:01 | 显示全部楼层
体积小,硬件开销低,抗干扰能力强,精度高,这个接线方式还有很多种
海滨消消 发表于 2023-3-21 11:33 来自手机 | 显示全部楼层
代码看着就那么多,调试起来也没多容易
豌豆爹 发表于 2023-3-22 15:28 来自手机 | 显示全部楼层
使用的什么引脚模拟的
claretttt 发表于 2023-4-16 22:08 | 显示全部楼层
可以通过单线协议进行通信。               
51xlf 发表于 2023-4-18 12:25 | 显示全部楼层
使用Arduino开发板和DS18B20温度传感器
adolphcocker 发表于 2023-4-18 13:51 | 显示全部楼层
在使用DS18B20单线传感器时,还需要实现CRC校验以确保数据完整性和准确性。
albertaabbot 发表于 2023-4-18 16:30 | 显示全部楼层
初始化:将单线总线拉高,并保持至少480微秒,然后将总线拉低,持续60-240微秒,意味着开始一个操作。

发送指令:在总线上发送指令(例如读取温度)。

接收响应:释放总线,并等待从DS18B20返回的响应信号。如果DS18B20准备好了,则它会拉低总线15-60微秒作为响应信号。

读取数据:依次读取每个字节的数据,共计9个字节。第一个字节是温度数据的最低位,第二个字节是温度数据的次低位,第三个字节是温度数据的次高位,第四个字节是温度数据的最高位。

计算温度值:使用读取到的4个字节的数据计算出温度值。

完成操作:拉低总线至少1微秒,表示完成操作。
Jacquetry 发表于 2023-4-18 23:17 | 显示全部楼层
单总线对时间的精度要求比较高
huangcunxiake 发表于 2023-4-19 19:06 | 显示全部楼层
这个用的很多的。
星辰大海不退缩 发表于 2023-4-23 20:57 | 显示全部楼层
调试过程还是有好多经验的
AloneKaven 发表于 2023-5-10 23:58 | 显示全部楼层
单总线对时间要求很严格
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部