DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。
以下是DS18B20温度传感器的主要特点和操作时序:
(1)特点:
(2)操作时序: DS18B20的操作时序包括复位、写入指令、读取温度等过程。下面是DS18B20的基本操作时序:
a. 复位:
b. 发送指令:
c. 读取温度:
STM32F407开发板DS18B20应用案例
开发板硬件连接:
在工程中添加ds18b20.c和ds18b20.h文件。
DS18B20代码如下:
- #include "ds18b20.h"
-
- /*
- 函数功能:DS18b20IO口初始化
- 硬件连接:PG9
- 复用表示自动输出数据
- 通用表示手动输出数据
- */
- void DS18B20_Init(void)
- {
- /*1. 开时钟*/
- RCC->AHB1ENR|=1<<6;//使能PORTG时钟
-
- /*2. 初始化IO模式*/
- DS18B20_OUTPUT();
- }
-
-
- /*
- 函数功能:等待DS18B20的回应
- 返回1:未检测到DS18B20的存在
- 返回0:存在
- */
- u8 DS18B20_Check(void)
- {
- u8 retry=0;
- DS18B20_INPUT() //设置DS18B20输入模式
- while(DS18B20_IN&&retry<200)
- {
- retry++;
- DelayUs(1);
- };
- if(retry>=200)return 1;
- else retry=0;
- while(!DS18B20_IN&&retry<240)
- {
- retry++;
- DelayUs(1);
- };
- if(retry>=240)return 1;
- return 0;
- }
-
-
- /*
- 从DS18B20读取一个字节
- 返回值:读到的数据
- */
- u8 DS18B20_ReadByte(void)
- {
- u8 i,data=0;
- for(i=0;i<8;i++)
- {
- DS18B20_OUTPUT(); //初始化为输出模式
- DS18B20_OUT=0; //输出0
- DelayUs(2);
- DS18B20_OUT=1; //上拉总线电平
- DS18B20_INPUT() //初始化为输入模式
- DelayUs(12);
- data>>=1;
- if(DS18B20_IN)
- {
- data|=0x80;
- }
- DelayUs(50);
- }
- return data;
- }
-
-
- /*
- 写一个字节到DS18B20
- dat:要写入的字节
- */
- void DS18B20_WriteByte(u8 dat)
- {
- u8 i;
- DS18B20_OUTPUT(); //初始化IO为输出模式
- for(i=0;i<8;i++)
- {
- if(dat&0x01) //先发低位
- {
- DS18B20_OUT=0;//输出0
- DelayUs(2);
- DS18B20_OUT=1;//输出1
- DelayUs(60);
- }
- else
- {
- DS18B20_OUT=0;//输出0
- DelayUs(60);
- DS18B20_OUT=1;//输出1
- DelayUs(2);
- }
- dat>>=1;
- }
- }
-
-
- /*
- 从ds18b20得到温度值
- 精度:0.1C
- 返回值:温度值 (-550~1250)
- */
- short DS18B20_Get_Temp(void)
- {
- u16 temp;
- u8 TL,TH;
- DS18B20_OUTPUT();
- DS18B20_OUT=0; //输出0 //拉低DQ
- DelayUs(750); //拉低750us
- DS18B20_OUT=1; //输出1 //DQ=1
- DelayUs(15); //15US
-
- DS18B20_Check();
- DS18B20_WriteByte(0xcc); //跳过芯片ID检测
- DS18B20_WriteByte(0x44); //转换一次温度
-
- DS18B20_OUTPUT();
- DS18B20_OUT=0; //输出0 //拉低DQ
- DelayUs(750); //拉低750us
- DS18B20_OUT=1; //输出1 //DQ=1
- DelayUs(15); //15US
- DS18B20_Check();
-
- DS18B20_WriteByte(0xcc);// 跳过芯片ID检测
- DS18B20_WriteByte(0xbe);// 读取转换成功的温度数据
- TL=DS18B20_ReadByte(); // LSB
- TH=DS18B20_ReadByte(); // MSB
- temp=((u16)TH<<8)|TL;
- return temp;
- }
-
-
-
Ds18b20.h代码示例
- #ifndef _DS18B20_H
- #define _DS18B20_H
- #include "stm32f4xx.h"
-
- #include "sys.h"
- #include "delay.h"
- void DS18B20_Init(void);
- short DS18B20_Get_Temp(void);
- #define DS18B20_IN PGin(9)
- #define DS18B20_OUT PGout(9)
-
- #define DS18B20_INPUT() \
- {\
- GPIOG->MODER&=~(0x3<<9*2);\
- GPIOG->MODER|=0x0<<9*2;\
- GPIOG->PUPDR&=~(0x3<<9*2);\
- GPIOG->PUPDR|=0x1<<9*2;\
- }
-
- #define DS18B20_OUTPUT() \
- {\
- GPIOG->MODER&=~(0x3<<9*2);\
- GPIOG->MODER|=0x1<<9*2;\
- GPIOG->OTYPER&=~(0x1<<9);\
- GPIOG->OSPEEDR&=~(0x3<<9*2);\
- GPIOG->OSPEEDR|=0x2<<9*2;\
- GPIOG->ODR|=1<<9;\
- }
- #endif
-
-
Main.c文件示例
- #include "stm32f4xx.h" // Device header
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "usart.h"
- #include "sys.h"
- #include "exti.h"
- #include "timer.h"
- #include "pwm.h"
- #include "ds18b20.h"
-
- int main(void)
- {
- short temp;
- unsigned short intT,decT; //温度值的整数和小数部分
- LED_Init();
- KEY_Init();
- USART1_Init(84,115200);
- KEY_EXTI_Init();
- DS18B20_Init();
- while(1)
- {
- /*读取温度信息*/
- temp=DS18B20_Get_Temp();
- intT = temp >> 4; //分离出温度值整数部分
- decT = temp & 0xF; //分离出温度值小数部分
- printf("DS18B20: %d.%d *C\r\n",(int)intT,(int)decT);
- DelayMs(1000);
- }
- }
-
-
-