51单片机1-Wire总线及应用实例

时间:2017-07-02 18:54:37   收藏:0   阅读:1010

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

1-Wire总线

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

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

DS18B20

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

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

三种封装形式及引脚说明

技术分享

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

内部结构:

技术分享

8位循环冗余检验

48位序列号

8位分类编号(10H

MSB ... LSB

MSB ... LSB

MSB ... LSB

TM

R0

R1

1

1

1

1

1

R1

R0

分辨率

最大转换时间/ms

0

0

9

93.75

0

1

10

187.5

1

0

11

375

1

1

12

750

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

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

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

允许MasterDS18B20的暂存器写入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测量温度的实例

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

实现效果:

技术分享

实现代码:

  1 #include <reg52.h>
  2 typedef unsigned char uchar;
  3 typedef unsigned int uint;
  4 uchar code table[] =
  5 {
  6     0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c
  7 };
  8 uchar code address[] =
  9 {
 10     0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
 11 };
 12 sbit DQ = P3 ^ 0; //DQ控制位
 13 sbit dot = P1 ^ 0; //小数点
 14 uchar temp1, temp2; //通过temp1和temp2存储温度低位和高位
 15 
 16 void Delay(uint m)
 17 {
 18     while(m--);
 19 }
 20 uchar ReadByte()
 21 {
 22     uchar byte = 0;
 23     uchar i;
 24     for (i = 0; i < 8; ++i)
 25     {
 26         DQ = 0;
 27         byte >>= 1;
 28         DQ = 1;
 29         if (DQ)
 30             byte = byte | 0x80;
 31         Delay(4);
 32     }
 33     return byte;
 34 }
 35 void WriteByte(uchar byte)
 36 {
 37     uchar i;
 38     for (i = 0; i < 8; ++i)
 39     {
 40         DQ = 0;
 41         byte >>= 1; //数据左移
 42         DQ = CY;
 43         Delay(5);
 44         DQ = 1;
 45     }
 46 }
 47 void Init()
 48 {
 49     DQ = 1;
 50     Delay(8);
 51     DQ = 0;
 52     Delay(80);
 53     DQ = 1;
 54     Delay(20);
 55 }
 56 void ReadTemp()
 57 {
 58     /* 初始化DS18B20 */
 59     Init();
 60     WriteByte(0xcc); //跳过ROM,当前只有一个Slave
 61     WriteByte(0x44); //启动温度转换
 62     Delay(10);
 63     Init();
 64     WriteByte(0xcc); //跳过ROM
 65     WriteByte(0xbe); //读取暂存器内容
 66     temp1 = ReadByte(); //低位存放在temp1中
 67     temp2 = ReadByte(); //高位存放在temp2中
 68 }
 69 void main()
 70 {
 71     bit flag;
 72     uint temp;
 73     uchar i;
 74     while(1)
 75     {
 76         /* 读取温度 */
 77         ReadTemp();
 78 
 79         /* 温度转化 */
 80         temp = temp1 & 0x0f; //temp存入温度低8位并保留低4位
 81         if (temp2 > 127) //temp2 > 01111111时,温度为负
 82         {
 83             flag = 1;
 84             temp1 = ~temp1;
 85             temp2 = ~temp2; //高低各取反
 86             temp = temp1 & 0x0f;
 87             temp += 0x01;  //取反后+1,得到负数值
 88         }
 89         temp = temp * 625;
 90         temp1 = temp1 & 0xf0;
 91         temp1 = temp1 / 16;
 92         temp2 = temp2 * 16;
 93         temp1 += temp2;
 94         if (flag)
 95             temp1 += 0x01;
 96 
 97         /* 温度显示 */
 98         for (i = 0; i < 4; ++i)
 99         {
100             P2 = address[i];
101             P1 = table[temp % 10];
102             Delay(750);
103             temp = temp / 10;
104         }
105         P2 = 0xef;
106         P1 = table[temp1 % 10];
107         dot = 1;
108         Delay(750);
109         if (temp1 / 100 || temp1 / 10)
110         {
111             P2 = 0xdf;
112             P1 = table[temp1 / 10 % 10];
113             Delay(750);
114         }
115         if (temp1 / 100)
116         {
117             P2 = 0xbf;
118             P1 = table[temp1 / 100 % 10];
119             Delay(800);
120         }
121         if (flag)
122         {
123             P2 = 0x7f;
124             P1 = 0x02;
125             Delay(750);
126             flag = 0;
127         }
128     }
129 }

 

技术分享

 

原文:http://www.cnblogs.com/hughdong/p/7106747.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!