原文链接:https://www.yourcee.com/newsinfo/2925985.html


DS18B20简介

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。传感器可在3~5.5V电压工作,测温范围可达-55℃~+125℃(虽然芯片手册能到这个范围个人建议留有70%余地使用,原因你懂的),精度的话也能到±0.5℃(在-10 — 85℃范围内)传感器较为简单,基本的关于测温范围精度参数就是如上了。下图为常见搭建好简易电路的DS18B20模块


DS18B20寄存器配置

在DS18B20的手册中可以找到下面关于功能框图以及存储映射的部分的内容


字节0和1为只读寄存器,其中包含了我们主要需要获取的温度数据,字节2和3分别设置达到报警温度的上限值和下限值,其他的寄存器我们一般不用默认不动就行,传感器分辨率默认12位

当温度转换的命令发送到传感器的时候,经过传感器转换之后得到的温度数值将会以二进制字节补码的形式存储在上述寄存器的第0字节和第1字节,第0字节中存储温度数据的低位,第1字节中存储高位

对温度进行读取时,读取寄存器的低位在前,高位在后,转换之后得到的二进制数据最高位为符号位S,当符号位S=0时,直接将二进制位转换为十进制即可,而当S=1时,需要先将补码变为原码,再计算十进制值,具体关于补码原码知识可自行百度,资料应该挺多的,下图为温度寄存器的格式说明

内部框图以及寄存器部分大致就如上所述,程序编写主要可以分为三个步骤

  1. 初始化
  2. ROM指令(跟随任意必需的数据交换)
  3. DS18B20 功能指令(跟随任意必 需的数据交换)

例程烧录与接线

关于程序编写部分就不在此做出说明了,个人觉得意义不大,下面我们直接烧录编写好的程序(需要程序可在下方留言邮箱或私信邮箱),具体程序编写对照着程序代码和手册时序相信自己研究一遍对自己的帮助会更大。

下图展示了DS18B20的引脚,并且模块上已经上拉了电阻,板载了电源指示灯



ps:DS18B20正常通信时需要上拉电阻,原因可自行百度


引脚功能可参照下表

DS18B20 引脚功能
VCC 接供电电源正
DQ 数据通信引脚
GND 接供电电源负

51单片机程序烧录与接线

51单片机驱动单总线设备的教程中应该有非常多的教学是使用的DS18B20进行教学的,也是非常经典的单总线设备,想想当初学51单片机单总线也是驱动的DS18B20甚是怀念,话不多说,直接看51单片机的程序与接线


程序效果

我这里使用STC89C52单片机接上DS18B20与LCD1602的屏幕之后,烧录程序,1602显示屏上会显示获取到的温度数据,并且会在单片机串口持续输出获取到的温度数据

下面看到程序关键部分(需要程序可在下方留有或者私信邮箱)

void UsartInit()
{
 SCON=0X50;   //设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1 
 TMOD=0X20;//8位重装载 
 PCON=0X00; 
 TH1=0xFd;//波特率9600 
 TL1=0XFd; 
 ES=1;      //打开通信中断
 EA=1;      //打开总中断 
 TR1=1;     //打开计数器
}

上面部分函数在主函数中为串口初始化部分,一般需要修改波特率的可以自行计算 _TH1=0xFd; TL1=0XFd;_ 的值(不会计算百度找找51串口通信教程,挺多的)


#define LCD P2
sbit E=P0^5;
sbit RS=P0^7;
sbit RW=P0^6;
sbit BF=P2^7;

在工程中打开 _1602.h_ 看到上述部分为头部定义的引脚,可自行修改到适当位置接自己的1602屏幕,18B20接线或者修改接线端口打开 _18B20.h_ 找到下面部分代码


#include<reg52.h>
#include<intrins.h>
sbit DQ=P0^4;

上述 _sbit DQ=P0^4;_ 定义了18B20连接的端口

默认接线可参照下表

STC89c51 DS18B20 LCD1602
P05 E
P06 R/W
P07 RS
P20~27 D0~7
P04 DQ
+5V VCC VCC
GND GND GND

下方为使用的51单片机系统板以及电路原理图

原理图

接好线烧录程序之后的图片,51单片机烧录程序自行百度,相信百度能解决很多问题


