搜索
bottom↓
回复: 11

DS18B20-电脑作显示-BASCOM-AVR

[复制链接]

出0入0汤圆

发表于 2006-3-4 11:48:39 | 显示全部楼层 |阅读模式
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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2006-3-4 20:45:24 | 显示全部楼层
好东西~!!! 顶

出0入0汤圆

发表于 2006-3-4 22:11:03 | 显示全部楼层
阿艺,你这个程序好,不枉费了一条裤子!!

出0入0汤圆

发表于 2006-3-5 09:23:48 | 显示全部楼层
好,顶!

出0入0汤圆

发表于 2006-3-5 14:55:19 | 显示全部楼层
收下了,正准备做个温度计,正好参考,谢谢

出0入0汤圆

发表于 2006-4-4 19:53:55 | 显示全部楼层
好冬冬。阿艺牛!!!

出0入0汤圆

发表于 2006-4-12 18:50:20 | 显示全部楼层
有没有试过用编译器BASCOM-AVR1.11.8.1编译呢?我用M16试过能编译但不能读数,全是FF的.上拉电阻也接了,但就不知哪里出了问题.

出0入0汤圆

发表于 2006-9-17 23:14:15 | 显示全部楼层
好程序,我用仿真器加M16仿真成功了,在电脑的串口调试助手中看到结果了,每隔2-3秒一刷新。谢谢了。

出0入0汤圆

发表于 2009-6-10 11:12:41 | 显示全部楼层
啊艺的东西搞的挺整齐的!

出0入0汤圆

发表于 2009-7-27 21:46:13 | 显示全部楼层
最近在看这个传感器呢

出0入0汤圆

发表于 2009-8-30 08:56:50 | 显示全部楼层
haoding
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 21:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表