📄 ds18b20.lst
字号:
0143 D8F9 228 DJNZ R0,BBJJ3
0145 22 229 RET
0146 230 BJ3:
0146 3E48 231 DB ">H"
0148 232 BJ4:
0148 3C4C 233 DB "<L"
014A 234 BJ5:
014A 2021 235 DB " !"
236 ;==================================================
237 ;显示温度标记子程序
238 ;==================================================
014C 239 TEMP_BJ:
014C 74CB 240 MOV A,#0CBH
014E 917B 241 CALL WCOM
0150 90015F 242 MOV DPTR,#BJ1 ;指针指到显示消息
0153 7900 243 MOV R1,#0
0155 7802 244 MOV R0,#2
245
0157 E9 246 BBJJ1: MOV A,R1
0158 93 247 MOVC A,@A+DPTR
0159 9188 248 CALL WDATA
015B 09 249 INC R1
015C D8F9 250 DJNZ R0,BBJJ1
015E 22 251 RET
015F 252 BJ1:
015F 0043 253 DB 00H,"C"
A51 MACRO ASSEMBLER DS18B20 11/15/2006 21:06:21 PAGE 5
254 ;=================================================
0161 255 MENU_OK:
256
0161 900170 257 MOV DPTR,#M_OK1 ;指针指到显示消息
0164 7401 258 MOV A,#1 ;显示在第一行
0166 9148 259 CALL LCD_PRINT
0168 900181 260 MOV DPTR,#M_OK2 ;指针指到显示消息
016B 7402 261 MOV A,#2 ;显示在第一行
016D 9148 262 CALL LCD_PRINT
263
016F 22 264 RET
0170 265 M_OK1:
0170 20202044 266 DB " DS18B20 OK ",0
0174 53313842
0178 3230204F
017C 4B202020
0180 00
0181 267 M_OK2:
0181 2054454D 268 DB " TEMP: ",0
0185 503A2020
0189 20202020
018D 20202020
0191 00
269 ;-----------------------------------------------
0192 270 MENU_ERROR:
0192 9001A1 271 MOV DPTR,#M_ERROR1 ;指针指到显示消息1
0195 7401 272 MOV A,#1 ;显示在第一行
0197 9148 273 CALL LCD_PRINT
0199 9001B2 274 MOV DPTR,#M_ERROR2 ;指针指到显示消息1
019C 7402 275 MOV A,#2 ;显示在第一行
019E 9148 276 CALL LCD_PRINT
01A0 22 277 RET
01A1 278 M_ERROR1:
01A1 20445331 279 DB " DS18B20 ERROR ",0
01A5 38423230
01A9 20455252
01AD 4F522020
01B1 00
01B2 280 M_ERROR2:
01B2 2054454D 281 DB " TEMP: ---- ",0
01B6 503A202D
01BA 2D2D2D20
01BE 20202020
01C2 00
282 ;====================================================
01C3 D2B3 283 reset: setb date_line
01C5 00 284 nop
01C6 C2B3 285 clr date_line
01C8 786B 286 mov r0,#6bh ;主机发出延时复位低脉冲
01CA 7904 287 mov r1,#04h
01CC D8FE 288 tsr1: djnz r0,$
01CE 786B 289 mov r0,#6bh
01D0 D9FA 290 djnz r1,tsr1
01D2 D2B3 291 setb date_line ;然后拉高数据线
01D4 00 292 nop
01D5 00 293 nop
01D6 00 294 nop
01D7 7832 295 mov r0,#32h
01D9 30B304 296 tsr2: jnb date_line,tsr3 ;等待DS18B20回应
01DC D8FB 297 djnz r0,tsr2
01DE 8004 298 jmp tsr4 ; 延时
01E0 D200 299 tsr3: setb flag1 ; 置标志位,表示DS1820存在
01E2 8004 300 jmp tsr5
01E4 C200 301 tsr4: clr flag1 ; 清标志位,表示DS1820不存在
01E6 8004 302 jmp tsr7
01E8 786B 303 tsr5: mov r0,#06bh
A51 MACRO ASSEMBLER DS18B20 11/15/2006 21:06:21 PAGE 6
01EA D8FE 304 tsr6: djnz r0,$ ; 时序要求延时一段时间
01EC D2B3 305 tsr7: setb date_line
01EE 22 306 ret
307 ;=======================================================
01EF 308 RE_18B20:
01EF 200001 309 JB FLAG1,RE_18B20A
01F2 22 310 RET
01F3 311 RE_18B20A:
01F3 31C3 312 CALL RESET
01F5 74CC 313 MOV A,#0CCH ;跳过ROM匹配
01F7 120243 314 LCALL WRITE
01FA 744E 315 MOV A,#4EH ;写暂存寄存器
01FC 120243 316 LCALL WRITE
01FF E527 317 MOV A,TEMP_TH ;TH(报警上限)
0201 120243 318 LCALL WRITE
0204 E528 319 MOV A,TEMP_TL ;TL(报警下限)
0206 120243 320 LCALL WRITE
0209 747F 321 MOV A,#7FH ;12位精确度
020B 120243 322 LCALL WRITE
020E 22 323 RET
324 ;------------------------------------------------------------
020F 325 WRITE_E2:
020F 31C3 326 CALL RESET
0211 74CC 327 MOV A,#0CCH ;跳过ROM匹配
0213 120243 328 LCALL WRITE
0216 7448 329 MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
0218 120243 330 LCALL WRITE
021B 22 331 RET
332 ;--------------------------------------------------------------
021C 333 READ_E2:
021C 31C3 334 CALL RESET
021E 74CC 335 MOV A,#0CCH ;跳过ROM匹配
0220 120243 336 LCALL WRITE
0223 74B8 337 MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
0225 5143 338 CALL WRITE
0227 22 339 RET
340 ;--------------------------------------------------------------
341 ;将自定义字符写入LCD1602的CGRAM中
342 ;--------------------------------------------------------------
0228 343 STORE_DATA:
0228 7440 344 MOV A,#40H
022A 917B 345 CALL WCOM
022C 7A08 346 MOV R2,#08H
022E 90023B 347 MOV DPTR,#D_DATA
0231 7B00 348 MOV R3,#00H
0233 349 S_DATA:
0233 EB 350 MOV A,R3
0234 93 351 MOVC A,@A+DPTR
0235 9188 352 CALL WDATA ;写入数据
0237 0B 353 INC R3
0238 DAF9 354 DJNZ R2,S_DATA
023A 22 355 RET
356
023B 357 D_DATA:
023B 0C12120C 358 DB 0CH,12H,12H,0CH,00H,00H,00H,00H
023F 00000000
359 ;==============================================================
0243 7A08 360 write: mov r2,#8 ;一共8位数据
0245 C3 361 CLR C
0246 362 wr1:
0246 C2B3 363 clr date_line ;开始写入DS18B20总线要处于复位(低)状态
0248 7B07 364 mov r3,#07
024A DBFE 365 djnz r3,$ ;总线复位保持16微妙以上
024C 13 366 rrc a ;把一个字节DATA 分成8个BIT环移给C
024D 92B3 367 mov date_line,c ;写入一个BIT
024F 7B3C 368 mov r3,#3CH
A51 MACRO ASSEMBLER DS18B20 11/15/2006 21:06:21 PAGE 7
0251 DBFE 369 djnz r3,$ ;等待100微妙
0253 D2B3 370 setb date_line ;重新释放总线
0255 00 371 nop
0256 DAEE 372 djnz r2,wr1 ;写入下一个BIT
0258 D2B3 373 setb date_line
025A 22 374 ret
375 ;--------------------------------------------------------------------
025B 7C04 376 read: mov r4,#4 ; 将温度低位、高位、TH、TL从DS18B20中读出
025D 7925 377 mov r1,#TEMPL ; 存入25H、26H、27H、28H
025F 7A08 378 re00: mov r2,#8
0261 C2D7 379 re01: clr cy
0263 D2B3 380 setb date_line
0265 00 381 nop
0266 00 382 nop
0267 C2B3 383 clr date_line ;读前总线保持为低
0269 00 384 nop
026A 00 385 nop
026B 00 386 nop
026C D2B3 387 setb date_line ;开始读总线释放
026E 7B09 388 mov r3,#09 ;延时18微妙
0270 DBFE 389 djnz r3,$
0272 A2B3 390 mov c,date_line ;从DS18B20总线读得一个BIT
0274 7B3C 391 mov r3,#3CH
0276 DBFE 392 djnz r3,$ ;等待100微妙
0278 13 393 rrc a ;把读得的位值环移给A
0279 DAE6 394 djnz r2,re01 ;读下一个BIT
027B F7 395 mov @r1,a
027C 09 396 inc r1
027D DCE0 397 djnz r4,re00
027F 22 398 ret
399
400
401 ;*****************************************************
402 ; 处理温度 BCD 码子程序
403 ;****************************************************
0280 E526 404 CONVTEMP: MOV A,TEMPH ;判温度是否零下
0282 5480 405 ANL A,#80H
0284 6011 406 JZ TEMPC1 ;温度零上转
0286 C3 407 CLR C
0287 E525 408 MOV A,TEMPL ;二进制数求补(双字节)
0289 F4 409 CPL A ;取反加1
028A 2401 410 ADD A,#01H
028C F525 411 MOV TEMPL,A
028E E526 412 MOV A,TEMPH
0290 F4 413 CPL A
0291 3400 414 ADDC A,#00H
0293 F526 415 MOV TEMPH,A
0295 8003 416 SJMP TEMPC11
417
0297 75290A 418 TEMPC1: MOV TEMPHC,#0AH ;+
029A E529 419 TEMPC11: MOV A,TEMPHC
029C C4 420 SWAP A
029D F529 421 MOV TEMPHC,A
029F E525 422 MOV A,TEMPL
02A1 540F 423 ANL A,#0FH ;乘0.0625
02A3 9002EB 424 MOV DPTR,#TEMPDOTTAB
02A6 93 425 MOVC A,@A+DPTR
02A7 F52A 426 MOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD
427
02A9 E525 428 MOV A,TEMPL ;整数部分
02AB 54F0 429 ANL A,#0F0H ;取出高四位
02AD C4 430 SWAP A
02AE F525 431 MOV TEMPL,A
02B0 E526 432 MOV A,TEMPH ;取出低四位
02B2 540F 433 ANL A,#0FH
02B4 C4 434 SWAP A
A51 MACRO ASSEMBLER DS18B20 11/15/2006 21:06:21 PAGE 8
02B5 4525 435 ORL A,TEMPL ;重新组合
02B7 F524 436 MOV TEMP_ZH,A
02B9 1202DD 437 LCALL HEX2BCD1
02BC F525 438 MOV TEMPL,A
02BE 54F0 439 ANL A,#0F0H
02C0 C4 440 SWAP A
02C1 4529 441 ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD
02C3 F529 442 MOV TEMPHC,A
02C5 E525 443 MOV A,TEMPL
02C7 540F 444 ANL A,#0FH
02C9 C4 445 SWAP A ;TEMPLC HI = 个位数 BCD
02CA 452A 446 ORL A,TEMPLC
02CC F52A 447 MOV TEMPLC,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -