[STM32F4] STM32F407开发板DS18B20应用案例

[复制链接]
 楼主| 尽快回复过 发表于 2023-8-27 17:53 | 显示全部楼层 |阅读模式
【1】DS18B20介绍
DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。

以下是DS18B20温度传感器的主要特点和操作时序:

(1)特点:

单总线接口:DS18B20使用单一的数据线进行通信,简化了连接和控制。
高精度测量:具有12位的温度分辨率,可测量范围为-55°C至+125°C。
数字输出:温度值以二进制形式传输,便于处理和解析。
内部存储:传感器可内部存储温度数据和配置信息。
低功耗:在非活动状态下,传感器可以进入睡眠模式以降低功耗消耗。

 楼主| 尽快回复过 发表于 2023-8-27 17:53 | 显示全部楼层
(2)操作时序: DS18B20的操作时序包括复位、写入指令、读取温度等过程。下面是DS18B20的基本操作时序:

a. 复位:

主机拉低数据线,持续至少480μs作为复位信号。
主机释放数据线,等待15μs以上。
 楼主| 尽快回复过 发表于 2023-8-27 17:53 | 显示全部楼层
b. 发送指令:

主机发出写入指令(如跳过ROM指令或匹配ROM指令)。
指令由主机通过数据线逐位发送,每位的有效时间为60μs。
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
c. 读取温度:

主机发出读取温度指令。
传感器将温度数据以序列的形式发送给主机,每位的有效时间为60μs。
主机在接收到所有数据后,需提供适当的延迟时间进行解析和处理。
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
【2】硬件连线说明
STM32F407开发板DS18B20应用案例
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
开发板硬件连接: 4942164eb1d4b42019.png
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
【3】源代码
在工程中添加ds18b20.c和ds18b20.h文件。

DS18B20代码如下:
 楼主| 尽快回复过 发表于 2023-8-27 17:54 | 显示全部楼层
  1. #include "ds18b20.h"

  2. /*
  3. 函数功能:DS18b20IO口初始化
  4. 硬件连接:PG9
  5. 复用表示自动输出数据
  6. 通用表示手动输出数据
  7. */
  8. void DS18B20_Init(void)
  9. {
  10.                 /*1. 开时钟*/
  11.           RCC->AHB1ENR|=1<<6;//使能PORTG时钟
  12.                
  13.                 /*2. 初始化IO模式*/
  14.                 DS18B20_OUTPUT();       
  15. }


  16. /*
  17. 函数功能:等待DS18B20的回应
  18. 返回1:未检测到DS18B20的存在
  19. 返回0:存在
  20. */
  21. u8 DS18B20_Check(void)           
  22. {   
  23.         u8 retry=0;
  24.         DS18B20_INPUT()   //设置DS18B20输入模式
  25.   while(DS18B20_IN&&retry<200)
  26.         {
  27.                 retry++;
  28.                 DelayUs(1);
  29.         };         
  30.         if(retry>=200)return 1;
  31.         else retry=0;
  32.   while(!DS18B20_IN&&retry<240)
  33.         {
  34.                 retry++;
  35.                 DelayUs(1);
  36.         };
  37.         if(retry>=240)return 1;            
  38.         return 0;
  39. }


  40. /*
  41. 从DS18B20读取一个字节
  42. 返回值:读到的数据
  43. */
  44. u8 DS18B20_ReadByte(void)
  45. {        
  46.         u8 i,data=0;
  47.         for(i=0;i<8;i++)
  48.         {
  49.                         DS18B20_OUTPUT();  //初始化为输出模式
  50.                         DS18B20_OUT=0;                 //输出0
  51.                         DelayUs(2);        
  52.                         DS18B20_OUT=1;     //上拉总线电平
  53.                         DS18B20_INPUT()    //初始化为输入模式
  54.                         DelayUs(12);
  55.                   data>>=1;
  56.                         if(DS18B20_IN)
  57.                         {
  58.                                         data|=0x80;                
  59.                         }                       
  60.                         DelayUs(50);
  61.         }                                                    
  62.   return data;
  63. }


  64. /*
  65. 写一个字节到DS18B20
  66. dat:要写入的字节
  67. */
  68. void DS18B20_WriteByte(u8 dat)     
  69. {            
  70.                 u8 i;
  71.                 DS18B20_OUTPUT(); //初始化IO为输出模式
  72.                 for(i=0;i<8;i++)
  73.                 {
  74.                                 if(dat&0x01) //先发低位
  75.                                 {
  76.                                         DS18B20_OUT=0;//输出0
  77.                                         DelayUs(2);                           
  78.                                         DS18B20_OUT=1;//输出1
  79.                                         DelayUs(60);            
  80.                                 }
  81.                                 else
  82.                                 {
  83.                                         DS18B20_OUT=0;//输出0
  84.                                         DelayUs(60);            
  85.                                         DS18B20_OUT=1;//输出1
  86.                                         DelayUs(2);                          
  87.                                 }
  88.                                 dat>>=1;
  89.                  }
  90. }


  91. /*
  92. 从ds18b20得到温度值
  93. 精度:0.1C
  94. 返回值:温度值 (-550~1250)
  95. */
  96. short DS18B20_Get_Temp(void)
  97. {
  98.                 u16 temp;
  99.                 u8 TL,TH;
  100.                 DS18B20_OUTPUT();
  101.     DS18B20_OUT=0;                //输出0 //拉低DQ
  102.     DelayUs(750);     //拉低750us
  103.     DS18B20_OUT=1;    //输出1 //DQ=1
  104.                 DelayUs(15);      //15US          
  105.        
  106.     DS18B20_Check();         
  107.     DS18B20_WriteByte(0xcc); //跳过芯片ID检测
  108.     DS18B20_WriteByte(0x44); //转换一次温度
  109.        
  110.     DS18B20_OUTPUT();
  111.     DS18B20_OUT=0;   //输出0 //拉低DQ
  112.     DelayUs(750);    //拉低750us
  113.     DS18B20_OUT=1;         //输出1 //DQ=1
  114.     DelayUs(15);     //15US
  115.     DS18B20_Check();         
  116.        
  117.     DS18B20_WriteByte(0xcc);// 跳过芯片ID检测
  118.     DS18B20_WriteByte(0xbe);// 读取转换成功的温度数据
  119.     TL=DS18B20_ReadByte();  // LSB   
  120.     TH=DS18B20_ReadByte();  // MSB  
  121.     temp=((u16)TH<<8)|TL;
  122.         return temp;
  123. }


 楼主| 尽快回复过 发表于 2023-8-27 17:55 | 显示全部楼层
Ds18b20.h代码示例
  1. #ifndef _DS18B20_H
  2. #define _DS18B20_H
  3. #include "stm32f4xx.h"

  4. #include "sys.h"
  5. #include "delay.h"
  6. void DS18B20_Init(void);
  7. short DS18B20_Get_Temp(void);
  8. #define DS18B20_IN PGin(9)
  9. #define DS18B20_OUT PGout(9)

  10. #define DS18B20_INPUT()  \
  11.                                 {\
  12.                                         GPIOG->MODER&=~(0x3<<9*2);\
  13.                                         GPIOG->MODER|=0x0<<9*2;\
  14.                                         GPIOG->PUPDR&=~(0x3<<9*2);\
  15.                                         GPIOG->PUPDR|=0x1<<9*2;\
  16.                                 }
  17.                                
  18. #define DS18B20_OUTPUT() \
  19.                                 {\
  20.                                          GPIOG->MODER&=~(0x3<<9*2);\
  21.                                          GPIOG->MODER|=0x1<<9*2;\
  22.                                          GPIOG->OTYPER&=~(0x1<<9);\
  23.                                          GPIOG->OSPEEDR&=~(0x3<<9*2);\
  24.                                          GPIOG->OSPEEDR|=0x2<<9*2;\
  25.                                          GPIOG->ODR|=1<<9;\
  26.                                 }
  27. #endif

 楼主| 尽快回复过 发表于 2023-8-27 17:55 | 显示全部楼层
Main.c文件示例
  1. #include "stm32f4xx.h" // Device header
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "key.h"
  5. #include "usart.h"
  6. #include "sys.h"
  7. #include "exti.h"
  8. #include "timer.h"
  9. #include "pwm.h"
  10. #include "ds18b20.h"

  11. int main(void)
  12. {
  13.                 short temp;
  14.                 unsigned short intT,decT;           //温度值的整数和小数部分
  15.                 LED_Init();
  16.                 KEY_Init();
  17.                 USART1_Init(84,115200);
  18.                 KEY_EXTI_Init();
  19.                 DS18B20_Init();
  20.           while(1)
  21.                 {
  22.                           /*读取温度信息*/
  23.                                 temp=DS18B20_Get_Temp();
  24.                                 intT = temp >> 4;             //分离出温度值整数部分
  25.                                 decT = temp & 0xF;            //分离出温度值小数部分
  26.                                 printf("DS18B20: %d.%d *C\r\n",(int)intT,(int)decT);
  27.                                 DelayMs(1000);
  28.                 }
  29. }


 楼主| 尽快回复过 发表于 2023-8-27 17:55 | 显示全部楼层
Stahan 发表于 2023-9-2 23:42 | 显示全部楼层
这个不是对时序要求严格吗
MessageRing 发表于 2023-9-3 21:16 | 显示全部楼层
Stahan 发表于 2023-9-2 23:42
这个不是对时序要求严格吗

时序很好控制的
caigang13 发表于 2024-5-4 11:33 来自手机 | 显示全部楼层
DS18B20温度传感器是学单片机用的第一款传感器
Bowclad 发表于 2024-5-12 22:52 | 显示全部楼层
这个时序应该是很好控制的吧
帛灿灿 发表于 2024-9-16 07:20 | 显示全部楼层

它是由两个尺寸相同、匝数相同的线圈对称地绕制在同一个铁氧体环形磁芯
Bblythe 发表于 2024-9-16 08:23 | 显示全部楼层

镀半孔或c形孔是在板的边缘上镀半个半孔的一半。
周半梅 发表于 2024-9-16 10:19 | 显示全部楼层

这种电路结构的特点是:由四只相同的开关管接成电桥结构驱动脉冲变压器原边。
Pulitzer 发表于 2024-9-16 11:22 | 显示全部楼层

这种技术称为板对板焊接
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

598

帖子

0

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

44

主题

598

帖子

0

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