×
单片机 > 单片机程序设计 > 详情

单线挂多个DS18B20巡回检测显示温度

发布时间:2020-08-25 发布时间:
|
'项目:单线挂多个DS18B20巡回检测显示温度

'结果:在proteus仿真运行成功,巡回显示温度,理论上无论挂多少个DS18B20都可以。
 

$regfile = "m16def.dat"
$crystal = 3276800
Baud = 9600
Declare Sub Screen()

Config 1wire = Portd.7                                      '定义单总线接口
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.1 , Rs = Porta.0       '定义液晶接口
Config Lcd = 16 * 2                                         '定义液晶类型为1602
Cls
Cursor Off                                                  '关光标显示

Dim Romdat(8) As Byte
Dim Romadd As Byte
Dim T(2) As Byte
Dim Wd As Word
Dim Temp As Single
Dim A As Byte
Dim M As Byte
Dim N As Byte
Dim I As Byte
Screen
Lcd "Welcome to"
Locate 2, 2: Lcd "http://ycavr.cn"
Wait 2
Screen
1 wreset
If Err = 0 Then                                             '如果总线上挂有DS18B20则下转检测温度并显示,如果没有DS18B20则结束程序运行。
   Lcd "DS18B20  OK!"
Else
   Lcd "ERROR !"
   End
End If

Romadd = 1
Romdat(1) = 1wsearchfirst()                                 '查找第一个器件
For N = 1 To 8
   Writeeeprom Romdat(N), Romadd
   Incr Romadd
Next

Do
   Romdat(1) = 1wsearchnext()                               '查找下一个,直到找完为止。
   For N = 1 To 8
      Writeeeprom Romdat(N), Romadd                         '将ROM地址写入EEPROM
      Incr Romadd
   Next
Loop Until Err = 1
I = 1wirecount()                                            '返回总线上DS18B20的个数
Screen
Lcd "Found " ; I ; " Sensors"                               '显示DS18B20个数
Wait 1

Do
   Romadd = 1
1   wreset
1   wwrite &HCC                                             '跳过ROM匹配
1   wwrite &H44                                             '开始温度转换
   'Waitms 20
   For M = 1 To I
      Screen
      Lcd "No. " ; M
      For N = 1 To 8
         Readeeprom Romdat(N), Romadd
         Incr Romadd
      Next

1      wreset
1      wwrite &H55                                          'ROM匹配
      For N = 1 To 8
1         wwrite Romdat(N)
      Next
1      wwrite &HBE                                          '读转换温度
      For N = 1 To 2
         T(n) = 1wread()
      Next
      Wd = T(2) * 255
      Wd = Wd + T(1)
      Locate 2, 1
      If T(2) > 15 Then
         Lcd "T= -"
         Wd = Not Wd
         Incr Wd
      Else
         Lcd "T= +"
      End If
      Temp = Wd / 16
      Lcd Temp ; " C "
      Print M; Temp
      Wait 2
   Next
Loop
End

Sub Screen()
Local J As Byte
For J = 1 To 16
   Locate 1, J: Lcd "*"
   Locate 2, J: Lcd "*"
   Waitms 30
Next
For J = 16 To 1 Step -1
   Locate 1, J: Lcd " "
   Locate 2, J: Lcd " "
   Waitms 30
Next
Home
End Sub



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项