|
请多指教,我用的是双龙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 |
|