————————————————————————————————————————————

1-Wire总线

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  • 只使用一根导线(地址线、数据线、控制线合一)
  • 可以传输时钟和数据
  • 双向传输
  • 信号线上可挂许多测控对象,电源也由这根信号线提供
  • 适用于单Master,多个Slave。
    • 当只有一个Slave时,系统按照单节点系统操作
    • 当有多个Slave时,系统按照多节点系统操作
  • 优点:
    • 综合性:
      • 传感器、控制器、输入/输出设备均可按1-Wire协议接入网络
    • 简捷性:
      • 1-Wire单总线的设置和安装只需一条普通三芯电线连接至各从机接入点
      • 当系统需要增加Slave时,只需要从该总线拉出延长线即可
    • 可靠性:
      • 每个从机均有绝对唯一的地址码
      • 数据传输均采用CRC校验码
      • 1-Wire单总线上传输的是数字信号
  • 缺点:传输速率较低

————————————————————————————————————————————

DS18B20

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  • 改进型智能数字温度传感器
  • 只需要一根导线就能读出被测温度,并实现双向通信
  • 根据需求实现9-12位数字值的读数方式,精度分别为0.5,0.25,0.125,0.0625
  • 适应电压范围宽,电压范围为3.0-5.5V,寄生电源方式下可由数据线供电
  • 支持多点组网功能,多个DS18B20通过并联方式,实现多点组网测温
  • 不需要任何外围元件,传感元件及转换电路已经集成了
  • 温度范围-55~+125℃,在-10~+85℃时,精度为±0.5℃
  • 转换速度较快。在9位分辨率时,最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字
  • 测试结果直接输出数字温度信号,以一条总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
  • 负压特性,当电源极性接反时,芯片不会因发热而烧毁,但也无法正常工作

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

三种封装形式及引脚说明

  • 当信号线DQ为高电平时,DQ为芯片供电,并且内部电容器储存电能
  • 当信号线DQ为低电平时,内部电容器为芯片供电,直至下一个高电平到来重新充电

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

内部结构:

  • 64位ROM
    • 厂家激光刻录的一个64位二进制ROM代码,是该芯片的标号

8位循环冗余检验

48位序列号

8位分类编号(10H)

MSB ... LSB

MSB ... LSB

MSB ... LSB

  • 8位分类编号:10H,是DS18B20的分类号
  • 温度传感器
    • 温度范围-55~+125℃。9-12位分辨率,转换精度分别为0.5,0.25,0.125,0.0625
    • 出厂时默认为16位转换精度
    • 当接收到温度转换命令(44H)后开始转换,转换完成后的温度以16位带符号扩展的二进制补码形式表示。存储在高速缓存器RAM的第0、1字节中,二进制数的前5位为符号位。
      • 如果温度>0,则该5位为0,只要将测到的数值乘上0.0625即可得到实际温度。
      • 如果温度<0,则该5位为1,测到的数值需要取反+1再乘上0.0625。
  • 高速缓存器:包含以下两个组件
    • 高速暂存器RAM:连续8字节的存储器
      • 前2字节是测得的温度信息,第1字节存放温度的低8位,第2字节存放温度的高8位
      • 第3/4/5字节分别是高温触发器、低温触发器、配置寄存器的易失性复制
      • 前5字节的内容在每次上电复位时被刷新
      • 第6/7/8字节用于暂时保留为1
    • 非易失性可电擦除EEPROM
  • 配置寄存器
    • 用于确定温度值的数字转换分辨率,按此寄存器的分辨率将温度转换为相应精度的数值,是高速缓存器的第5个字节
    • 该字节定义:

TM

R0

R1

1

1

1

1

1

  • TM是测试模式位,用于设置DS18B20在工作模式还是测试模式。工作模式时该位为0,用户不必改动。R1和R0用来设置分辨率,其余5位均固定为1。
  • 分辨率设置:

R1

R0

分辨率

最大转换时间/ms

0

0

9位

93.75

0

1

10位

187.5

1

0

11位

375

1

1

12位

750

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

测温工作原理:由以下部分组成

  • 斜率累加器:
    • 用于补偿和修正测温过程中的非线性
    • 其输出用于修正减法计数器的预置值
  • 温度系数振荡器:
    • 用于产生减法计数器脉冲信号
    • 低温度系数振荡器受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1
    • 高温度系数振荡器受温度的影响较大,随温度的变化,其振荡频率明显改变,产生的信号作为减少计数器2的输入脉冲
  • 减法计数器
    • 减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将+1。
    • 之后,减法计数器1的预置将重新被装入。减法计数器1重新开始对低温度系数振荡器产生的脉冲信号进行计数,循环操作直到减法计数器2计数减到0,才会停止温度寄存器的值的累加。此时,温度寄存器中的数值即为所测温度。
    • 只要计数门未关闭就重复上述过程,直至温度寄存器的值达到被测温度值。
  • 温度寄存器
    • 暂存温度数值
  • 计数门
    • 当计数门打开时,DS18B20就对低温系数震荡器产生的时钟脉冲进行计数,从而完成温度测量。
    • 开启时间由高温度系数振荡器决定。
    • 每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和高温寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

p.s. 每个芯片的信息交换是分时完成的,均有严格的读/写是时序要求,系统对DS18B20的操作协议为:

初始化DS18B20(发复位脉冲)→ 发ROM功能命令 → 发存储器操作命令 → 处理数据

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ROM命令

操作

命令代码

详细说明

读ROM

33H

允许主设备读出64位二进制ROM代码

只适用于总线上存在单只DS18B20

匹配ROM

55H

若总线上有多个Slave,使用该命令可以选中某一指定的DS18B20,即只有与64位二进制ROM代码完成匹配的DS18B20才能响应其操作

跳过ROM

CCH

启动所有DS18B20转换之前或系统只有一个DS18B20时,该命令允许Master不提供64位二进制ROM代码就使用存储器操作命令

搜索ROM

F0H

确定系统中的Slave个数及其ROM代码

报警搜索ROM

ECH

鉴别和定位系统中超出程序设定的报警温度值

写暂存器

4EH

允许Master向DS18B20的暂存器写入2个字节的数据

可以在任何时刻发出复位命令中止数据写入

读暂存器

BEH

允许主设备读取暂存器的内容,从第1个字节开始,直到CRC读完第9个字节。也可以在任何时刻发出复位命令中止数据的读取操作

复制暂存器

48H

将高温触发器和低温触发器中的字节复制到非易失性EEPROM

若主机在该命令之后又发出读操作,而DS18B20正忙于复制过程时,DS18B20会输出一个0,复制结束时DS18B20会发出一个1。

如果使用寄生电源,则主设备发出该命令之后,立即发出强上拉并至少保持10ms以上时间。

温度转换

44H

启动一次温度转换

若主机在该命令之后又发出其他操作,DS18B20正忙于温度转换,则输出一个0,转换结束则输出一个1,。

若使用寄生电源,则Master发出该命令之后,立即发出强上拉并至少保持500ms以上的时间。

复制回暂存器

B8H

将高温触发器和低温触发器的字节从EEPROM复制回暂存器中。

若忙,同上

读电源使用模式

B4H

Master将该命令发给DS18B20后发出读操作,DS18B20会返回它的电源使用模式:0为寄生电源,1为外部电源

————————————————————————————————————————————

基于1-Wire的DS18B20测量温度的实例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现效果:

实现代码:

 #include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[] =
{
0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c
};
uchar code address[] =
{
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
};
sbit DQ = P3 ^ ; //DQ控制位
sbit dot = P1 ^ ; //小数点
uchar temp1, temp2; //通过temp1和temp2存储温度低位和高位 void Delay(uint m)
{
while(m--);
}
uchar ReadByte()
{
uchar byte = ;
uchar i;
for (i = ; i < ; ++i)
{
DQ = ;
byte >>= ;
DQ = ;
if (DQ)
byte = byte | 0x80;
Delay();
}
return byte;
}
void WriteByte(uchar byte)
{
uchar i;
for (i = ; i < ; ++i)
{
DQ = ;
byte >>= ; //数据左移
DQ = CY;
Delay();
DQ = ;
}
}
void Init()
{
DQ = ;
Delay();
DQ = ;
Delay();
DQ = ;
Delay();
}
void ReadTemp()
{
/* 初始化DS18B20 */
Init();
WriteByte(0xcc); //跳过ROM,当前只有一个Slave
WriteByte(0x44); //启动温度转换
Delay();
Init();
WriteByte(0xcc); //跳过ROM
WriteByte(0xbe); //读取暂存器内容
temp1 = ReadByte(); //低位存放在temp1中
temp2 = ReadByte(); //高位存放在temp2中
}
void main()
{
bit flag;
uint temp;
uchar i;
while()
{
/* 读取温度 */
ReadTemp(); /* 温度转化 */
temp = temp1 & 0x0f; //temp存入温度低8位并保留低4位
if (temp2 > ) //temp2 > 01111111时,温度为负
{
flag = ;
temp1 = ~temp1;
temp2 = ~temp2; //高低各取反
temp = temp1 & 0x0f;
temp += 0x01; //取反后+1,得到负数值
}
temp = temp * ;
temp1 = temp1 & 0xf0;
temp1 = temp1 / ;
temp2 = temp2 * ;
temp1 += temp2;
if (flag)
temp1 += 0x01; /* 温度显示 */
for (i = ; i < ; ++i)
{
P2 = address[i];
P1 = table[temp % ];
Delay();
temp = temp / ;
}
P2 = 0xef;
P1 = table[temp1 % ];
dot = ;
Delay();
if (temp1 / || temp1 / )
{
P2 = 0xdf;
P1 = table[temp1 / % ];
Delay();
}
if (temp1 / )
{
P2 = 0xbf;
P1 = table[temp1 / % ];
Delay();
}
if (flag)
{
P2 = 0x7f;
P1 = 0x02;
Delay();
flag = ;
}
}
}

51单片机 | 1-Wire总线及应用实例的更多相关文章

  1. 51单片机I/O口直接输入输出实例(附调试及分析过程)

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  2. 51单片机 | I/O口直接输入输出实例

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  3. 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)

    并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...

  4. 51单片机 | 基于I2C总线的秒表模拟应用

    ———————————————————————————————————————————— 参考地址: http://blog.csdn.net/junyeer/article/details/4648 ...

  5. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  6. 51单片机模拟I2C总线的C语言实现

    电路原理图   EEPROM为ATMEL公司的AT24C01A.单片机为ATMEL公司的AT89C51. 软件说明 C语言为Franklin C V3.2.将源程序另存为testi2c.c,用命令 C ...

  7. 51单片机 | A/D转换器实现数字电压表实例

    ———————————————————————————————————————————— ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - ...

  8. Windows 通用应用尝试开发 “51单片机汇编”总结

    一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...

  9. 关于51单片机P0口的结构及上拉问题

    1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构.高电平时,V1打开,V2截止:低电平时,V1截止,V2打开.这种情况下不用外接上拉电阻.而且,当V1打开,V2截止,输出高电平的时候, ...

  10. 51单片机C语言学习笔记3: 存储器结构

    MCS-51单片机在物理结构上有四个存储空间: 1.片内程序存储器2.片外程序存储器3.片内数据存储器4.片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1.片内外统一编 ...

随机推荐

  1. MATLAB的cftool工具箱简介

    下面,通过一个例子说明cftool可视化界面工具箱的用法. 例如,已知 x = [0 0.2 0.50.8 0.9 1.3 1.4 1.9 2.1 2.2 2.5 2.6 2.9 3.0]; y = ...

  2. linux上redis的安装与配置

    1.redis安装 wget http://download.redis.io/releases/redis-4.0.8.tar.gz tar xzf redis-4.0.8.tar.gz ln -s ...

  3. JS监听页面滚动到底部事件

    废话不说,直接上代码,放心我这个是最好的,直接放到js脚本里,直接生效: $(window).scroll(function(){ var scrollTop = $(this).scrollTop( ...

  4. EasyUI中combobox的代码实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. P1059 明明的随机数【去重排序】

    题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应 ...

  6. 洛谷——P1154 奶牛分厩

    P1154 奶牛分厩 题目描述 农夫约翰有N(1<=N<=5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号Si,所有的奶牛都睡在一个有K个厩的谷仓中,厩的编号为0到K-1.每头 ...

  7. Java多线程——AQS框架源码阅读

    AQS,全称AbstractQueuedSynchronizer,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包.它到底是个什么,我们来看看源码的第一段注解是怎么说 ...

  8. Ionic2 常见问题及解决方案

    前言 Ionic是目前较为流行的Hybird App解决方案,在Ionic开发过程中会遇到很多常见的开发问题,本文尝试对这些问题给出解决方案. 一些常识与技巧 list 有延迟,可以在ion-cont ...

  9. jvm-监控指令-jstack

    格式: jstack [option] vmid 选项: -l 除了堆栈信息外,显示关于锁的附加信息. 作用: 生成虚拟机当前时刻的线程快照. 目的: 定位线程长时间停顿的原因,比如线程间死锁.死循环 ...

  10. python函数中的关键字参数

    关键字参数: 就是在形式参数中必须要提供”传递参数名=传递参数值” 位置参数:  仅仅只有参数名 特点:1.位置参数只能出现在关键字参数之前,不管是在行参还是实参中. 2.关键字参数在调用时(实参)中 ...