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

【经验分享】STM32 HAL库 DS18B20读取温度值

[复制链接]
STMCU小助手 发布时间:2022-4-11 10:39
DS18B20.H
  1. #ifndef __DS18B20_H
  2. #define __DS18B20_H
  3. #include "main.h"
  4. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  5. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  6. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
  7. #define GPIOA_ODR_Addr    (GPIOA_BASE+12)
  8. #define GPIOB_ODR_Addr    (GPIOB_BASE+12)
  9. #define GPIOC_ODR_Addr    (GPIOC_BASE+12)
  10. #define GPIOD_ODR_Addr    (GPIOD_BASE+12)
  11. #define GPIOE_ODR_Addr    (GPIOE_BASE+12)
  12. #define GPIOF_ODR_Addr    (GPIOF_BASE+12)
  13. #define GPIOG_ODR_Addr    (GPIOG_BASE+12)
  14. #define GPIOA_IDR_Addr    (GPIOA_BASE+8)
  15. #define GPIOB_IDR_Addr    (GPIOB_BASE+8)
  16. #define GPIOC_IDR_Addr    (GPIOC_BASE+8)
  17. #define GPIOD_IDR_Addr    (GPIOD_BASE+8)
  18. #define GPIOE_IDR_Addr    (GPIOE_BASE+8)
  19. #define GPIOF_IDR_Addr    (GPIOF_BASE+8)
  20. #define GPIOG_IDR_Addr    (GPIOG_BASE+8)
  21. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)
  22. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)
  23. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)
  24. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)
  25. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)
  26. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)
  27. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)
  28. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)
  29. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)
  30. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)
  31. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)
  32. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)
  33. #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)
  34. #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)
  35. //IO方向设置
  36. #define DS18B20_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
  37. #define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
  38. //IO操作函数
  39. #define        DS18B20_DQ_OUT PAout(0) //数据端口        PA0
  40. #define        DS18B20_DQ_IN  PAin(0)  //数据端口        PA0
  41.            
  42. uint8_t DS18B20_Init(void);                        //初始化DS18B20
  43. short DS18B20_Get_Temp(void);                //获取温度
  44. void DS18B20_Start(void);                        //开始温度转换
  45. void DS18B20_Write_Byte(uint8_t dat);//写入一个字节
  46. uint8_t DS18B20_Read_Byte(void);        //读出一个字节
  47. uint8_t DS18B20_Read_Bit(void);                //读出一个位
  48. uint8_t DS18B20_Check(void);                //检测是否存在DS18B20
  49. void DS18B20_Rst(void);                                //复位DS18B20
  50. #endif
