panxiaoyi 发表于 2006-3-4 11:48:39

DS18B20-电脑作显示-BASCOM-AVR

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



http://cache.amobbs.com/bbs_upload782111/files_5/armok01105386.GIF

jackiezeng 发表于 2006-3-4 20:45:24

好东西~!!! 顶

JAMESKING 发表于 2006-3-4 22:11:03

阿艺,你这个程序好,不枉费了一条裤子!!

sea_19821 发表于 2006-3-5 09:23:48

好,顶!

skidl 发表于 2006-3-5 14:55:19

收下了,正准备做个温度计,正好参考,谢谢

meisen999 发表于 2006-4-4 19:53:55

好冬冬。阿艺牛!!!

hdssj 发表于 2006-4-12 18:50:20

有没有试过用编译器BASCOM-AVR1.11.8.1编译呢?我用M16试过能编译但不能读数,全是FF的.上拉电阻也接了,但就不知哪里出了问题.

jiangxin 发表于 2006-9-17 23:14:15

好程序,我用仿真器加M16仿真成功了,在电脑的串口调试助手中看到结果了,每隔2-3秒一刷新。谢谢了。

machi518 发表于 2009-6-10 11:12:41

啊艺的东西搞的挺整齐的!

fengchaofish 发表于 2009-7-27 21:46:13

最近在看这个传感器呢

love_you_self 发表于 2009-8-30 08:56:50

haoding
页: [1]
查看完整版本: DS18B20-电脑作显示-BASCOM-AVR