搜索
bottom↓
回复: 2

一个用18B20做的温度计

[复制链接]

出0入0汤圆

发表于 2006-8-13 13:22:24 | 显示全部楼层 |阅读模式
请多指教,我用的是双龙SL-AVRAD实验板

$regfile = "8535def.dat"

$crystal = 8000000

Config 1wire = Portd.7                                      '定义单总线器件的接口

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portd.5 , Rs = Portd.3

Config Lcd = 16 * 2

Deflcdchar 1 , 4 , 10 , 17 , 4 , 31 , 2 , 4 , 8             '自定义中文字符"今"

Deflcdchar 2 , 31 , 4 , 31 , 4 , 12 , 10 , 18 , 17          '自定义中文字符"天"

Deflcdchar 3 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           '自定义中文字符"℃"

'*************************************************

Dim I As Byte

Dim C(2) As Byte

Dim T As Word

Dim A As Single

Dim B As Integer

Dim D As Integer

Dim E As Integer

Dim F As Integer



Cls

Locate 1 , 1 : Lcd "Demo for DS1820"

Locate 2 , 1 : Lcd Chr(1) ; Chr(2)

Locate 2 , 8 : Lcd Chr(3) ; "C"





Do



  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的最高位的4位都为0,否则为1,负温度的计算:原始数据取反、加1、再乘以 0.0625 正温度的计算:原始数据乘以 0.0625

'把两个单字节的温度数据合并为一个双字节,得到原始温度数据

  T = C(2) * 256

  T = T + C(1)



'在LCD上把16位的原始温度数据以十六进制的方式显示出来



'如果温度为正,则T的最高位的4位都为0,否则为1

'负温度的计算:原始数据取反、加1、再乘以 0.625

'正温度的计算:原始数据乘以 0.625



Locate 2 , 4

If C(2) > 15 Then

     T = Not T

    T = T + 1

   A = T * 0.625

   B = A

   Locate 1 , 4 : Lcd "-"

Gosub Xian

    Else

    A = T * 0.625

    B = A

    Gosub Xian



  End If

Deflcdchar Print , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32   ' replace ? with number (0-7)

Loop



Xian:

E = B

F = E

E = E / 10

F = F Mod 10                                                '读小数点后一位

If E >= 100 Then                               '在LCD的第一行第四位显示温度

  Locate 2 , 4 : Lcd E ; "." ; F ; Chr(3) ; "C"

     Goto A2

Else

If E < 10 Then

  Locate 2 , 4 : Lcd " " ; " " ; E ; "." ; F ; Chr(3) ; "C"

Else

  Locate 2 , 4 : Lcd " " ; E ; "." ; F ; Chr(3) ; "C"

End If

End If

A2:

Return



End

出0入0汤圆

发表于 2006-8-19 22:44:06 | 显示全部楼层
呵呵加上裤子了,不用裸奔了:)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-10 23:43

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

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