📄 ds1820.lis
字号:
0090 CB9B sbis 0x19,3
0092 01C0 rjmp L17
0094 .dbline 89
0094 .dbline 90
0094 ; value|=0x80;
0094 4068 ori R20,128
0096 .dbline 91
0096 ; }
0096 L17:
0096 .dbline 92
0096 05E0 ldi R16,5
0098 B3DF xcall _delay_10us
009A .dbline 93
009A L14:
009A .dbline 81
009A 6A95 dec R22
009C L16:
009C .dbline 81
009C 6623 tst R22
009E 29F7 brne L13
00A0 .dbline 94
00A0 ; delay_10us(5); /*延时60uS*/
00A0 ; }
00A0 ; if (flag & 0x80) { /*恢复中断状态*/
00A0 20900000 lds R2,_flag
00A4 27FE sbrs R2,7
00A6 01C0 rjmp L19
00A8 .dbline 94
00A8 .dbline 95
00A8 ; SEI();
00A8 7894 sei
00AA .dbline 96
00AA ; }
00AA L19:
00AA .dbline 97
00AA ; return(value);
00AA 042F mov R16,R20
00AC .dbline -2
00AC L12:
00AC 0E940000 xcall pop_gset2
00B0 .dbline 0 ; func end
00B0 0895 ret
00B2 .dbsym r value 20 c
00B2 .dbsym r i 22 c
00B2 .dbend
00B2 .dbfunc e ds1820_write_byte _ds1820_write_byte fV
00B2 ; i -> R20
00B2 ; value -> R22
.even
00B2 _ds1820_write_byte::
00B2 0E940000 xcall push_gset2
00B6 602F mov R22,R16
00B8 .dbline -1
00B8 .dbline 101
00B8 ; }
00B8 ;
00B8 ; /*DS18B20字节写入函数*/
00B8 ; void ds1820_write_byte(unsigned char value) {
00B8 .dbline 104
00B8 ;
00B8 ; unsigned char i;
00B8 ; flag = SREG; /*中断保护*/
00B8 2FB6 in R2,0x3f
00BA 20920000 sts _flag,R2
00BE .dbline 105
00BE ; CLI(); /*关中断*/
00BE F894 cli
00C0 .dbline 106
00C0 48E0 ldi R20,8
00C2 0DC0 xjmp L25
00C4 L22:
00C4 .dbline 106
00C4 ; for (i = 8; i != 0; i--) {
00C4 .dbline 107
00C4 ; DQ_OUT;
00C4 D39A sbi 0x1a,3
00C6 .dbline 108
00C6 ; DQ_CLR;
00C6 DB98 cbi 0x1b,3
00C8 .dbline 109
00C8 ; delay4us; /*延时4uS*/
00C8 .dbline 109
00C8 0000 nop
00CA .dbline 109
00CA 0000 nop
00CC .dbline 109
00CC 0000 nop
00CE .dbline 109
00CE 0000 nop
00D0 .dbline 109
00D0 .dbline 109
00D0 .dbline 110
00D0 ; if (value & 0x01) {DQ_SET;}
00D0 60FD sbrc R22,0
00D2 .dbline 110
00D2 .dbline 110
00D2 DB9A sbi 0x1b,3
00D4 .dbline 110
00D4 L26:
00D4 .dbline 112
00D4 07E0 ldi R16,7
00D6 94DF xcall _delay_10us
00D8 .dbline 113
00D8 DB9A sbi 0x1b,3
00DA .dbline 114
00DA 6695 lsr R22
00DC .dbline 115
00DC L23:
00DC .dbline 106
00DC 4A95 dec R20
00DE L25:
00DE .dbline 106
00DE 4423 tst R20
00E0 89F7 brne L22
00E2 .dbline 116
00E2 20900000 lds R2,_flag
00E6 27FE sbrs R2,7
00E8 01C0 rjmp L28
00EA .dbline 116
00EA .dbline 117
00EA 7894 sei
00EC .dbline 118
00EC L28:
00EC .dbline -2
00EC L21:
00EC 0E940000 xcall pop_gset2
00F0 .dbline 0 ; func end
00F0 0895 ret
00F2 .dbsym r i 20 c
00F2 .dbsym r value 22 c
00F2 .dbend
00F2 .dbfunc e ds1820_start _ds1820_start fV
.even
00F2 _ds1820_start::
00F2 .dbline -1
00F2 .dbline 122
00F2 ; //每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0
00F2 ; delay_10us(7); /*延时80uS*/
00F2 ; DQ_SET; /*位结束*/
00F2 ; value >>= 1;
00F2 ; }
00F2 ; if (flag & 0x80) { /*恢复中断状态*/
00F2 ; SEI();
00F2 ; }
00F2 ; }
00F2 ;
00F2 ; /*启动ds1820转换*/
00F2 ; void ds1820_start(void) {
00F2 .dbline 124
00F2 ;
00F2 ; ds1820_reset();
00F2 93DF xcall _ds1820_reset
00F4 .dbline 125
00F4 ; ds1820_write_byte(0xCC); /*勿略地址*/
00F4 0CEC ldi R16,204
00F6 DDDF xcall _ds1820_write_byte
00F8 .dbline 126
00F8 ; ds1820_write_byte(0x44); /*启动转换*/
00F8 04E4 ldi R16,68
00FA DBDF xcall _ds1820_write_byte
00FC .dbline -2
00FC L30:
00FC .dbline 0 ; func end
00FC 0895 ret
00FE .dbend
00FE .dbfunc e ds1820_read_temp _ds1820_read_temp fi
00FE ; buf -> y+0
00FE ; i -> R20,R21
.even
00FE _ds1820_read_temp::
00FE 0E940000 xcall push_gset1
0102 2997 sbiw R28,9
0104 .dbline -1
0104 .dbline 130
0104 ; }
0104 ;
0104 ; /*DS8B20读取温度信息*/
0104 ; unsigned int ds1820_read_temp(void) {
0104 .dbline 135
0104 ;
0104 ; unsigned int i;
0104 ; unsigned char buf[9];
0104 ;
0104 ; ds1820_reset();
0104 8ADF xcall _ds1820_reset
0106 .dbline 136
0106 ; ds1820_write_byte(0xCC); /*勿略地址*/
0106 0CEC ldi R16,204
0108 D4DF xcall _ds1820_write_byte
010A .dbline 137
010A ; ds1820_write_byte(0xBE); /*读取温度*/
010A 0EEB ldi R16,190
010C D2DF xcall _ds1820_write_byte
010E .dbline 138
010E ; for (i = 0; i < 9; i++)
010E 4427 clr R20
0110 5527 clr R21
0112 08C0 xjmp L35
0114 L32:
0114 .dbline 139
0114 .dbline 140
0114 A1DF xcall _ds1820_read_byte
0116 CE01 movw R24,R28
0118 FA01 movw R30,R20
011A E80F add R30,R24
011C F91F adc R31,R25
011E 0083 std z+0,R16
0120 .dbline 141
0120 L33:
0120 .dbline 138
0120 4F5F subi R20,255 ; offset = 1
0122 5F4F sbci R21,255
0124 L35:
0124 .dbline 138
0124 4930 cpi R20,9
0126 E0E0 ldi R30,0
0128 5E07 cpc R21,R30
012A A0F3 brlo L32
012C .dbline 142
012C ; {
012C ; buf[i] = ds1820_read_byte();
012C ; }
012C ; i = buf[1];
012C 4981 ldd R20,y+1
012E 5527 clr R21
0130 .dbline 143
0130 ; i <<= 8;
0130 542F mov R21,R20
0132 4427 clr R20
0134 .dbline 144
0134 ; i |= buf[0];
0134 2880 ldd R2,y+0
0136 3324 clr R3
0138 4229 or R20,R2
013A 5329 or R21,R3
013C .dbline 146
013C ;
013C ; return i;
013C 8A01 movw R16,R20
013E .dbline -2
013E L31:
013E 2996 adiw R28,9
0140 0E940000 xcall pop_gset1
0144 .dbline 0 ; func end
0144 0895 ret
0146 .dbsym l buf 0 A[9:9]c
0146 .dbsym r i 20 i
0146 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\+++资料+++\学习\avr\程序\18b20new\DS1820.C
0000 _flag::
0000 .blkb 1
0001 .dbsym e flag _flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -