历史上的今天
今天是:2024年10月26日(星期六)
2021年10月26日 | #51单片机#DS18B20硬件原理以及通信的工作时序
2021-10-26 来源:eefocus
DS18B20的硬件原理——温度存储器
DS18B20的温度测量范围:-55~+125°C。

如上图所示,DS18B20温度存储器一共有两个字节。LSB低字节,MSB高字节。Msb字节高位,Lsb字节低位。图中的S表示的是符号位。
通过编程,DS18B20可实现最高12位的温度存储器。以补码的格式存储在寄存器中。
结合下面寄存器温度对应存储数值的表格,理解DS18B20温度存储器。

ps:二进制数最低位变化1,代表温度变化0.0625°C。
DS18B20与单片机通信
单片机可通过1-Wire协议与DS18B20通信,读取温度
1-Wire总线的硬件接口简单,时序复杂。
下面可根据DS18B20工作协议过程,了解其工作时序。
1)初始化
类似于I2C寻址。开始时,1-Wire总线也需检测总线上是否存在DS18B20器件。若存在,则总线根据时序要求返回一个低电平脉冲,若不存在,则无返回脉冲,即总线保持高电平。习惯上将这个动作称为检测存在脉冲。该动作除了有检测DS18B20器件的功能外,还有通知DS18B20做准备的作用。
下图是关于存在脉冲检测的时序图,以便直观感受时间与脉冲变化的关系。

图中可以看到,首先单片机拉低引脚,持续480 ~ 960μs。然后,单片机释放总线,即给总线高电平。DS18B20等待15 ~ 60μs,主动拉低这个引脚。60 ~ 240μ后,DS18B20主动释放总线。之后IO口被上拉电阻拉高。
2)ROM操作指令
类似于I2C,1-Wire总线也可挂多个器件。
该操作应用于一个总线上挂多个器件的情况下,对不同器件进行区分。
每个DS18B20内部都有一个唯一的64位长的序列号。序列号值存在于DS18B20内部的ROM中。其首8位是产品类型编码,末8位是CRC效验码,中间48位是每个器件的唯一序号。单片机可通过与DS18B20的通信,获取数据发送指令。这些指令相对复杂。应用不多。这里不介绍这部分,需要时可查看手册。
下面只介绍一个总线接一个器件的指令和程序。
Skip ROM:0XCC。当总线上只有一个器件时,可跳过ROM,不进行ROM检测。
3)RAM存储器操作指令。
这里介绍两条,其他有需要再查资料。
Read Scratchpad(读暂存寄存器):0XBE。
注意:DS18B20温度数据有两个字节。读取数据时,每个字节从低位读起,先读低字节再读高字节。
Convert Temperature(启动温度转换):0X44。
发送指令后,开始温度转换。这个过程需要一定时间,时长取决于DS18B20精度。温度数据用到的位数越高,精度越高,速度越慢。例子:9位模式与12位模式的最低变化值分别为0.5和0.0625,9位的转换速度更快。
下图为9位模式下的DS18B20温度转换时间表

其中寄存器R1和R0决定了转换的位数。他们的出厂设置默认值为11。即12位表示温度,最大转换时间750μs。启动转换后,至少要再等750μs才能读取温度。否则就有可能读错。
4)DS18B20的位写时序
下面是一张DS18B20写入操作的时序图:

当要给DS18B20写入0时,单片机拉低引脚。持续时间在60~120μs之间。
图中可见,单片机先拉低15μs之后,DS18B20会在15~60μs这个时间段读取这一位,典型值是在30μs时刻读取。持续时间超过60μs,DS18B20必定读取完毕。
当要给DS18B20写入1时,单片机拉低引脚。拉低时间>1μs,紧接着马上释放总线,即拉高引脚,持续时间>60μs。
ps:DS18B20时序较严格,写的过程中最好不要有中断,但是两个位之间的间隔处是例外,可以开启中断。
5)DS18B20的位读时序

当读取DS18B20数据时,单片机拉低引脚,至少保持1μs,然后释放引脚,释放完毕后要尽快读取。从拉低引脚到读取引脚状态不可超过15μs。
下面是DS18B20的操作代码(读写,检测脉冲,温度转换)
#include #include sbit IO_18B20 = P3^5; //DS18B20通信引脚 //软件延时函数,延时(t*10)μs void Delay(unsigned char t) { do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }while(--t); } //复位总线,获取存在脉冲,准备启动一次读写操作 bit Get18B20Ack() { bit ack; EA = 0; //禁止中断 IO_18B20 = 0; //产生500微秒复位脉冲 Delay(50); IO_18B20 = 1; Deylay(60); ack = IO_18B20; //读取存在脉冲 while(!IO_18B20); //等待存在脉冲结束 EA = 1; //重新使能总中断 return ack; } //向DS18B20写入一个字节,dat为待写入字节 void Write18B20(unsigned char dat) { unsigned char mask; EA = 0; //禁止中断 for(mask = 0X01;mask!=0;mask<<=1) //低位在前,依次移出8个bit { IO_18B20 = 0; //产生2微秒低电平脉冲 _nop_(); _nop_(); if((mask&dat) == 0) //输出该bit值 IO_18B20 = 0; else IO_18B20 = 1; Delay(6); //延时60微秒 IO_18B20 = 1; //拉高通信引脚 } EA = 1; //重新使能总中断 } //从DS18B2读取一个字节,返回值为读到的字节 unsigned char Read18B20() { unsigned char dat; unsigned char mask; EA = 0; //禁止总中断 for(mask = 0X01;mask != 0;mask <<= 1)//低位在先,依次采集8个bit { IO_18B20 = 0; //产生2微秒低电平脉冲 _nop_(); _nop_(); IO_18B20 = 1; //结束低电平脉冲,等待18B20输出数据 _nop_(); //延时2微秒 _nop_(); if(!IO_18B20) //读取通信引脚上的值 dat &= ~mask; else dat |= mask; Delay(60); //再延时60微秒 } EA = 1; //重新使能总中断 return dat; } //启动一次18B20温度转换,返回值为表示是否启动成功 bit Start18B20() { bit ack; ack = Get18B20Ack(); //执行总线,获取18B20应答 if(ack == 0) //若18B20正确应答,则启动一次转换 { Write18B20(0XCC); //跳过ROM操作 Write18B20(0X44); //启动一次温度转换 } return ~ack; //ack=0表示操作成功,故取反返回值 } //读取DS18B20转换的温度值,返回值为是否读取成功 bit Get18B20Temp(int *temp) { bit ack; unsigned char LSB,MSB; //16bit温度值的高低字节 ack = Get18B20Ack(); //执行总线,获取18B20应答 if(ack == 0) //若18B20正确应答,则启动一次转换 { Write18B20(0XCC); //跳过ROM操作 Write18B20(0XBE); //发送读命令 LSB = Read18B20(); //读温度值的低字节 MSB = Read18B20(); //读温度值的高字节 *temp = ((int)MSB<<8)+LSB;//合并成为16bit整型数 } return ~ack;//ack=0表示操作成功,故取反返回值 }
上一篇:#51单片机#A/D差分输入信号
下一篇:#51单片机#SPI时序初步认识
史海拾趣
|
1. 电源变压器、短路线、电阻、晶体三极管等元器件装插顺序,大功率晶体管不能和()靠的太正。 A 大功率电阻 B 高压电容 C 热敏元件 2.   ...… 查看全部问答> |
|
求cmos摄像头数据采集和视频压缩等方面的教程和资料~~~~~ 我最近想用FPGA开发一个视频采集,需要查找cmos摄像头的采集的数据的格式,视频压缩算法,不知道哪位高人有这方面的开发经验或者有相关的资料或者教程,我的邮箱是xyg1985109@163.com。。。。 不胜感激!!… 查看全部问答> |
|
高频开关电源由以下几个部分组成: 一、主电路 从交流电网输入、直流输出的全过程,包括: 1、输入滤波器:其作用是将电网存在的杂波过滤,同时也阻碍本机产生的杂波反馈到公共电网。 2、整流与滤波:将电网交流电源直接整流为较平滑的直流电, ...… 查看全部问答> |
|
超声波程序 #include #define uint unsigned int #define uchar unsigned char uchar flag0 = 0; //单片机发出10个脉冲标志位 uchar flag1 ; //测量标志位 long time; ...… 查看全部问答> |
|
小弟还没会爬就得逼者去走 ,马上要用CC430F5137做RF通信,一个主机与若干个从机通信,但要求一端的从机必须用WOR以减少功耗。传输协议是自定义的,上面的设计下来是把时间分成timeslot,比如0~0xF,各个从机只会在属于自己的timeslot唤醒收发数据 ...… 查看全部问答> |
|
上周,我们实验室从安捷伦的代理商深圳世强购买了一台N6705B直流电源分析仪用于咱们在汽车功能模块电压瞬太特性测试和电池仿真测试。好家伙,看起来还不如安捷伦2000系列的示波器高大上,价格却一点不含糊,4通道10W+,不过功能确实强大。不过,据 ...… 查看全部问答> |
|
利用IP核设计的时钟占空比1:1,为什么程序下到实验板后从SignalTap II中看波形不是1:1,倒像是2:1. 有没有人碰到和我一样的情况,是本来就没错,还是哪里出了问题? … 查看全部问答> |




