DS18B20的工作原理及应用 下载本文

内容发布更新时间 : 2024/5/18 13:40:48星期一 下面是文章的全部内容请认真阅读。

PORTA&=~BIT(DQ); //拉低总线,启动输入 PORTA|=BIT(DQ); //释放总线

DDRA&=~BIT(DQ); //DQ 为输入状态 if(PINA&BIT(DQ)) Temp|=0x80;

Delay_1us(45); //延迟45 微妙(最大45 微妙) }

return Temp; }

//读温度函数

unsigned int Read_Temperature() {

unsigned int Temp1,Temp2;

DS1302_Reset(); //DS1302 复位 DS1302_Write(0xCC); //跳过ROM DS1302_Write(0x44); //温度转换 DS1302_Reset(); //DS1302 复位 DS1302_Write(0xCC); //跳过ROM DS1302_Write(0xbe); //读取RAM

Temp1=DS1302_Read(); //读低八位,LS Byte, RAM0 Temp2=DS1302_Read(); //读高八位,MS Byte, RAM1 DS1302_Reset(); //DS1302 复位,表示读取结束

return (((Temp2<<8)|Temp1)*6.25); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx }

void main() {

unsigned int Temp;

LED7_Init(); //初始化数码管引脚 while(1) {

Temp=Read_Temperature(); //调用读取温度函数 Number_Show(Temp); //显示温度 Delay_1us(100); //稍微延迟 } }

AVR单片机与DS18B20多点温度 获取序列号(64位ROM代码)

操作单总线数字温度传感器必须严格按规定的协议操作,即应按以下顺序操作: 初始化、ROM操作命令、暂存存储器操作命令、数据传输。在ROM操作命

令中,有两条命令专门用于获取传感器序列号: 读ROM命令( 33H)和搜索ROM命令( F0H) 。读ROM命令只能在总线上仅有一个传感器的情况下使用。搜索ROM命令则允许总线主机使用一种“消去”处理方法来识别总线上所有的传感器序列号。为了建立64位ROM代码和测量位置点传感器之间的关系,我们选

21

用读ROM命令(33H) 。DS18B20的64位ROM代码结构如图2所示:8位CRC代码48位序列号8位产品类型号

执行如下程序即可读取DS18B20的64位ROM代码并按编号存入其内部的E2 PROM中,从而建立测量位置点和传感器64位ROM代码之间的关系表。64位序列号用8个字节单元来存储,位置号为n的DS18B20,其64位序列号在E2 PROM中从( n - 1) ×8开始的单元存放。

由于已经在上面获取了多个DS18B20的ROM代码并在AVR 单片机内部的E2 PROM中建立了测量位置点和传感器64位ROM代码之间的关系表,因此对多个温度的巡回 测量的步骤如下:

(1) 发跳过ROM命令CCH。

(2) 发启动所有在线的DS18B20进行温度转换命令44H。 (3) 延迟1 s。

(4) 发匹配ROM命令55H。

(5) 按照E2 PROM中建立的关系表的顺序取出64位ROM代码发送到单总线。 (6) 发读温度值命令BEH,读取温度值。

(7) 进行CRC校验和数据处理后送LCD显示器显示。

(8) 重复第4步到第7步,直到所有的DS18B20测量处理完。 (9) 再重复第1步到第8步,进行下一轮的巡回测量。

第4章 系统软件设计

4.2 测温模块流程图

22

读温度 初始化温度传感器 扫描键盘选定所需芯片 选定所需芯片 进行温度转换 读取温度 调试显示子程序 子程序返回

图4-2 DSl8B20操作流程图

23

4.2.1 温度的采集

每一片DSl8B20在其ROM中都存有其唯一的48位序列号,在出厂前已写入片内ROM中,主机在进入操作程序前必须逐一接入DSl8B20,用读ROM(33H)命令将该DSl8B20的序列号读出并登录。当主机需要对众多在线DSl8B20的某一个进行操作时首先要发出匹配ROM命令(55H),紧接着主机提供64位序列(包括该DSl8B20的48位序列号)之后的操作就是针对该DSl8B20的,而所谓跳过ROM命令即为之后的操作,是对所有DSl8B20的框图中先有跳过ROM即是启动所有DSl8B20进行温度变换之后通过匹配ROM再逐一地读回每个DSl8B20的温度数据在DSl8B20组成的测温系统中主机在发出跳过ROM命令之后再发出统一的温度转换启动码44H就可以实现所有DSl8B20的统一转换再经过1s后就可以用很少的时间去逐一读取这种方式,使其T值往往小于传统方式。由于采取公用的放大电路和

A/D转换器只能逐一转换,显然通道数越多这种省时效应就越明显。 4.2.2 多点温度的测量

单总线 已经挂接了4个DS18B20。由于已经在上面获取了多个DS18B20的ROM代码并在AT89C51单片机内部的中建立了测量位置点和传感器64位ROM代码之间的关系表,因此对多个温度的巡回测量

的步骤如下:

(1)发跳过ROM命令CCH。

(2)发启动所有在线的DS18B20进行温度转换命令44H。

(3)延迟1s。 (4)发匹配ROM命令55H。

(5)按照AT89C51中建立的关系表的顺序取出64位ROM代码发送到单总线。

(6)发读温度值命令BEH,读取温度值。 (7)进行CRC校验和数据处理后送LCD显示器显示。 (8)重复第4步到第7步,直到所有的DS18B20测量处理完。

(9)再重复第1步到第8步,进行下一轮的巡回测量。

如果只对某一个DS18B20进行温度测量,只要将第1步跳过ROM命令CCH,改为匹配ROM命令55H,将拨动开关拨到和要测量的DS18B20的编号相对应的数值上,单片机读取拨动开关的数值(编号)n,到AT89C51建立的关系表中从(n -1)×8开始的单元取出ROM代码发送到总线,去掉第8步,其余和上面步骤相似即可。测试中,DS18B20选择芯片出厂时默认的12位转换精度,转换的结果用16位符号扩展

的二进制补码读数形式提供。

24

初始化 设置18B20个数 跳过ROM 符合ROM 等待1S 读存储器 初始化 缓冲指针增一 初始化 否 B-1=0? 是

图4-3 多路温度测量电路流程图

25