📄 main.lst
字号:
253 0056 9927 clr r25
254 /* epilogue: frame size=0 */
255 0058 0895 ret
256 /* epilogue end (size=1) */
257 /* function ds18b20_reset size 32 (31) */
271 .Lscope3:
274 .global ds18b20_write
276 ds18b20_write:
147:ds18b20.h ****
148:ds18b20.h **** /*--------------------------------------------------------
149:ds18b20.h **** * 写命令或数据到温度芯片DS18B20(发送一个字节)
150:ds18b20.h **** */
151:ds18b20.h **** void ds18b20_write(unsigned char dat)
152:ds18b20.h **** {
278 .LM26:
279 /* prologue: frame size=0 */
280 /* prologue end (size=0) */
281 005a 282F mov r18,r24
282 005c 37E0 ldi r19,lo8(7)
283 .L50:
153:ds18b20.h **** unsigned char count;
154:ds18b20.h ****
155:ds18b20.h **** // 每个字节共8位,一次发一位
156:ds18b20.h **** for(count=0; count<8; count++) {
157:ds18b20.h **** cli(); // 保证绝对不会发生中断!
285 .LM27:
286 /* #APP */
287 005e F894 cli
158:ds18b20.h **** DQ_TO_0(); // 设置1-wire总线为低电平
289 .LM28:
290 /* #NOAPP */
291 0060 8B9A sbi 49-0x20,3
292 .LBB8:
294 .Ltext9:
296 .LM29:
297 0062 8BE0 ldi r24,lo8(11)
298 0064 90E0 ldi r25,hi8(11)
299 .LBB9:
301 .LM30:
302 /* #APP */
303 0066 0197 1: sbiw r24,1
304 0068 F1F7 brne 1b
305 /* #NOAPP */
306 .LBE9:
307 .LBE8:
309 .Ltext10:
159:ds18b20.h **** wait_us(4); // about 2us
160:ds18b20.h ****
161:ds18b20.h **** if(dat&0x01) DQ_TO_1(); // 并串转换,先低位后高位
311 .LM31:
312 006a 20FF sbrs r18,0
313 006c 02C0 rjmp .L46
314 006e 8B98 cbi 49-0x20,3
315 0070 01C0 rjmp .L47
316 .L46:
162:ds18b20.h **** else DQ_TO_0();
318 .LM32:
319 0072 8B9A sbi 49-0x20,3
320 .L47:
163:ds18b20.h **** dat >>= 1; // 下一位做好准备
322 .LM33:
323 0074 2695 lsr r18
324 .LBB10:
326 .Ltext11:
328 .LM34:
329 0076 82EE ldi r24,lo8(226)
330 0078 90E0 ldi r25,hi8(226)
331 .LBB11:
333 .LM35:
334 /* #APP */
335 007a 0197 1: sbiw r24,1
336 007c F1F7 brne 1b
337 /* #NOAPP */
338 .LBE11:
339 .LBE10:
341 .Ltext12:
164:ds18b20.h ****
165:ds18b20.h **** // 60us~120us(实际不能到120us, 因为其它语句也用时间了!)
166:ds18b20.h **** wait_us(82); // 62us
167:ds18b20.h ****
168:ds18b20.h **** DQ_TO_1();
343 .LM36:
344 007e 8B98 cbi 49-0x20,3
169:ds18b20.h **** sei(); // 恢复系统中断
346 .LM37:
347 /* #APP */
348 0080 7894 sei
349 /* #NOAPP */
350 .LBB12:
352 .Ltext13:
354 .LM38:
355 0082 8BE0 ldi r24,lo8(11)
356 0084 90E0 ldi r25,hi8(11)
357 .LBB13:
359 .LM39:
360 /* #APP */
361 0086 0197 1: sbiw r24,1
362 0088 F1F7 brne 1b
363 /* #NOAPP */
364 .LBE13:
365 .LBE12:
367 .Ltext14:
369 .LM40:
370 008a 3150 subi r19,lo8(-(-1))
371 008c 37FF sbrs r19,7
372 008e E7CF rjmp .L50
373 /* epilogue: frame size=0 */
374 0090 0895 ret
375 /* epilogue end (size=1) */
376 /* function ds18b20_write size 36 (35) */
390 .Lscope4:
392 .global ds18b20_read
394 ds18b20_read:
170:ds18b20.h **** wait_us(4); // 2us
171:ds18b20.h **** }
172:ds18b20.h **** }
173:ds18b20.h ****
174:ds18b20.h **** /*---------------------------------------------------------
175:ds18b20.h **** * 从温度芯片DS18B20读配置或数据(接收一个字节)
176:ds18b20.h **** */
177:ds18b20.h **** unsigned char ds18b20_read(void)
178:ds18b20.h **** {
396 .LM41:
397 /* prologue: frame size=0 */
398 /* prologue end (size=0) */
179:ds18b20.h **** unsigned char count,dat;
180:ds18b20.h ****
181:ds18b20.h **** dat = 0x00; // 数据接收准备
400 .LM42:
401 0092 20E0 ldi r18,lo8(0)
402 0094 37E0 ldi r19,lo8(7)
403 .L61:
182:ds18b20.h ****
183:ds18b20.h **** // 每个字节共8位,一次收一位
184:ds18b20.h **** for(count=0; count<8; count++) {
185:ds18b20.h **** cli(); // 保证绝对不会发生中断!
405 .LM43:
406 /* #APP */
407 0096 F894 cli
186:ds18b20.h ****
187:ds18b20.h **** // 从总线拉低到读总线状态,不能大于15us!
188:ds18b20.h **** DQ_TO_0(); // 设置1-wire总线为低电平(拉低总线以同步)
409 .LM44:
410 /* #NOAPP */
411 0098 8B9A sbi 49-0x20,3
412 .LBB14:
414 .Ltext15:
416 .LM45:
417 009a 8BE0 ldi r24,lo8(11)
418 009c 90E0 ldi r25,hi8(11)
419 .LBB15:
421 .LM46:
422 /* #APP */
423 009e 0197 1: sbiw r24,1
424 00a0 F1F7 brne 1b
425 /* #NOAPP */
426 .LBE15:
427 .LBE14:
429 .Ltext16:
189:ds18b20.h **** wait_us(4); // 2us
190:ds18b20.h **** DQ_TO_1(); // 设置1-wire总线为高电平(释放总线)
431 .LM47:
432 00a2 8B98 cbi 49-0x20,3
433 .LBB16:
435 .Ltext17:
437 .LM48:
438 00a4 83E1 ldi r24,lo8(19)
439 00a6 90E0 ldi r25,hi8(19)
440 .LBB17:
442 .LM49:
443 /* #APP */
444 00a8 0197 1: sbiw r24,1
445 00aa F1F7 brne 1b
446 /* #NOAPP */
447 .LBE17:
448 .LBE16:
450 .Ltext18:
191:ds18b20.h **** wait_us(7); // 4us
192:ds18b20.h **** dat >>= 1;
452 .LM50:
453 00ac 2695 lsr r18
193:ds18b20.h **** if(DQ_status()) dat|=0x80; // 读取总线电平,先收低位再收高位
455 .LM51:
456 00ae 8399 sbic 48-0x20,3
457 00b0 2068 ori r18,lo8(-128)
458 .L59:
194:ds18b20.h ****
195:ds18b20.h **** sei(); // 恢复系统中断
460 .LM52:
461 /* #APP */
462 00b2 7894 sei
463 /* #NOAPP */
464 .LBB18:
466 .Ltext19:
468 .LM53:
469 00b4 82EE ldi r24,lo8(226)
470 00b6 90E0 ldi r25,hi8(226)
471 .LBB19:
473 .LM54:
474 /* #APP */
475 00b8 0197 1: sbiw r24,1
476 00ba F1F7 brne 1b
477 /* #NOAPP */
478 .LBE19:
479 .LBE18:
481 .Ltext20:
483 .LM55:
484 00bc 3150 subi r19,lo8(-(-1))
485 00be 37FF sbrs r19,7
486 00c0 EACF rjmp .L61
196:ds18b20.h **** wait_us(82); // 必须大于60us
197:ds18b20.h **** }
198:ds18b20.h **** return(dat);
199:ds18b20.h **** }
488 .LM56:
489 00c2 822F mov r24,r18
490 00c4 9927 clr r25
491 /* epilogue: frame size=0 */
492 00c6 0895 ret
493 /* epilogue end (size=1) */
494 /* function ds18b20_read size 36 (35) */
509 .Lscope5:
511 .global convert_T
513 convert_T:
200:ds18b20.h ****
201:ds18b20.h **** /*-------------------------------------------------------
202:ds18b20.h **** * 我的电路中只有一个器件DS18B20,所以不需要多个器件的ID
203:ds18b20.h **** * 识别,跳过之后,启动温度转换,但在启动后,用户应等待几百个
204:ds18b20.h **** * 毫秒,才能读到这次的转换值,这是DS18B20的数据手册规定的。
205:ds18b20.h **** * 因为温度转换是需要时间的嘛!(^_^)
206:ds18b20.h **** */
207:ds18b20.h **** void convert_T(void)
208:ds18b20.h **** {
515 .LM57:
516 /* prologue: frame size=0 */
517 /* prologue end (size=0) */
209:ds18b20.h **** if(ds18b20_reset()==SUCC) { // 如果复位成功
519 .LM58:
520 00c8 0E94 0000 call ds18b20_reset
521 00cc 8130 cpi r24,lo8(1)
522 00ce 31F4 brne .L64
210:ds18b20.h **** ds18b20_write(0xcc); // 跳过多器件识别
524 .LM59:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -