STM32 DS18B20

直接上代码!

DS18B20.c

#include "DS18B20.h"
#include "../../Userxcode/Delay/delay.h"


void DS18B20_Reset(void)
{
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
	delay_us(750);
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
	//delay_us(15);
	delay_us(30);
}
uint8_t DS18B20_Check(void)
{
	uint8_t retry = 0;
	uint8_t retval = 0;
	while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11) && retry < 200)
	{
		retry++;
		delay_us(1);
	}
	if(retry >= 200) return retval = 1; //
	else retry = 0;

	while(!HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11) && retry < 240)
	{
		retry++;
		delay_us(1);
	}
	if(retry >= 240) retval =1;
	return retval;
}
uint8_t DS18B20_Init(void)
{
	DS18B20_Reset();
	return DS18B20_Check();
}
void DS18B20_Write_Byte(uint8_t data)
{
	uint8_t i,testb;
	for(i=0; i<8; i++)
	{
		testb=data&0x01;
		data=data>>1;
		if(testb)
		{
			HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
			delay_us(2);
			HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
			delay_us(60);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
			delay_us(60);
			HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
			delay_us(2);
		}
	}
	/*uint8_t testb;
	for(testb=0x01;testb!=0;testb<<=1)
	{
		HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
		delay_us(2);
		if((testb&data)==0) HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
		else HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
		delay_us(60);
	}*/
}
uint8_t DS18B20_Read_Bit(void)
{
	uint8_t data=0;
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
	delay_us(2);
	HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
	delay_us(12);

	if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11))
	{
		data=1;
	}
	delay_us(50);
	return data;
}
uint8_t DS18B20_Read_Byte(void)
{
	uint8_t i,b,data=0;
	for(i=0; i<8; i++)
	{
		b=DS18B20_Read_Bit();
		data |= b<<i;
	}
	return data;
}
void DS18B20_Start(void)
{
	DS18B20_Reset();
	DS18B20_Check();
	DS18B20_Write_Byte(0xcc);
	DS18B20_Write_Byte(0x44);
}
float DS18B20_GetTemperture(void)
{
	uint16_t temp;
	uint8_t DataH,DataL;
	float value;

	DS18B20_Start();    //
	DS18B20_Reset();
	DS18B20_Check();
	DS18B20_Write_Byte(0xcc);
	DS18B20_Write_Byte(0xbe);
	DataL=DS18B20_Read_Byte();
	DataH=DS18B20_Read_Byte();
	temp=DataH;
	temp=(temp<<8)+DataL;
	if((temp&0xF800)==0xF800)
	{
		temp=(~temp)+1;
		value=temp*0.0625;
	}
	else
	{
		value=temp*0.0625;
	}
	return value;
}

DS18B20.h

#ifndef DS18B20_DS18B20_H_
#define DS18B20_DS18B20_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
#include "main.h" //IO定义与初始化函数在main.c文件中,必须引用

uint8_t DS18B20_Init(void);
float DS18B20_GetTemperture(void);
void DS18B20_Start(void);
void DS18B20_Write_Byte(uint8_t data);
uint8_t DS18B20_Check(void);//应答
uint8_t DS18B20_Read_Byte(void);
uint8_t DS18B20_Read_Bit(void);
void DS18B20_Reset(void);

#endif /* DS18B20_DS18B20_H_ */

main.c

int main()
{
    uint16_t Value_T=0;
    uint16_t D3[3];
    float Temperture=0.0;

    while(DS18B20_Init())
      {
	      printf("等待 DS18B20 应答,请检查硬件!\r\n");
	      HAL_Delay(500);
      }
      printf("收到应答 DS18B20 初始化成功!\r\n");

    while(1)
    {
        Temperture=DS18B20_GetTemperture();
	    Value_T=(uint16_t)100*Temperture;
	    D3[0]=Value_T/1000;
	    D3[1]=Value_T%1000/100;
	    D3[2]=Value_T%1000;
        if(Temperture<0)
		  {
		  		printf("检测温度为: ");
		  }
		  else
		  {
		  		printf("数据采集实验 3:DAQ(DS18B20) 检测温度为: ");
		  }
		  printf("%.2f°C\r\n",Temperture);

    }
}

引脚设置

注:侵权删!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值