[DemoCode下载] DS18B20的操作

[复制链接]
 楼主| jiekou001 发表于 2024-2-6 18:08 | 显示全部楼层 |阅读模式
  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 "NuMicro.h"
  9. /*---------------------------------------------------------------------------*/
  10. /* Macro definition                                                          */
  11. /*---------------------------------------------------------------------------*/
  12. #define  DQ                      PB2            //DQ Pin D0

  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. }


 楼主| jiekou001 发表于 2024-2-6 18:09 | 显示全部楼层
主要就是用IO操作。
 楼主| jiekou001 发表于 2024-2-6 18:09 | 显示全部楼层
调用方式
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V3.00
  4. * @brief    DS18B20 Driver Sample Code
  5. *
  6. * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2013~2015 Nuvoton Technology Corp. All rights reserved.
  7. *
  8. ******************************************************************************/
  9. #include "stdio.h"
  10. #include "NuMicro.h"


  11. #define PLL_CLOCK       192000000

  12. int16_t DS18B20_ReadTemperature(void);

  13. void SYS_Init(void)
  14. {

  15.     /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
  16.     PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

  17.     /* Enable HXT clock (external XTAL 12MHz) */
  18.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  19.     /* Wait for HXT clock ready */
  20.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  21.     /* Set core clock as PLL_CLOCK from PLL */
  22.     CLK_SetCoreClock(PLL_CLOCK);

  23.     /* Set PCLK0/PCLK1 to HCLK/2 */
  24.     CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2);

  25.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_LXT);       
  26.        
  27.        
  28.     /* Enable UART module clock */
  29.     CLK_EnableModuleClock(UART0_MODULE);

  30.     /* Select UART module clock source as HXT and UART module clock divider as 1 */
  31.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));

  32.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  33.     SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk);
  34.     SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);
  35.                
  36.                 SystemCoreClockUpdate();

  37. }

  38. void UART0_Init()
  39. {
  40.     /* Configure UART0 and set UART0 baud rate */
  41.     UART_Open(UART0, 115200);
  42. }

  43. int32_t main(void)
  44. {

  45.                 float t;

  46.     /* Unlock protected registers */
  47.     SYS_UnlockReg();

  48.     /* Init System, peripheral clock and multi-function I/O */
  49.     SYS_Init();

  50.     /* Lock protected registers */
  51.     SYS_LockReg();

  52.     /* Init UART0 for printf */
  53.     UART0_Init();

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

  55.     printf("+-------------------------------------------------+\n");
  56.     printf("|    PH.0(Output) and PG.15(Input) Sample Code     |\n");
  57.     printf("+-------------------------------------------------+\n\n");




  58.     /* Configure PH.0 as Output mode and PG.15 as Input mode then close it */
  59.     GPIO_SetMode(PH, BIT0, GPIO_MODE_OUTPUT);
  60.     GPIO_SetMode(PG, BIT15, GPIO_MODE_INPUT);
  61.     GPIO_SetMode(PB, BIT2, GPIO_MODE_QUASI);               
  62.        
  63.     while(1)
  64.                 {
  65.                         PH0=1;
  66.                         CLK_SysTickDelay(1000000);
  67.                         PH0=0;
  68.                         CLK_SysTickDelay(1000000);
  69.                         t = DS18B20_ReadTemperature() * 0.0625;
  70.         printf("\n%f\n", t);
  71.                         CLK_SysTickDelay(1000000);
  72.                         CLK_SysTickDelay(1000000);
  73.                         CLK_SysTickDelay(1000000);
  74.                         CLK_SysTickDelay(1000000);
  75.                         CLK_SysTickDelay(1000000);
  76.                         CLK_SysTickDelay(1000000);                       
  77.                         CLK_SysTickDelay(1000000);
  78.                         CLK_SysTickDelay(1000000);
  79.                         CLK_SysTickDelay(1000000);                       
  80.                        
  81.                        
  82.                 }

  83. }
598330983 发表于 2024-2-12 21:44 | 显示全部楼层
如果用C++ 就可以很容易实现多个IO挂载多个DS18B20
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

1502

帖子

2

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