|
http://www.avrdiy.com/应用设计/DS18B20应用例子.htm
初稿
DS18B20是DALLAS公司生产的单总线 1WIRE 数字温度传感器, 可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。它具有体积小,接口方便,传输距离远等特点。
1:DS18B20简介:
(1)独特的单总线接口方式:DS18B20与主机连接时仅需要一条IO线即可实现双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用正常供电,也可以用IO寄生供电方式工作,电压范围:+3.0~+5.5 V。
(4)测温范围:-55~125℃,0~85℃误差<0.5℃,分辨率为0.0625、0.125、0.25、0.5℃,由编程实现
(5)用户可自设定EEPROM的报警上下限值。
(6)支持多点组网功能,多个DS18B20可以并联在一起工作,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
(9)供电方式既可以由VDD直接供电,也可以采用IO口寄生供电。
2:电路连接:当采用VDD正常供电时,DQ脚直接连接到单片机的IO口,同时接一个4.7~10K的上拉电阻;
当采用寄生电源时,电路的连接也很简单,但是涉及供电计算比较严格,请参考其他更详细的资料。
它的封装图如下:
它的存储器资源如下表
http://www.avrdiy.com/应用设计/DS18B20应用例子.htm
操作ROM的指令共有5条,均位单字节指令,下表是16进制指令表:
指令代码
指令说明
55
指定匹配芯片指令,
CC
跳过ROM匹配指令
F0
搜索芯片指令
EC
报警芯片搜索
33
读ROM指令,器件收到这个指令后就把64位ID码传送给主机
操作芯片的RAM、EEPROM指令共有6条,均为单字节指令,下表是16进制指令表:
指令代码
指令说明
44
温度转换指令,并把转换后的数据存放在RAM的B1、B2的两个字节里
BE
读取温度指令,器件收到这个指令后把B1、B2两个字节的数据传送给主机
4E
改写RAM的B3、B4、B5的数据,主机发出这个指令后跟着再 分别发送相应的数据
48
器件收到这个指令后就将B3、B4、B5的数据写到EEPROM
B8
器件收到这个指令后就把EEPROM的高H、低L温度报警值写到进B3、B4
B4
器件收到这个指令后就返回0或者1给主机,0为寄生电源,1为外部电源
下面列举几个例子来说明一下DS18B20在BASCOM-AVR上的应用:
1:读取DS18B20、DS2401的64位ID码,并在LCD上显示出来
'//////////////////////////////////////
'读取DS18B20、DS2401的64位ID码,并在LCD上显示出来
'DS18B20/DS2401的ID码读取操作是一样的,工作时序也是一样的
'版权 www.avrdiy.com
'设计者 啊艺
'编译器BASCOM-AVR1.11.7.9
'//////////////////////////////////////
$regfile = "M88def.dat"
$crystal = 8000000
Config 1wire = Portb.0 '定义单总线器件的接口
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'*************************************************
Dim I As Byte
Dim C(8) As Byte
Do
Cls
1wreset '单总线初始化
1wwrite &H33 '主机向单总线器件发送读ID码指令
'单总线器件收到读ID码指令后会跟着输出自己的64位ID码,主机用数组C(i)保存下来
For I = 1 To 8
C(i) = 1wread()
Next
'在LCD上用十六进制的方式把接收到的ID码显示出来
For I = 8 To 1 Step -1
Lcd Hex(c(i))
Next
Wait 1 '等待一秒钟,目的是让LCD显示清晰一点
Loop
End
2:读取DS18B20的RAM的9个字节,并且在LCD上显示出来
'//////////////////////////////////////
'读取DS18B20的RAM的9个字节的数据,并在LCD上显示出来
'版权 www.avrdiy.com
'设计者 啊艺
'编译器BASCOM-AVR1.11.8.1
'//////////////////////////////////////
$regfile = "M88def.dat"
$crystal = 8000000
Config 1wire = Portb.0 '定义单总线器件的接口
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'*************************************************
Dim I As Byte
Dim C(9) As Byte
Do
Cls
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &H44 '主机向单总线发送温度转换指令
Waitms 800 '精度不同时间也不同,9位93.75ms,10位187.5ms,11位375ms,12位750ms
1wreset
1wwrite &HCC '主机向单总线器件发送跳过ID码指令 '单总线初始化
1wwrite &HBE '主机向单总线发送读取RAM指令
'单总线器收到读RAM指令后会跟着输出自己的9个字节的RAM数据,主机用数组C(i)保存下来
For I = 1 To 9
C(i) = 1wread()
Next
'在LCD上把接收到的9个字节的RAM数据分两行显示出来
For I = 1 To 4
Lcd Hex(c(i)) ; "|"
Next
Locate 2 , 1 '把光标定位到第二行的第一列
For I = 5 To 9
Lcd Hex(c(i)) ; "|"
Next
Wait 1 '等待一秒钟,目的是让LCD显示清晰一点
Loop
End
3:让DS18B20执行温度转换,并且输出到LCD上
'//////////////////////////////////////
'读取DS18B20温度数据,并在LCD上显示出来
'版权 www.avrdiy.com
'设计者 啊艺
'编译器BASCOM-AVR1.11.8.1
'//////////////////////////////////////
$regfile = "M88def.dat"
$crystal = 8000000
Config 1wire = Portb.0 '定义单总线器件的接口
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'*************************************************
Dim I As Byte
Dim C(2) As Byte
Dim T As Word
Dim Wendu As Single
Do
Cls
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &H44 '主机向单总线发送温度转换指令
Waitms 800 '精度不同时间也不同,9位93.75ms,10位187.5ms,11位375ms,12位750ms
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &HBE '主机向单总线发送读取RAM指令
'单总线器收到读RAM指令后会跟着输出自己的9个字节的RAM数据,主机用数组C(i)保存前两个字节的温度数据
For I = 1 To 2
C(i) = 1wread()
Next
'把两个单字节的温度数据合并为一个双字节,得到原始温度数据
T = C(2) * 256
T = T + C(1)
'在LCD上把16位的原始温度数据以十六进制的方式显示出来
Lcd Hex(t)
'如果温度为正,则T的最高位的4位都为0,否则为1
'负温度的计算:原始数据取反、加1、再乘以 0.0625
'正温度的计算:原始数据乘以 0.0625
Locate 2 , 1
If C(2) > 15 Then
T = Not T
T = T + 1
Wendu = T * 0.0625
Lcd "-" ; Wendu ; "C"
Else
Wendu = T * 0.0625
Lcd "+" ; Wendu ; "C"
End If
Wait 1 '等待一秒钟,目的是让LCD显示清晰一点
Loop
End
4:设置DS18B20的温度报警值以及转换精度值
'//////////////////////////////////////
'设置DS18B20的温度报警值以及转换精度值
'然后再读取DS18B20的RAM的9个字节的数据,并在LCD上显示出来
'版权 www.avrdiy.com
'设计者 啊艺
'编译器BASCOM-AVR1.11.8.1
'//////////////////////////////////////
$regfile = "M88def.dat"
$crystal = 8000000
Config 1wire = Portb.0 '定义单总线器件的接口
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'*************************************************
Dim I As Byte
Dim C(9) As Byte
1wreset
1wwrite &HCC '跳过ID码
1wwrite &H4E '写RAM指令
1wwrite &HBB '写高H温度报警数据BB
1wwrite &HAA '写低L温度报警数据AA
1wwrite &H1F '写转换精度值1F(9位精度)
1wreset
1wwrite &HCC '跳过ID码
1wwrite &H48 '将RAM的数据写入EEPROM中
Do
Cls
1wreset '单总线初始化
1wwrite &HCC '主机向单总线器件发送跳过ID码指令
1wwrite &H44 '主机向单总线发送温度转换指令
Waitms 800 '精度不同时间也不同,9位93.75ms,10位187.5ms,11位375ms,12位750ms
1wreset
1wwrite &HCC '主机向单总线器件发送跳过ID码指令 '单总线初始化
1wwrite &HBE '主机向单总线发送读取RAM指令
'单总线器收到读RAM指令后会跟着输出自己的9个字节的RAM数据,主机用数组C(i)保存下来
For I = 1 To 9
C(i) = 1wread()
Next
'在LCD上把接收到的9个字节的RAM数据分两行显示出来
For I = 1 To 4
Lcd Hex(c(i)) ; "|"
Next
Locate 2 , 1 '把光标定位到第二行的第一列
For I = 5 To 9
Lcd Hex(c(i)) ; "|"
Next
Wait 1 '等待一秒钟,目的是让LCD显示清晰一点
Loop
End
5:利用PC的超级终端作输出显示
$regfile = "M88def.dat"
$crystal = 1000000
$baud = 1200
Config 1wire = Portb.0
'*************************************************
Dim I As Word
Dim C(9) As Byte
Dim T As Single
Do
'****************************************************************************
'读DS18B20的64位ID码
1wreset
1wwrite &H33
For I = 1 To 8
C(i) = 1wread()
Next
Print "温度感应器是DS18B20,ID码是:"
Print Hex(c(8)) ; "|" ; Hex(c(7)) ; "|" ; Hex(c(6)) ; "|" ; Hex(c(5)) ; "|" ; Hex(c(4)) ; "|" ; Hex(c(3)) ; "|" ; Hex(c(2)) ; "|" ; Hex(c(1))
'****************************************************************************
'读DS18B20的RAM的9个字节数据
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800
1wreset
1wwrite &HCC
1wwrite &HBE
For I = 1 To 9
C(i) = 1wread()
Next
Print "当前RAM的9个字节数据是:"
Print Hex(c(1)) ; "|" ; Hex(c(2)) ; "|" ; Hex(c(3)) ; "|" ; Hex(c(4)) ; "|" ; Hex(c(5)) ; "|" ; Hex(c(6)) ; "|" ; Hex(c(7)) ; "|" ; Hex(c(8)) ; "|" ; Hex(c(9))
'****************************************************************************
'上面的9个字节的RAM中,C1,C2 就是温度数据
I = C(2) * 256
I = I + C(1)
If C(2) > 15 Then
I = Not I
I = I + 1
T = I * 0.0625
Print "现在的温度是:" ; "-" ; T ; "℃"
Else
T = I * 0.0625
Print "现在的温度是:" ; T ; "℃"
End If
Print "----------------------------"
Waitms 3000
Loop
End
http://www.avrdiy.com/应用设计/DS18B20应用例子.htm
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|