复制代码
DS18B20.C
  1. #include "ds18b20.h"
  2. static inline void delay_ms(uint32_t delay)
  3. {
  4.         HAL_Delay(delay);
  5. }
  6. #define CPU_FREQUENCY_MHZ 72                                // CPU主频,根据实际进行修改
  7. static void delay_us(uint32_t delay)
  8. {
  9.         int last, curr, val;
  10.         int temp;
  11.         while (delay != 0)
  12.         {
  13.                 temp = delay > 900 ? 900 : delay;
  14.                 last = SysTick->VAL;
  15.                 curr = last - CPU_FREQUENCY_MHZ * temp;
  16.                 if (curr >= 0)
  17.                 {
  18.                         do
  19.                         {
  20.                                 val = SysTick->VAL;
  21.                         }
  22.                         while ((val < last) && (val >= curr));
  23.                 }
  24.                 else
  25.                 {
  26.                         curr += CPU_FREQUENCY_MHZ * 1000;
  27.                         do
  28.                         {
  29.                                 val = SysTick->VAL;
  30.                         }
  31.                         while ((val <= last) || (val > curr));
  32.                 }
  33.                 delay -= temp;
  34.         }
  35. }
  36. //复位DS18B20
  37. void DS18B20_Rst(void)           
  38. {                 
  39.         DS18B20_IO_OUT(); //SET PA0 OUTPUT
  40.     DS18B20_DQ_OUT=0; //拉低DQ
  41.     delay_us(750);    //拉低750us
  42.     DS18B20_DQ_OUT=1; //DQ=1
  43.         delay_us(15);     //15US
  44. }
  45. //等待DS18B20的回应
  46. //返回1:未检测到DS18B20的存在
  47. //返回0:存在
  48. uint8_t DS18B20_Check(void)
  49. {   
  50.         uint8_t retry=0;
  51.         DS18B20_IO_IN();//SET PA0 INPUT         
  52.     while (DS18B20_DQ_IN&&retry<200)
  53.         {
  54.                 retry++;
  55.                 delay_us(1);
  56.         };         
  57.         if(retry>=200)return 1;
  58.         else retry=0;
  59.     while (!DS18B20_DQ_IN&&retry<240)
  60.         {
  61.                 retry++;
  62.                 delay_us(1);
  63.         };
  64.         if(retry>=240)return 1;            
  65.         return 0;
  66. }
  67. //从DS18B20读取一个位
  68. //返回值:1/0
  69. uint8_t DS18B20_Read_Bit(void)                          // read one bit
  70. {
  71.     uint8_t data;
  72.         DS18B20_IO_OUT();//SET PA0 OUTPUT
  73.     DS18B20_DQ_OUT=0;
  74.         delay_us(2);
  75.     DS18B20_DQ_OUT=1;
  76.         DS18B20_IO_IN();//SET PA0 INPUT
  77.         delay_us(12);
  78.         if(DS18B20_DQ_IN)data=1;
  79.     else data=0;         
  80.     delay_us(50);           
  81.     return data;
  82. }
  83. //从DS18B20读取一个字节
  84. //返回值:读到的数据
  85. uint8_t DS18B20_Read_Byte(void)    // read one byte
  86. {        
  87.     uint8_t i,j,dat;
  88.     dat=0;
  89.         for (i=1;i<=8;i++)
  90.         {
  91.         j=DS18B20_Read_Bit();
  92.         dat=(j<<7)|(dat>>1);
  93.     }                                                   
  94.     return dat;
  95. }
  96. //写一个字节到DS18B20
  97. //dat:要写入的字节
  98. void DS18B20_Write_Byte(uint8_t dat)
  99. {            
  100.     uint8_t j;
  101.     uint8_t testb;
  102.         DS18B20_IO_OUT();//SET PA0 OUTPUT;
  103.     for (j=1;j<=8;j++)
  104.         {
  105.         testb=dat&0x01;
  106.         dat=dat>>1;
  107.         if (testb)
  108.         {
  109.             DS18B20_DQ_OUT=0;// Write 1
  110.             delay_us(2);                           
  111.             DS18B20_DQ_OUT=1;
  112.             delay_us(60);            
  113.         }
  114.         else
  115.         {
  116.             DS18B20_DQ_OUT=0;// Write 0
  117.             delay_us(60);            
  118.             DS18B20_DQ_OUT=1;
  119.             delay_us(2);                          
  120.         }
  121.     }
  122. }
  123. //开始温度转换
  124. void DS18B20_Start(void)// ds1820 start convert
  125. {                                                                  
  126.     DS18B20_Rst();           
  127.         DS18B20_Check();         
  128.     DS18B20_Write_Byte(0xcc);// skip rom
  129.     DS18B20_Write_Byte(0x44);// convert
  130. }
  131. //初始化DS18B20的IO口 DQ 同时检测DS的存在
  132. //返回1:不存在
  133. //返回0:存在            
  134. uint8_t DS18B20_Init(void)
  135. {
  136.         DS18B20_Rst();
  137.         return DS18B20_Check();
  138. }  
  139. //从ds18b20得到温度值
  140. //精度:0.1C
  141. //返回值:温度值 (-550~1250)
  142. short DS18B20_Get_Temp(void)
  143. {
  144.     uint8_t temp;
  145.     uint8_t TL,TH;
  146.         short tem;
  147.     DS18B20_Start ();                    // ds1820 start convert
  148.     DS18B20_Rst();
  149.     DS18B20_Check();         
  150.     DS18B20_Write_Byte(0xcc);// skip rom
  151.     DS18B20_Write_Byte(0xbe);// convert            
  152.     TL=DS18B20_Read_Byte(); // LSB   
  153.     TH=DS18B20_Read_Byte(); // MSB  
  154.                      
  155.     if(TH>7)
  156.     {
  157.         TH=~TH;
  158.         TL=~TL;
  159.         temp=0;//温度为负  
  160.     }else temp=1;//温度为正                    
  161.     tem=TH; //获得高八位
  162.     tem<<=8;   
  163.     tem+=TL;//获得底八位
  164.     tem=(float)tem*0.625;//转换     
  165.         if(temp)return tem; //返回温度值
  166.         else return -tem;   
  167. }
复制代码
收藏 评论0 发布时间:2022-4-11 10:39

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版