HT32F52352+DS18B20温度传感器

本文详细介绍了如何在HT32F52352单片机上通过DS18B20传感器测量环境温度,包括GPIO端口配置、DS18B20接口初始化、数据读取等步骤,并提供了相应的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单总线,HT32F52352读取DS18B20数据来测量环境温度(相关库会发布在资源)

一、以下是端口配置:

#include "ds18b20.h"

#define DS18B20_Port GPIO_PC
#define HT_DS18B20_Port HT_GPIOC
#define DS18B20_Pin GPIO_PIN_5
#define DS18B20_AFIO_PIN AFIO_PIN_5

/*******************IO口初始化********************/
void DS18B20_IO_Init(void )
{
	CKCU_PeripClockConfig_TypeDef CCLOCK;
	
	CCLOCK.Bit.PC    = 1;
	CCLOCK.Bit.AFIO  = 1;	
	CKCU_PeripClockConfig(CCLOCK, ENABLE);
	
	AFIO_GPxConfig(DS18B20_Port, DS18B20_AFIO_PIN, AFIO_FUN_GPIO);//复用
	
	GPIO_PullResistorConfig(HT_DS18B20_Port,DS18B20_Pin , GPIO_PR_UP);
	GPIO_DirectionConfig(HT_DS18B20_Port, DS18B20_Pin, GPIO_DIR_OUT);
}

/**************************输入模式**************************/
void DS18B20_IN(void )
{
	GPIO_PullResistorConfig(HT_DS18B20_Port,DS18B20_Pin , GPIO_PR_UP);//上拉
	GPIO_DirectionConfig(HT_DS18B20_Port, DS18B20_Pin, GPIO_DIR_IN);
	GPIO_InputConfig(HT_DS18B20_Port, DS18B20_Pin, ENABLE);
}
/*************************输出模式************************/
void DS18B20_OUT(void )
{
	GPIO_OpenDrainConfig(HT_DS18B20_Port,DS18B20_Pin,DISABLE);//推挽输出
	GPIO_DirectionConfig(HT_DS18B20_Port, DS18B20_Pin, GPIO_DIR_OUT);
}
/****************************输出高低电平********************/
void DS18B20_DQ_OUT(uint8_t dat)
{
	DS18B20_OUT();
	if(dat == 0)
		GPIO_WriteOutBits (HT_DS18B20_Port,DS18B20_Pin,RESET);
	else
		GPIO_WriteOutBits (HT_DS18B20_Port,DS18B20_Pin,SET);
}
/****************************读取******************************/
uint8_t DS18B20_DQ_IN(void )
{
	uint8_t dat = 0;
	
	DS18B20_IN();
	dat = GPIO_ReadInBit (HT_DS18B20_Port,DS18B20_Pin);
	return dat;
}

二、以下是DS18B20相关功能函数

/*******************DS18B20初始化*************************/
uint8_t Init_DS18B20(void)
{
	uint8_t dat=0;
	DS18B20_IO_Init();
	DS18B20_DQ_OUT(1);    			     //DQ复位
	delay_us(10);  	 	    //稍做延时
	DS18B20_DQ_OUT(0);      		   //单片机将DQ拉低
	delay_us(800); 		  //精确延时 大于 480us 小于960us
	DS18B20_DQ_OUT(1);       		 //拉高总线
	delay_us(80); 		//15~60us 后 接收60-240us的存在脉冲
	dat=DS18B20_DQ_IN();            //如果x=0则初始化成功, x=1则初始化失败
	delay_us(20);      //稍作延时返回
	return dat;
}

/***************************写*********************/
void WriteOneChar(uint8_t dat)
{
	uint8_t i=0;
	for (i=8; i>0; i--)
	{
		DS18B20_DQ_OUT(0); 
		DS18B20_DQ_OUT(dat&0x01);
		delay_us(50);
		DS18B20_DQ_OUT(1); 
		dat>>=1;
	}
	delay_us(50);
}
/*************************读***************************/
uint8_t ReadOneChar()
{
	uint8_t i=0;
	uint8_t dat = 0;
	for (i=8;i>0;i--)
	{
		DS18B20_DQ_OUT(0); // 给脉冲信号
		dat>>=1;
		DS18B20_DQ_OUT(1); ; // 给脉冲信号
		if(DS18B20_DQ_IN())
		 dat|=0x80;
		delay_us(50);
	}
	return(dat);
}
/***********************读取温度及数据处理**********************/
float ReadTemperature(void)
{
	uint8_t a=0;
	uint16_t b=0;
	float t=0;
	
	if(Init_DS18B20() == 0)//判断初始化是否成功
	{
		WriteOneChar(0xCC);  // 跳过读序号列号的操作
		WriteOneChar(0x44); // 启动温度转换
		delay_us(10);
		Init_DS18B20();
		WriteOneChar(0xCC);  //跳过读序号列号的操作
		WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
		a=ReadOneChar();   //低位
		b=ReadOneChar();  //高位


		b<<=8;
		t=(a+b)*0.0625;
	}
	else
		t = 0.0f;
	

	return(t);//**返回读取到的温度值**
}

本次代码借鉴了其它博主的文章,笔者学识有限,如果有不当之处,欢迎在评论区斧正。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EE蒋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值