STM32F207 DS18B20数字式温度传感器调试记录

STM32F207 DS18B20数字式温度传感器调试记录

平台:STM32F207 HAL库。
调试内容:通过DS18B20的单线时序通讯实现温度读取。
结果:可以在仿真时,正确读出温度,握住DS18B20可以看到温度的变化。
原理图:

在这里插入图片描述
代码

ds18b20.c

#include "stm32f2xx_hal.h"
#include "DS18B20.h"
#include "string.h"
#include "stdint.h"


#define	 DQ0 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);	  //DS18B20数据串口
#define	 DQ1 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);


uint8_t  presence;

uint8_t temp_data[2] = {0x00,0x00};  //存温度高低位
uint8_t display[5] =   {0x00,0x00,0x00,0x00,0x00};//存温度转换值

uint8_t ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,	 //温度值较准
                      0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

uint8_t temp[4];	 //温度值缓存

/*
*********************************************************************************************************
*	函 数 名: Delayus
*	功能说明: us延时
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void Delayus( uint32_t uTime)
{
    uint16_t i;
    while(uTime--)
    {
        i = 23;
        while(i--);
    }
}

void DS18B20_GPIO_In(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	__HAL_RCC_GPIOC_CLK_ENABLE();
	
	GPIO_InitStruct.Pin = GPIO_PIN_2;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	//GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void DS18B20_GPIO_Out(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	__HAL_RCC_GPIOC_CLK_ENABLE();
	
	GPIO_InitStruct.Pin = GPIO_PIN_2;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	//GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);			 
}	

/*************** 初始化DS18B20  ******************************************/

int Init_DS18B20(void)
{   
	uint8_t temp;
	 
    DS18B20_GPIO_Out();     // DQ为输出 
	DQ1;                   //DQ复位
    Delayus(50);            //稍做延时70us    

    DQ0;      //将DQ拉低  
    delay_us(480);           //精确延时780us 大于 480us
    DQ1;       //拉高总线
    
    DS18B20_GPIO_In();       //置DQ为输入
	temp=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2); //读DQ值
    Delayus(50);            //稍做延时
   
    if(temp==0)      //如果=0则初始化成功 =1则初始化失败
     presence = 1;
    else  
	 presence = 0;
          
    Delayus(430);           //  延时470us
    DS18B20_GPIO_Out();      //置DQ为输出 
    DQ1;      //释放总线 
     
    return(presence);    //返回信号,0=presence,1= no presence
}


/****************写一个字节 ******************************************/

void WriteOneChar(uint8_t dat)
{
  	uint8_t i = 0;

  	DS18B20_GPIO_Out();      //置PD0为输出
	for (i = 8; i > 0; i--)	 //写一字节
  	{
		DQ0;
		
    	if(dat&0x01)
    	{
     		DQ1;      //写"1" 
    	}
		else  
		
{   
	 		DQ0;     //写"0"
		}

    	Delayus(60);
    	DQ1;        
    	dat>>=1;
  }
}


/*****************读一个字节 ****************************************/

int ReadOneChar(void)
{
	uint8_t i = 0;
    uint8_t dat = 0;

    for (i = 8; i > 0; i--)
    {
      	DQ0;      //总线为低电平
      	dat >>= 1;
    
      	DQ1;       //总线为高电平(释放总线)   
      	DS18B20_GPIO_In();       //置DQ为输入
        
      	if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2))	//读DQ
      		dat |= 0x80;

      	Delayus(70);
		DS18B20_GPIO_Out();	   //置DQ为输入
      	DQ1;  
    }
    return (dat);
}
 
 
/*************读取温度  ********************************************/

uint8_t Read_Temperature(void)
{
#if 1
   Init_DS18B20();
   if(presence==0)  
   {
     WriteOneChar(0xCC);  // 跳过读序号列号的操作
     WriteOneChar(0x44);  // 启动温度转换

     Init_DS18B20();
     WriteOneChar(0xCC);  //跳过读序号列号的操作
     WriteOneChar(0xBE);  //读取温度寄存器
     
     temp_data[0] = ReadOneChar();   //温度低8位
     temp_data[1] = ReadOneChar();   //温度高8位
    }
	temp_data[1]<<=4;
	temp_data[1]+=(temp_data[0]&0xf0)>>4;
	return temp_data[1];
   
#else
	//调试1US延时时使用
	DS18B20_GPIO_Out();
	DQ0;
	Delayus(1);
	DQ1;
#endif
}

