DS18B20型温度传感器的使用详解及Proteus仿真(附源码)

您所在的位置:网站首页 报警器的操作与使用 DS18B20型温度传感器的使用详解及Proteus仿真(附源码)

DS18B20型温度传感器的使用详解及Proteus仿真(附源码)

2024-03-15 04:01| 来源: 网络整理| 查看: 265

一、概述

DS18B20数字温度传感器提供9bit到12bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire即单总线通信方式,即仅采用一个数据线与微控制器进行通信。该传感器的温度监测范围为-55℃至+125℃,并且在温度超过-10℃至85℃之外时还具有+-0.5℃的精度。此外,DS18B20可以直接由数据线供电而不需要外部电源供电。(本篇文章重在以简单例子讲清楚该型传感器最难的部分即工作时序,同时向大家分享例程及自己遇到的编程中的“坑”,帮助大家少走弯路尽快上手该型传感器,而不追求功能上的尽善尽美,因此本文仿真只能实现正整数温度值的显示,对于小数则进行四舍五入后再显示)

二、重要特性

独特的1-wire总线接口仅需要一个管脚来通信每个设备的内部ROM上都烧写了一个独一无二的64位序列号多路采集能力使得分布式温度采集应用更加简单无需外围元件能够采用数据线供电;供电范围为3.0V至5.5V温度可测量范围为-55℃至+125℃(-67℉至+257℉)温度超过-10℃至85℃之外时还具有+-0.5℃的精度内部温度采集精度可由用户自定义为9bit至12bit(上电默认12bit)温度转换时间在12bit时达到最大值750ms用户自定义非易失性的报警设置

三、工作指令

温度转换指令:0x44(即44H),启动Ds18b20启动转换温度读暂存器指令:0xBE(即BEH),读取暂存器中的九字节数据写暂存器置零:0x4E(即4EH),把数据写入暂存器的TH、TL赋值暂存器:0x48(即48H),把暂存器中的TH、TL写入EEPROM中读电源供电方式:0xB4(即B4H):启动Ds18b20,发送电源供电方式重调EEPROM:0xB8(即B8H):把EEPROM中的TH、TL读至暂存器

四·、通过单总线访问DS18B20的顺序

初始化ROM操作指令存储器操作命令执行/数据

五、工作时序

(一)初始化(复位操作)

在初始化序列期间,总线上的主设备通过拉低1-wire总线超过480us来发送(TX)复位脉冲。之后主设备释放总线而进入接收模式(RX)。当总线释放后,5KΩ左右的上拉电阻将1-wire总线拉至高电平。当DS18B20检测到该上升沿后,其等待15us至60us后通过1-wire总线拉低60us至240us来是实现发送一个存在脉冲。

图5.1  “复位”操作时序图

根据上述描述及时序图,可以写出“复位”操作的子函数:

void Init_Ds(void)//DS18B20初始化 { Bus=0;//主动拉低480-960us(此处选择600us) Delay600us(); Bus=1;//释放总线,传感器15-60us后拉低总线 while(Bus);//等待传感器拉低; while(!Bus);//度过传感器被拉低的时间(60-240us)后主动拉高 Bus=1;//主动拉高 }

(二)控制器的“写”操作(先写低位后写高位)

“写”时段有两种情况:写“1”时段和写“0”时段。控制器通过写1时段来向DS18B20中写入逻辑1以及通过写0时段来向DS18B20中写入逻辑0。每个写时段最小必须有60us的持续时间且堵路的写时段之间至少要有1us的恢复时间。两个写时段都是由控制器通过将1-wire中先拉低来进行初始化(详见图5.2)。

为了形成写1时段,在将1-wire总线拉低后,主设备必须在15us之内释放总线。当总线释放后,5KΩ的上拉电阻将总线拉高;为了形成写0时段,在将1-wire总线拉低后,在整个时段期间控制器必须一直拉低总线(至少60us)。

在控制器初始化写时段后,DS18B20将会在15us至60us的时间窗口对1-wire总线进行采样。如果总线在采样窗口期间是高电平,则逻辑1被写入DS18B20;若总线是低电平,则逻辑0被写入DS18B20。

图5.2 “写”操作时序图

根据上述描述及时序图,可以写出“写”操作的子函数:

/********************************向DS18B20写入一字节***********************/ void Write_Ds(uchar com)//从低位开始写入 { uchar mask; for(mask=0x01;mask!=0;mask0;a--); } void Delay(uint n)//LCD1602中延时函数 { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void Delay1ms(uint t)//t毫秒延时函数 { unsigned char a,b; uint i; for(i=0;i0;b--) for(a=1;a>0;a--); } /********************************DS18B20初始化函数*************************/ void Init_Ds(void)//DS18B20初始化 { Bus=0;//主动拉低480-960us(此处选择600us) Delay600us(); Bus=1;//释放总线,传感器15-60us后拉低总线 while(Bus);//等待传感器拉低; while(!Bus);//度过传感器被拉低的时间(60-240us)后主动拉高 Bus=1;//主动拉高 } /********************************向DS18B20写入一字节***********************/ void Write_Ds(uchar com)//从低位开始写入 { uchar mask; for(mask=0x01;mask!=0;mask


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3