我的开发板带了USB-TTL的转换电路,如果是使用最小系统板不带下载电路的话可自行购买USB-TTL的模块接到单片机的P30和P31端口做串口通信

打开串口软件,找到对应识别的端口,通信参数配置成96N81模式即可,打开串口之后不要勾选十六进制显示就可以看到正常发送到电脑上的温度数据,如下图所示


stm32程序烧录与接线

stm32的性能相比51单片机会高出很多,使用stm32驱动DS18B20的案例个人见到的相对来说较少,不过这里还是找了个串口程序然后将上面51单片机的程序移植过来,感觉和重写一遍区别不大,草率了(需要程序的都可以在下方留言或者私信邮箱)

程序默认使用的是PA0端口,有需要修改端口的可以找到 _main.c_ 中的时钟初始化函数 _void RCC_Configuration(void)//时钟初始化_ 修改需要使用端口的时钟(不一定要修改,视情况而定)

void RCC_Configuration(void)//时钟初始化
{ 
 SystemInit();
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1串口
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

端口配置函数 _void GPIO_Configuration(void)//GPIO端口配置_ 函数中可以修改对应使用的端口


void GPIO_Configuration(void)//GPIO端口配置
{
 GPIO_InitTypeDef GPIO_InitStructure;
 /*PA9,tx*/
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOA,&GPIO_InitStructure);
 /*PA10,rx*/
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA,&GPIO_InitStructure);
 /*PA0,DS18B20使用端口*/
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;   //设置IO口为开漏输出模式*/ 
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init( GPIOA,  &GPIO_InitStructure);
}


上面是端口配置部分,找到 _pbdata.h_ 文件打开,文件中有三个宏定义对应着高低电平的输出,可以参照程序中的备注


#define DS18B20_DQ_OUT_Low GPIO_ResetBits(GPIOA,GPIO_Pin_0)  //数据端口 PA0 输出低电平
#define DS18B20_DQ_OUT_High GPIO_SetBits(GPIOA,GPIO_Pin_0)  //数据端口 PA0 输出高电平
#define DS18B20_DQ_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)   //数据端口 PA0 读取

默认接线参照下表即可

DS18B20 STM32F103XXX
VCC 3.3V
DQ PA0
GND GND

DS18B20接好线之后在串口1会持续输出检测到的温度数据,和51的板子一样用了一块带USB-TTL电路的板子,没有的话自己弄个USB-TTL的模块接到STM32的串口1上面就行,串口助手换成了XCOM,之前那个HC的不知道什么情况就接收不到数据了


ps:没找到哪里的问题不知道是软件bug还是代码导致的


接线的图片

打开串口助手选择对应的端口号,参数配置成96N81,如下图所示


arduino程序烧录与接线

arduino相较于其他的单片机有非常多的库供调用,大大加快了开发调试的速度,同样的我们也是调用arduino IDE管理库里面的库进行修改(需要的小伙伴可以在下方留言邮箱或者自行在管理库里面搜索DS18B20下载即可)

程序中有定义DS18B20连接的数据引脚,波特率参数,功能实现在串口输出器件地址,精度,模式,温度信息相关信息

#include <DS18B20.h>

DS18B20 ds(2);

void setup() {
  Serial.begin(115200);
  Serial.print("Devices: ");
  Serial.println(ds.getNumberOfDevices());
  Serial.println();
}

代码段 _DS18B20 ds(2);_ 中的 2 表示接到arduino的2号引脚,可适当根据自己的需求修改为其他引脚进行连接,_Serial.begin(115200);_ 定义波特率为 115200 ,同样可进行修改,接线按照下表进行连接即可

arduino DS18B20
5V VCC
2 DQ
GND GND
下图为连接之后的图片


烧录提供的程序中Multiple的之后,打开arduino编译器的串口监视器查看输出的数据


总结

DS18B20为较为常见的单总线测温器件,在51单片机的学习过程中使用较多,以上提供的三种单片机的数据采集之后串口输出温度数据基本可以满足大部分场合移植使用,电路上如果采用单独的传感器不是模块一定要记得上拉电阻(单片机上拉模式应该也没问题,不过没有用过),需要程序等资料的朋友在下方留言或者私信邮箱即可,看到就会发过去,欢迎留言交流,大家互相学习互相进步!