一、前言
参考资料:
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)|