ds18b20.h

void DS18B20_GPIO_In(void);
void DS18B20_GPIO_Out(void);
int Init_DS18B20(void);
void WriteOneChar(uint8_t dat);
int ReadOneChar(void);
uint8_t Read_Temperature(void);
void Disp_Temperature(void);

### 回答1: 基于STM32DS18B20温度传感器是目前应用较广的一种温度测量方案。DS18B20传感器采用数字式温度传感器,可以精确地测量环境的温度,并将温度的数字信号传输至STM32微控制器。 在使用DS18B20传感器时,需要通过1-Wire总线连接至STM32微控制器。该总线可以同时连接多个DS18B20传感器,以实现多点温度测量。在使用过程中,STM32通过对1-Wire总线输出不同的电平来控制DS18B20传感器执行不同的指令。在执行读取温度指令时,DS18B20传感器会将温度值转换为数字信号并返回至STM32进行数据处理。 为了保证温度传感器的准确性,需要进行校准。校准过程中,需要在已知温度的环境中,将DS18B20传感器进行校准并进行数据修正。通过精确的校准,可以提高温度测量的精度和准确度。 基于STM32DS18B20温度传感器广泛应用于温度监测领域,例如环境温度测量、生产过程温度控制等。同时,该传感器具有体积小、功耗低、精度高、成本低等优点,是一种经济、实用的温度测量方案。 ### 回答2: 基于STM32DS18B20温度传感器可以实现精准的温度测量和数据采集,并且具有数据传输速度快、功耗低、体积小等优点。该传感器采用单总线协议,通过1-Wire接口与STM32控制器通信,实现温度数据的采集与传输。在使用过程中,需要对DS18B20进行初始化设置、发送温度转换命令、读取温度值等步骤,才能实现温度数据的获取。同时,为了保证测量精度和稳定性,需要根据实际应用场景进行合理的电路设计和选用高质量的传感器件。 另外,在使用过程中还需要注意一些问题,如传感器与控制器连接时需要遵循正确的接线方法;使用时需要防止瞬时过压、电源涟漪等因素对传感器产生干扰;在进行温度转换时,需要根据实际需求选择不同的分辨率;对于不同的应用场景,还需要考虑传感器的安装方式、温度范围、测量精度等因素。 总之,基于STM32DS18B20温度传感器具有测量精度高、数据传输速度快等优点,对于温度测量和数据采集应用具有较高的实用价值。 ### 回答3: STM32是一种基于ARM Cortex-M处理器的微控制器。DS18B20是一种数字温度传感器,采用封装为TO-92S的封装形式,使用一个数据引脚进行通信。基于STM32DS18B20温度传感器是一种常见的温度测量方案,在许多应用中被广泛应用。 使用STM32控制DS18B20传感器,需要先配置引脚,在程序中设置引脚的输入或输出功能。当STM32需要读取DS18B20传感器的温度数据时,需要向传感器发出启动信号,并接收传感器发出的应答信号。然后,STM32需要发送温度数据的读取命令,并等待传感器发出温度数据的应答信号。最后,STM32接收传感器发送的温度数据,并进行处理,得到实际的温度值。 为了稳定地读取温度传感器的数据,STM32还需要对传感器进行初始化,并进行CRC校验以确保数据的准确性。此外,在程序设计中需要考虑到传感器的工作环境,比如温度变化的范围、采样频率、数据存储方式等等。 综上所述,基于STM32DS18B20温度传感器是一种常见的温度测量方案,在工业控制、自动化、环境监测等应用中具有广泛的应用前景。通过合理的程序设计及适当的硬件配置,可以实现有效、可靠、高精度的温度测量功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值