📄 ds18b20.lst
字号:
84:drive/ds18b20.c **** * 复位函数冗余处理
85:drive/ds18b20.c **** */
86:drive/ds18b20.c **** inline BOOL ds18b20_reset(void)
87:drive/ds18b20.c **** {
270 .LM19:
271 /* prologue: frame size=0 */
272 0036 CF93 push r28
273 /* prologue end (size=1) */
88:drive/ds18b20.c **** u08 Cnt = 0;
275 .LM20:
276 0038 C0E0 ldi r28,lo8(0)
89:drive/ds18b20.c **** while(!(_ds18b20_reset() == SUCC))
278 .LM21:
279 003a 06C0 rjmp .L9
280 .L12:
90:drive/ds18b20.c **** {
91:drive/ds18b20.c **** Cnt++;
282 .LM22:
283 003c CF5F subi r28,lo8(-(1))
92:drive/ds18b20.c **** if(Cnt > 3)
285 .LM23:
286 003e C430 cpi r28,lo8(4)
287 0040 18F0 brlo .L9
93:drive/ds18b20.c **** return FAIL ;
289 .LM24:
290 0042 80E0 ldi r24,lo8(0)
291 0044 90E0 ldi r25,hi8(0)
292 0046 05C0 rjmp .L8
293 .L9:
294 0048 DEDF rcall _ds18b20_reset
295 004a 8130 cpi r24,lo8(1)
296 004c B9F7 brne .L12
94:drive/ds18b20.c **** }
95:drive/ds18b20.c **** return SUCC ;
298 .LM25:
299 004e 81E0 ldi r24,lo8(1)
300 0050 90E0 ldi r25,hi8(1)
301 .L8:
302 /* epilogue: frame size=0 */
303 0052 CF91 pop r28
304 0054 0895 ret
305 /* epilogue end (size=2) */
306 /* function ds18b20_reset size 16 (13) */
311 .Lscope2:
314 .global ds18b20_write
316 ds18b20_write:
96:drive/ds18b20.c **** }
97:drive/ds18b20.c ****
98:drive/ds18b20.c **** /*--------------------------------------------------------
99:drive/ds18b20.c **** * 写命令或数据到温度芯片DS18B20(发送一个字节)
100:drive/ds18b20.c **** */
101:drive/ds18b20.c **** void ds18b20_write(u08 dat)
102:drive/ds18b20.c **** {
318 .LM26:
319 /* prologue: frame size=0 */
320 /* prologue end (size=0) */
321 0056 282F mov r18,r24
322 0058 37E0 ldi r19,lo8(7)
323 .L22:
103:drive/ds18b20.c **** u08 count;
104:drive/ds18b20.c ****
105:drive/ds18b20.c **** // 每个字节共8位,一次发一位
106:drive/ds18b20.c **** for(count=0; count<8; count++) {
107:drive/ds18b20.c **** cli(); // 保证绝对不会发生中断!
325 .LM27:
326 /* #APP */
327 005a F894 cli
108:drive/ds18b20.c **** DQ_TO_0(); // 设置1-wire总线为低电平
329 .LM28:
330 /* #NOAPP */
331 005c 8B9A sbi 49-0x20,3
332 .LBB8:
334 .Ltext7:
336 .LM29:
337 005e 84E0 ldi r24,lo8(4)
338 0060 90E0 ldi r25,hi8(4)
339 .LBB9:
341 .LM30:
342 /* #APP */
343 0062 0197 1: sbiw r24,1
344 0064 F1F7 brne 1b
345 /* #NOAPP */
346 .LBE9:
347 .LBE8:
349 .Ltext8:
109:drive/ds18b20.c **** wait_us(2); // about 2us
110:drive/ds18b20.c ****
111:drive/ds18b20.c **** if(dat&0x01) DQ_TO_1(); // 并串转换,先低位后高位
351 .LM31:
352 0066 20FF sbrs r18,0
353 0068 02C0 rjmp .L18
354 006a 8B98 cbi 49-0x20,3
355 006c 01C0 rjmp .L19
356 .L18:
112:drive/ds18b20.c **** else DQ_TO_0();
358 .LM32:
359 006e 8B9A sbi 49-0x20,3
360 .L19:
113:drive/ds18b20.c **** dat >>= 1; // 下一位做好准备
362 .LM33:
363 0070 2695 lsr r18
364 .LBB10:
366 .Ltext9:
368 .LM34:
369 0072 8CE7 ldi r24,lo8(124)
370 0074 90E0 ldi r25,hi8(124)
371 .LBB11:
373 .LM35:
374 /* #APP */
375 0076 0197 1: sbiw r24,1
376 0078 F1F7 brne 1b
377 /* #NOAPP */
378 .LBE11:
379 .LBE10:
381 .Ltext10:
114:drive/ds18b20.c ****
115:drive/ds18b20.c **** // 60us~120us(实际不能到120us, 因为其它语句也用时间了!)
116:drive/ds18b20.c **** wait_us(62); // 62us
117:drive/ds18b20.c ****
118:drive/ds18b20.c **** DQ_TO_1();
383 .LM36:
384 007a 8B98 cbi 49-0x20,3
119:drive/ds18b20.c **** sei(); // 恢复系统中断
386 .LM37:
387 /* #APP */
388 007c 7894 sei
389 /* #NOAPP */
390 .LBB12:
392 .Ltext11:
394 .LM38:
395 007e 84E0 ldi r24,lo8(4)
396 0080 90E0 ldi r25,hi8(4)
397 .LBB13:
399 .LM39:
400 /* #APP */
401 0082 0197 1: sbiw r24,1
402 0084 F1F7 brne 1b
403 /* #NOAPP */
404 .LBE13:
405 .LBE12:
407 .Ltext12:
409 .LM40:
410 0086 3150 subi r19,lo8(-(-1))
411 0088 37FF sbrs r19,7
412 008a E7CF rjmp .L22
413 /* epilogue: frame size=0 */
414 008c 0895 ret
415 /* epilogue end (size=1) */
416 /* function ds18b20_write size 36 (35) */
430 .Lscope3:
432 .global ds18b20_read
434 ds18b20_read:
120:drive/ds18b20.c **** wait_us(2); // 2us
121:drive/ds18b20.c **** }
122:drive/ds18b20.c **** }
123:drive/ds18b20.c ****
124:drive/ds18b20.c **** /*---------------------------------------------------------
125:drive/ds18b20.c **** * 从温度芯片DS18B20读配置或数据(接收一个字节)
126:drive/ds18b20.c **** */
127:drive/ds18b20.c **** u08 ds18b20_read(void)
128:drive/ds18b20.c **** {
436 .LM41:
437 /* prologue: frame size=0 */
438 /* prologue end (size=0) */
129:drive/ds18b20.c **** u08 count,dat;
130:drive/ds18b20.c ****
131:drive/ds18b20.c **** dat = 0x00; // 数据接收准备
440 .LM42:
441 008e 20E0 ldi r18,lo8(0)
442 0090 37E0 ldi r19,lo8(7)
443 .L33:
132:drive/ds18b20.c ****
133:drive/ds18b20.c **** // 每个字节共8位,一次收一位
134:drive/ds18b20.c **** for(count=0; count<8; count++) {
135:drive/ds18b20.c **** cli(); // 保证绝对不会发生中断!
445 .LM43:
446 /* #APP */
447 0092 F894 cli
136:drive/ds18b20.c ****
137:drive/ds18b20.c **** // 从总线拉低到读总线状态,不能大于15us!
138:drive/ds18b20.c **** DQ_TO_0(); // 设置1-wire总线为低电平(拉低总线以同步)
449 .LM44:
450 /* #NOAPP */
451 0094 8B9A sbi 49-0x20,3
452 .LBB14:
454 .Ltext13:
456 .LM45:
457 0096 84E0 ldi r24,lo8(4)
458 0098 90E0 ldi r25,hi8(4)
459 .LBB15:
461 .LM46:
462 /* #APP */
463 009a 0197 1: sbiw r24,1
464 009c F1F7 brne 1b
465 /* #NOAPP */
466 .LBE15:
467 .LBE14:
469 .Ltext14:
139:drive/ds18b20.c **** wait_us(2); // 2us
140:drive/ds18b20.c **** DQ_TO_1(); // 设置1-wire总线为高电平(释放总线)
471 .LM47:
472 009e 8B98 cbi 49-0x20,3
473 .LBB16:
475 .Ltext15:
477 .LM48:
478 00a0 88E0 ldi r24,lo8(8)
479 00a2 90E0 ldi r25,hi8(8)
480 .LBB17:
482 .LM49:
483 /* #APP */
484 00a4 0197 1: sbiw r24,1
485 00a6 F1F7 brne 1b
486 /* #NOAPP */
487 .LBE17:
488 .LBE16:
490 .Ltext16:
141:drive/ds18b20.c **** wait_us(4); // 4us
142:drive/ds18b20.c **** dat >>= 1;
492 .LM50:
493 00a8 2695 lsr r18
143:drive/ds18b20.c **** if(DQ_status()) dat|=0x80; // 读取总线电平,先收低位再收高位
495 .LM51:
496 00aa 8399 sbic 48-0x20,3
497 00ac 2068 ori r18,lo8(-128)
498 .L31:
144:drive/ds18b20.c ****
145:drive/ds18b20.c **** sei(); // 恢复系统中断
500 .LM52:
501 /* #APP */
502 00ae 7894 sei
503 /* #NOAPP */
504 .LBB18:
506 .Ltext17:
508 .LM53:
509 00b0 8CE7 ldi r24,lo8(124)
510 00b2 90E0 ldi r25,hi8(124)
511 .LBB19:
513 .LM54:
514 /* #APP */
515 00b4 0197 1: sbiw r24,1
516 00b6 F1F7 brne 1b
517 /* #NOAPP */
518 .LBE19:
519 .LBE18:
521 .Ltext18:
523 .LM55:
524 00b8 3150 subi r19,lo8(-(-1))
525 00ba 37FF sbrs r19,7
526 00bc EACF rjmp .L33
146:drive/ds18b20.c **** wait_us(62); // 必须大于60us
147:drive/ds18b20.c **** }
148:drive/ds18b20.c **** return(dat);
149:drive/ds18b20.c **** }
528 .LM56:
529 00be 822F mov r24,r18
530 00c0 9927 clr r25
531 /* epilogue: frame size=0 */
532 00c2 0895 ret
533 /* epilogue end (size=1) */
534 /* function ds18b20_read size 36 (35) */
549 .Lscope4:
551 .global convert_T
553 convert_T:
150:drive/ds18b20.c ****
151:drive/ds18b20.c **** /*-------------------------------------------------------
152:drive/ds18b20.c **** * 我的电路中只有一个器件DS18B20,所以不需要多个器件的ID
153:drive/ds18b20.c **** * 识别,跳过之后,启动温度转换,但在启动后,用户应等待几百个
154:drive/ds18b20.c **** * 毫秒,才能读到这次的转换值,这是DS18B20的数据手册规定的。
155:drive/ds18b20.c **** * 因为温度转换是需要时间的嘛!(^_^)
156:drive/ds18b20.c **** */
157:drive/ds18b20.c ****
158:drive/ds18b20.c **** BOOL convert_is_succ = FALSE ;
159:drive/ds18b20.c ****
160:drive/ds18b20.c **** BOOL convert_T(void)
161:drive/ds18b20.c **** {
555 .LM57:
556 /* prologue: frame size=0 */
557 00c4 0F93 push r16
558 00c6 1F93 push r17
559 /* prologue end (size=2) */
560 .LBB20:
561 .LBB21:
563 .LM58:
564 00c8 00E0 ldi r16,lo8(0)
566 .LM59:
567 00ca 03C0 rjmp .L38
568 .L42:
570 .LM60:
571 00cc 0F5F subi r16,lo8(-(1))
573 .LM61:
574 00ce 0430 cpi r16,lo8(4)
575 00d0 68F4 brsh .L44
576 .L38:
577 00d2 99DF rcall _ds18b20_reset
578 00d4 8130 cpi r24,lo8(1)
579 00d6 D1F7 brne .L42
581 .LM62:
582 00d8 01E0 ldi r16,lo8(1)
583 00da 10E0 ldi r17,hi8(1)
584 .LBE21:
585 .LBE20:
162:drive/ds18b20.c **** if(ds18b20_reset()==SUCC) { // 如果复位成功
163:drive/ds18b20.c **** ds18b20_write(0xcc); // 跳过多器件识别
587 .LM63:
588 00dc 8CEC ldi r24,lo8(-52)
589 00de BBDF rcall ds18b20_write
164:drive/ds18b20.c **** ds18b20_write(0x44); // 启动温度转换
591 .LM64:
592 00e0 84E4 ldi r24,lo8(68)
593 00e2 B9DF rcall ds18b20_write
165:drive/ds18b20.c **** convert_is_succ = TRUE;
595 .LM65:
596 00e4 0093 0000 sts convert_is_succ,r16
166:drive/ds18b20.c **** return TRUE ;
598 .LM66:
599 00e8 C801 movw r24,r16
600 00ea 04C0 rjmp .L36
601 .L44:
167:drive/ds18b20.c **** }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -