📄 ds18b20.lss
字号:
//USART 9600 8n1
UCSRC = (1<<URSEL) | 0x06;
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
19a: 89 e1 ldi r24, 0x19 ; 25
19c: 89 b9 out 0x09, r24 ; 9
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
19e: 10 bc out 0x20, r1 ; 32
UCSRA = 0x00;
1a0: 1b b8 out 0x0b, r1 ; 11
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
1a2: 88 e9 ldi r24, 0x98 ; 152
1a4: 8a b9 out 0x0a, r24 ; 10
1a6: 08 95 ret
000001a8 <display>:
/*-------------------------------------------------------------------------
*动态显示数码管
*/
void display(void)
{
1a8: 41 e0 ldi r20, 0x01 ; 1
1aa: 20 e0 ldi r18, 0x00 ; 0
1ac: 30 e0 ldi r19, 0x00 ; 0
1ae: a0 ed ldi r26, 0xD0 ; 208
1b0: b7 e0 ldi r27, 0x07 ; 7
1b2: e8 e7 ldi r30, 0x78 ; 120
1b4: f0 e0 ldi r31, 0x00 ; 0
uint8_t i,sel=0x01;
for (i=0;i<5;i++)
{
PORTA = led_seg[4-i];
1b6: 80 81 ld r24, Z
1b8: 31 97 sbiw r30, 0x01 ; 1
1ba: 8b bb out 0x1b, r24 ; 27
PORTB = ~sel;
1bc: 84 2f mov r24, r20
1be: 80 95 com r24
1c0: 88 bb out 0x18, r24 ; 24
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
1c2: cd 01 movw r24, r26
1c4: 01 97 sbiw r24, 0x01 ; 1
1c6: f1 f7 brne .-4 ; 0x1c4 <display+0x1c>
_delay_ms (2);
sel=sel<<1;
1c8: 44 0f add r20, r20
1ca: 2f 5f subi r18, 0xFF ; 255
1cc: 3f 4f sbci r19, 0xFF ; 255
1ce: 25 30 cpi r18, 0x05 ; 5
1d0: 31 05 cpc r19, r1
1d2: 89 f7 brne .-30 ; 0x1b6 <display+0xe>
1d4: 08 95 ret
000001d6 <delay_s>:
}
}
/*--------------------------------------------------------------------------
*初始化avr和18b20
*/
void init(void)
{
DDRA = 0XFF;
DDRB = 0XFF;
PORTA = 0X00;
PORTB = 0XFF;
DDRD = 0xFF;
PORTD = 0xFF;
init_USART();
DS18b20_config();
}
/*--------------------------------------------------------------------------
*延时程序
*/
void delay_s(uint16_t m)
{
1d6: e8 ee ldi r30, 0xE8 ; 232
1d8: f3 e0 ldi r31, 0x03 ; 3
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
1da: cf 01 movw r24, r30
1dc: 01 97 sbiw r24, 0x01 ; 1
1de: f1 f7 brne .-4 ; 0x1dc <delay_s+0x6>
1e0: fc cf rjmp .-8 ; 0x1da <delay_s+0x4>
000001e2 <hex_to_dec>:
while((m--)>=0)
{
wait_us(1000);
}
}
/*--------------------------------------------------------------------------
* 把采集到的温度数据转化成十进制,采用12位精度,温度小数部分精确到小数点后一位,采用四舍五入。
*
* 0 cel_frac 小数点后第二位 进位位
* 1 0625 625 1
* 2 1250 250
* 3 1875 875 3
* 4 2500 500 4
* 5 3125 125
* 6 3750 750 6
* 7 4375 375
* 8 5000 0
* 9 5625 625 9
* 10 6250 250
* 11 6875 875 11
* 12 7500 500 12
* 13 8125 125
* 14 8750 750 14
* 15 9375 375
*/
uint16_t hex_to_dec(uint16_t means)
{
1e2: cf 93 push r28
1e4: df 93 push r29
1e6: cd b7 in r28, 0x3d ; 61
1e8: de b7 in r29, 0x3e ; 62
1ea: 28 97 sbiw r28, 0x08 ; 8
1ec: 0f b6 in r0, 0x3f ; 63
1ee: f8 94 cli
1f0: de bf out 0x3e, r29 ; 62
1f2: 0f be out 0x3f, r0 ; 63
1f4: cd bf out 0x3d, r28 ; 61
1f6: fc 01 movw r30, r24
uint16_t value;
uint8_t cel; //温度整数部分
uint8_t cel_frac; //温度小数部分
uint8_t i;
uint8_t need_rounding[]={1,3,4,6,9,11,12,14};
1f8: 9e 01 movw r18, r28
1fa: 2f 5f subi r18, 0xFF ; 255
1fc: 3f 4f sbci r19, 0xFF ; 255
1fe: 4a e6 ldi r20, 0x6A ; 106
200: 50 e0 ldi r21, 0x00 ; 0
202: 88 e0 ldi r24, 0x08 ; 8
204: da 01 movw r26, r20
206: 0d 90 ld r0, X+
208: ad 01 movw r20, r26
20a: d9 01 movw r26, r18
20c: 0d 92 st X+, r0
20e: 9d 01 movw r18, r26
210: 81 50 subi r24, 0x01 ; 1
212: c1 f7 brne .-16 ; 0x204 <hex_to_dec+0x22>
if (means & 0x8000) //温度为零下,把负数的补码转化成原码
214: f7 ff sbrs r31, 7
216: 06 c0 rjmp .+12 ; 0x224 <hex_to_dec+0x42>
{
f_t = 1;
218: 81 e0 ldi r24, 0x01 ; 1
21a: 80 93 72 00 sts 0x0072, r24
means ^=0xffff; //取反
means++;
21e: f0 95 com r31
220: e1 95 neg r30
222: ff 4f sbci r31, 0xFF ; 255
}
cel=(uint8_t) (means>>4); //把整数部分由十六转成十进制
cel_frac = (uint8_t) (means & 0x000f);
224: 4e 2f mov r20, r30
226: 4f 70 andi r20, 0x0F ; 15
value =cel_frac*625/1000; //如精确到两位除以100
228: 24 2f mov r18, r20
22a: 33 27 eor r19, r19
22c: 81 e7 ldi r24, 0x71 ; 113
22e: 92 e0 ldi r25, 0x02 ; 2
230: bc 01 movw r22, r24
232: 26 9f mul r18, r22
234: c0 01 movw r24, r0
236: 27 9f mul r18, r23
238: 90 0d add r25, r0
23a: 36 9f mul r19, r22
23c: 90 0d add r25, r0
23e: 11 24 eor r1, r1
240: 68 ee ldi r22, 0xE8 ; 232
242: 73 e0 ldi r23, 0x03 ; 3
244: 0e 94 b8 01 call 0x370 ; 0x370 <__divmodhi4>
value +=cel*10; //如精确到两位乘以100
248: 84 e0 ldi r24, 0x04 ; 4
24a: f6 95 lsr r31
24c: e7 95 ror r30
24e: 8a 95 dec r24
250: e1 f7 brne .-8 ; 0x24a <hex_to_dec+0x68>
252: 8a e0 ldi r24, 0x0A ; 10
254: e8 9f mul r30, r24
256: c0 01 movw r24, r0
258: 11 24 eor r1, r1
25a: 68 0f add r22, r24
25c: 79 1f adc r23, r25
25e: fe 01 movw r30, r28
260: 31 96 adiw r30, 0x01 ; 1
262: 9e 01 movw r18, r28
264: 26 5f subi r18, 0xF6 ; 246
266: 3f 4f sbci r19, 0xFF ; 255
for (i=0; i<=sizeof(need_rounding);i++)
{
if (cel_frac==need_rounding[i])
268: 80 81 ld r24, Z
26a: 48 17 cp r20, r24
26c: 19 f4 brne .+6 ; 0x274 <hex_to_dec+0x92>
{
value++;
26e: 6f 5f subi r22, 0xFF ; 255
270: 7f 4f sbci r23, 0xFF ; 255
272: 04 c0 rjmp .+8 ; 0x27c <hex_to_dec+0x9a>
break;
274: 31 96 adiw r30, 0x01 ; 1
276: e2 17 cp r30, r18
278: f3 07 cpc r31, r19
27a: b1 f7 brne .-20 ; 0x268 <hex_to_dec+0x86>
}
}
return value;
}
27c: cb 01 movw r24, r22
27e: 28 96 adiw r28, 0x08 ; 8
280: 0f b6 in r0, 0x3f ; 63
282: f8 94 cli
284: de bf out 0x3e, r29 ; 62
286: 0f be out 0x3f, r0 ; 63
288: cd bf out 0x3d, r28 ; 61
28a: df 91 pop r29
28c: cf 91 pop r28
28e: 08 95 ret
00000290 <init>:
290: 8f ef ldi r24, 0xFF ; 255
292: 8a bb out 0x1a, r24 ; 26
294: 87 bb out 0x17, r24 ; 23
296: 1b ba out 0x1b, r1 ; 27
298: 88 bb out 0x18, r24 ; 24
29a: 81 bb out 0x11, r24 ; 17
29c: 82 bb out 0x12, r24 ; 18
29e: 0e 94 cb 00 call 0x196 ; 0x196 <init_USART>
2a2: 0e 94 47 00 call 0x8e ; 0x8e <DS18b20_config>
2a6: 08 95 ret
000002a8 <put_s>:
2a8: fc 01 movw r30, r24
2aa: 04 c0 rjmp .+8 ; 0x2b4 <put_s+0xc>
2ac: 5d 9b sbis 0x0b, 5 ; 11
2ae: fe cf rjmp .-4 ; 0x2ac <put_s+0x4>
2b0: 31 96 adiw r30, 0x01 ; 1
2b2: 8c b9 out 0x0c, r24 ; 12
2b4: 80 81 ld r24, Z
2b6: 88 23 and r24, r24
2b8: c9 f7 brne .-14 ; 0x2ac <put_s+0x4>
2ba: 08 95 ret
000002bc <main>:
int main(void)
{
2bc: 1f 93 push r17
2be: cf 93 push r28
2c0: df 93 push r29
uint16_t tp;
uint16_t m;
uint8_t i;
init();
2c2: 0e 94 48 01 call 0x290 ; 0x290 <init>
while(1)
{
uint8_t i;
f_t = 0;
2c6: 10 92 72 00 sts 0x0072, r1
m = 0x0000;
covert_t();
2ca: 0e 94 a2 00 call 0x144 ; 0x144 <covert_t>
2ce: 10 e0 ldi r17, 0x00 ; 0
for (i=0;i<=35;i++) //温度转化后一定要延时750ms后再读数据,否则为18b20内部自定义的85度
{
display();
2d0: 0e 94 d4 00 call 0x1a8 ; 0x1a8 <display>
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
2d4: 80 e2 ldi r24, 0x20 ; 32
2d6: 9e e4 ldi r25, 0x4E ; 78
2d8: 01 97 sbiw r24, 0x01 ; 1
2da: f1 f7 brne .-4 ; 0x2d8 <main+0x1c>
2dc: 1f 5f subi r17, 0xFF ; 255
2de: 14 32 cpi r17, 0x24 ; 36
2e0: b9 f7 brne .-18 ; 0x2d0 <main+0x14>
_delay_ms(20);
}
m = read_t();
2e2: 0e 94 ad 00 call 0x15a ; 0x15a <read_t>
i = m>>8;
2e6: 29 2f mov r18, r25
2e8: 33 27 eor r19, r19
2ea: 5d 9b sbis 0x0b, 5 ; 11
2ec: fe cf rjmp .-4 ; 0x2ea <main+0x2e>
2ee: 2c b9 out 0x0c, r18 ; 12
2f0: 5d 9b sbis 0x0b, 5 ; 11
2f2: fe cf rjmp .-4 ; 0x2f0 <main+0x34>
2f4: 8c b9 out 0x0c, r24 ; 12
put_c(i);
i = m;
put_c(i);
tp = hex_to_dec(m);
2f6: 0e 94 f1 00 call 0x1e2 ; 0x1e2 <hex_to_dec>
2fa: 9c 01 movw r18, r24
//tp = hex_to_dec( 0xfc90);
if (f_t)
2fc: 80 91 72 00 lds r24, 0x0072
300: 88 23 and r24, r24
302: 21 f0 breq .+8 ; 0x30c <main+0x50>
{
led_seg[0]=0x40;
304: 80 e4 ldi r24, 0x40 ; 64
306: 80 93 74 00 sts 0x0074, r24
30a: 02 c0 rjmp .+4 ; 0x310 <main+0x54>
}
else
{
led_seg[0]=0x00;
30c: 10 92 74 00 sts 0x0074, r1
310: 44 e0 ldi r20, 0x04 ; 4
312: c8 e7 ldi r28, 0x78 ; 120
314: d0 e0 ldi r29, 0x00 ; 0
}
for (i=4;i>0;i--)
{
led_seg[i]=led_8[tp%10];
316: c9 01 movw r24, r18
318: 6a e0 ldi r22, 0x0A ; 10
31a: 70 e0 ldi r23, 0x00 ; 0
31c: 0e 94 a4 01 call 0x348 ; 0x348 <__udivmodhi4>
320: fc 01 movw r30, r24
322: e0 5a subi r30, 0xA0 ; 160
324: ff 4f sbci r31, 0xFF ; 255
326: 80 81 ld r24, Z
328: 88 83 st Y, r24
32a: 21 97 sbiw r28, 0x01 ; 1
tp = tp/10;
32c: c9 01 movw r24, r18
32e: 6a e0 ldi r22, 0x0A ; 10
330: 70 e0 ldi r23, 0x00 ; 0
332: 0e 94 a4 01 call 0x348 ; 0x348 <__udivmodhi4>
336: 9b 01 movw r18, r22
338: 41 50 subi r20, 0x01 ; 1
33a: 69 f7 brne .-38 ; 0x316 <main+0x5a>
}
led_seg[3]=led_seg[3]+0x80;
33c: 80 91 77 00 lds r24, 0x0077
340: 80 58 subi r24, 0x80 ; 128
342: 80 93 77 00 sts 0x0077, r24
346: bf cf rjmp .-130 ; 0x2c6 <main+0xa>
00000348 <__udivmodhi4>:
348: aa 1b sub r26, r26
34a: bb 1b sub r27, r27
34c: 51 e1 ldi r21, 0x11 ; 17
34e: 07 c0 rjmp .+14 ; 0x35e <__udivmodhi4_ep>
00000350 <__udivmodhi4_loop>:
350: aa 1f adc r26, r26
352: bb 1f adc r27, r27
354: a6 17 cp r26, r22
356: b7 07 cpc r27, r23
358: 10 f0 brcs .+4 ; 0x35e <__udivmodhi4_ep>
35a: a6 1b sub r26, r22
35c: b7 0b sbc r27, r23
0000035e <__udivmodhi4_ep>:
35e: 88 1f adc r24, r24
360: 99 1f adc r25, r25
362: 5a 95 dec r21
364: a9 f7 brne .-22 ; 0x350 <__udivmodhi4_loop>
366: 80 95 com r24
368: 90 95 com r25
36a: bc 01 movw r22, r24
36c: cd 01 movw r24, r26
36e: 08 95 ret
00000370 <__divmodhi4>:
370: 97 fb bst r25, 7
372: 09 2e mov r0, r25
374: 07 26 eor r0, r23
376: 0a d0 rcall .+20 ; 0x38c <__divmodhi4_neg1>
378: 77 fd sbrc r23, 7
37a: 04 d0 rcall .+8 ; 0x384 <__divmodhi4_neg2>
37c: e5 df rcall .-54 ; 0x348 <__udivmodhi4>
37e: 06 d0 rcall .+12 ; 0x38c <__divmodhi4_neg1>
380: 00 20 and r0, r0
382: 1a f4 brpl .+6 ; 0x38a <__divmodhi4_exit>
00000384 <__divmodhi4_neg2>:
384: 70 95 com r23
386: 61 95 neg r22
388: 7f 4f sbci r23, 0xFF ; 255
0000038a <__divmodhi4_exit>:
38a: 08 95 ret
0000038c <__divmodhi4_neg1>:
38c: f6 f7 brtc .-4 ; 0x38a <__divmodhi4_exit>
38e: 90 95 com r25
390: 81 95 neg r24
392: 9f 4f sbci r25, 0xFF ; 255
394: 08 95 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -