STM32--DS18B20温度传感器相关(2)单总线多个DS18B20温度采集

本文介绍了使用STM32进行DS18B20温度传感器的单总线多设备温度采集。通过KEIL5开发环境,实现了对多个DS18B20的温度测量,每5秒更新一次数据,并详细阐述了ROM搜索算法。附带相关代码资源。
摘要由CSDN通过智能技术生成

一、前言

参考资料:
DS18B20 Datasheet
正点原子DS18B20数字温度传感器实验源码
野火DS18B20数字温度传感器实验源码
DS18B20 1-WIRE ROM搜索算法详解(1)

硬件环境:
正点原子 STM32F407 探索者

开发环境:
KEIL5

代码下载链接:
https://download.csdn.net/download/Constantine1954/18862293

二、代码

DS18B20的特性及基础代码上一篇已经介绍过,在此不做赘述。
单总线ROM搜索算法的思想请参照参考资料中的DS18B20 1-WIRE ROM搜索算法详解。
直接贴代码:

1. DS18B20.c

/*
功能:实现单总线多个DS18B20的温度测量,定时器中断,串口打印ID及温度
最后修改日期:2021.05.18
作者:Constantine
硬件:正点原子STM32F407 探索者
*/
#include "ds18b20.h"
#include "delay.h"	

#define MaxSensorNum 8
unsigned char DS18B20_ID[MaxSensorNum][8];	// 存检测到的传感器DS18B20_ID的数组,前面的维数代表单根线传感器数量上限
unsigned char DS18B20_SensorNum;			// 检测到的传感器数量(从1开始,例如显示1代表1个,8代表8个)


/*
模块功能:复位DS18B20
返回值:无
*/
 void DS18B20_Rst(void)	   
{
                    
	DS18B20_IO_OUT(); //SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; //拉低DQ
  delay_us(750);    //拉低750us
  DS18B20_DQ_OUT=1; //DQ=1 
	delay_us(15);     //15US
}

/*
模块功能:/等待DS18B20的回应
返回值:返回1:未检测到DS18B20的存在
       返回0:存在
*/

u8 DS18B20_Check(void) 	   
{
      
	u8 retry=0;
	DS18B20_IO_IN();//SET PG11 INPUT	 
    while (DS18B20_DQ_IN&&retry<200)
	{
   
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;  
    while (!DS18B20_DQ_IN&&retry<240)
	{
   
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}

/*
模块功能:从DS18B20读取1个位
返回值:1/0
*/
u8 DS18B20_Read_Bit(void) 			 // read one bit
{
   
  u8 data;
	DS18B20_IO_OUT();//SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; 
	delay_us(2);
  DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();//SET PG11 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
  else data=0;	 
  delay_us(50);           
  return data;
}


/*
模块功能:从DS18B20读取2个位
返回值:00/01/10/11
*/
u8 DS18B20_Read_2Bit(void)//读二位 子程序
{
   
	u8 i;
	u8 data = 0;
	for (i = 2; i > 0; i--)
	{
   
		data = data << 1;
		DS18B20_IO_OUT();
    DS18B20_DQ_OUT=0;
		delay_us(2);
		DS18B20_DQ_OUT=1;
		DS18B20_IO_IN();
		delay_us(12);
		if (DS18B20_DQ_IN)	data |= 0x01;
		delay_us(50);
	}
	return data;
}


/*
模块功能:从DS18B20读取1个字节
返回值:读到的字节
*/
u8 DS18B20_Read_Byte(void)    // read one byte
{
           
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
   
        j=DS18B20_Read_Bit();
        dat=(j<<7)|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值