DS18B20温度传感器单片机C语言驱动程序

26 篇文章 1 订阅
19 篇文章 2 订阅

一、概述

代码参考了正点原子的例程,并经过测试,
开发环境:IAR
单片机:STM32F103C8T6

二、代码

/*******************************************************************************
  * 函数名:Port_SetMode
  * 功  能:GPIO设置输入或输出模式
  * 参  数:*GPIOx 引脚组号
			GPIO_Pin引脚号
			u32Mode输入或输出模式
  * 返回值:无
  * 说  明:无
*******************************************************************************/
void Port_SetMode(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint32_t u32Mode)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = GPIO_Pin;
	GPIO_InitStruct.Mode = u32Mode;
	//GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}

相关引脚驱动宏定义

#define DS18B20_DQSet()					HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET)
#define DS18B20_DQReset()				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
#define DS18B20_DQModeOutput()			Port_SetMode(GPIOB, GPIO_PIN_6, GPIO_MODE_OUTPUT_PP)
#define DS18B20_DQModeInput()			Port_SetMode(GPIOB, GPIO_PIN_6, GPIO_MODE_INPUT)
#define DS18B20_DIORead()				HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)

驱动程序

/*******************************************************************************
  * 函数名:DS18B20_set
  * 功  能:DS18B20复位
  * 参  数:无
  * 返回值:无
  * 说  明:复位
*******************************************************************************/
void DS18B20_Reset(void)
{
	DS18B20_DQModeOutput();//设置为输出
	DS18B20_DQReset();//低电平
	delay_us(750);//750us
	DS18B20_DQSet();//高电平
	delay_us(15);//15us	
}
/*******************************************************************************
  * 函数名:DS18B20_Check
  * 功  能:检测DS18B20是否存在
  * 参  数:无
  * 返回值:1不存在,0存在
  * 说  明:无
*******************************************************************************/
uint8_t DS18B20_Check(void)
{
	uint8_t u8Retry = 0;
	DS18B20_DQModeInput();//设置为输入
	while ((DS18B20_DIORead() == 1)&&(u8Retry < 200))
	{
		u8Retry++;
		delay_us(1);
	}
	
	if (u8Retry >= 200)
	{
		return 1;
	}else
	{
		u8Retry = 0;
	}
	while ((DS18B20_DIORead() == 0) && (u8Retry < 240))
	{
		u8Retry++;
		delay_us(1);
	}
	if(u8Retry >= 120)
	{
		return 1;
	}
	return 0;	
}
/*******************************************************************************
  * 函数名:DS18B20_WriteByte
  * 功  能:向DS18B20写入一个字节
  * 参  数:u8Data:要写入的数据
  * 返回值:无
  * 说  明:
*******************************************************************************/
void DS18B20_WriteByte(uint8_t u8Data)
{
	uint8_t tempIndex,tempData;
	DS18B20_DQModeOutput();//设置为输出
	for (tempIndex = 1; tempIndex <= 8; tempIndex++)
	{
		tempData = (u8Data & 0x01);
		u8Data >>= 1;
		if (tempData == 1)
		{
			DS18B20_DQReset();//低电平
			delay_us(2);
			DS18B20_DQSet();//高电平
			delay_us(60);//延时60us
		}else
		{
			DS18B20_DQReset();//低电平
			delay_us(60);//延时60us
			DS18B20_DQSet();//高电平
			delay_us(2);
		}		
	}
}
/*******************************************************************************
  * 函数名:DS18B20_ReadBit
  * 功  能:从DS18B20读取一个位
  * 参  数:无
  * 返回值:1或0
  * 说  明:无
*******************************************************************************/
uint8_t DS18B20_ReadBit(void)
{
	uint8_t u8Data = 0;
	DS18B20_DQModeOutput();//设置为输出
	DS18B20_DQReset();//低电平
	delay_us(2);
	DS18B20_DQSet();//高电平
	DS18B20_DQModeInput();//设置为输入
	delay_us(12);
	u8Data = ((DS18B20_DIORead() == 1) ? 1 : 0);
	delay_us(50);
	return u8Data;
}
/*******************************************************************************
  * 函数名:DS18B20_ReadByte
  * 功  能:从DS18B20读取一个字节
  * 参  数:无
  * 返回值:u8Data读出的数据
  * 说  明:无
*******************************************************************************/
uint8_t DS18B20_ReadByte(void)
{
	uint8_t i,j, u8Ddata = 0;
	
	for (i = 1; i <= 8; i++)
	{		
		j = DS18B20_ReadBit();
		u8Ddata = (j << 7) | (u8Ddata >> 1);
	}	
	return u8Ddata;
}
/*******************************************************************************
  * 函数名:DS18B20_Start
  * 功  能:开始温度转换
  * 参  数:无
  * 返回值:无
  * 说  明:无
*******************************************************************************/
void DS18B20_Start(void)
{
	DS18B20_Reset();
	DS18B20_Check();
	DS18B20_WriteByte(0xCC);//跳过ROM
	DS18B20_WriteByte(0x44);//温度转换	
}

其中用到的微秒延时函数,可参考另一篇博客《通用定时器实现STM32单片机微秒级延时函数》。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值