📄 ds18b20.lst
字号:
14D E081 LDI R24,1
14E 9380 006E STS 0x006E,R24
(0145) TCNT0=0xce; // (1024/16,000,000)*50=3.2ms
150 EC8E LDI R24,0xCE
151 BD86 OUT 0x26,R24
(0146) TCCR0B=0x05; // clk/1024
152 E085 LDI R24,5
153 BD85 OUT 0x25,R24
(0147) /*T/C1*/
(0148) TCCR1A=0x00;
154 9220 0080 STS 0x0080,R2
(0149) TIMSK1=0x01;
156 E081 LDI R24,1
157 9380 006F STS 0x006F,R24
(0150) TCNT1=0xfd8f; //10ms
159 E88F LDI R24,0x8F
15A EF9D LDI R25,0xFD
15B 9390 0085 STS 0x0085,R25
15D 9380 0084 STS 0x0084,R24
(0151) TCCR1B=0x04; // clk/256
15F E084 LDI R24,4
160 9380 0081 STS 0x0081,R24
(0152) /*通信口初始化*/
(0153) UartInit();
162 C0CF RJMP _UartInit
(0154) }
(0155) /*数据转换函数*/
(0156) void convert(void)
(0157) {timeb1=time1/100;
_convert:
163 E614 LDI R17,0x64
164 9100 011A LDS R16,time1
166 D0ED RCALL div8u
167 9300 0118 STS timeb1,R16
(0158) timeb2=time1%100/10;
169 E614 LDI R17,0x64
16A 9100 011A LDS R16,time1
16C D0E5 RCALL mod8u
16D E01A LDI R17,0xA
16E D0E5 RCALL div8u
16F 9300 0117 STS timeb2,R16
(0159) timeb3=time1%10;
171 E01A LDI R17,0xA
172 9100 011A LDS R16,time1
174 D0DD RCALL mod8u
175 9300 0116 STS timeb3,R16
(0160) timeb4=time2/100;
177 E614 LDI R17,0x64
178 9100 0119 LDS R16,time2
17A D0D9 RCALL div8u
17B 9300 0115 STS timeb4,R16
(0161) timeb5=time2%100/10;
17D E614 LDI R17,0x64
17E 9100 0119 LDS R16,time2
180 D0D1 RCALL mod8u
181 E01A LDI R17,0xA
182 D0D1 RCALL div8u
183 9300 0114 STS timeb5,R16
(0162) timeb6=time2%10;
185 E01A LDI R17,0xA
186 9100 0119 LDS R16,time2
188 D0C9 RCALL mod8u
189 9300 0113 STS timeb6,R16
18B 9508 RET
(0163) }
(0164) /*****************单总线时序**************/
(0165) /*初始化*/
(0166) void Init_1wire(void)
(0167) {flag = SREG; /*中断保护*/
_Init_1wire:
18C B62F IN R2,0x3F
18D 9220 011B STS flag,R2
(0168) CLI();
18F 94F8 BCLR 7
(0169) /*关中断*/
(0170) DRC(1); //Out
190 9A38 SBI 0x07,0
(0171) DQ(1);
191 9A40 SBI 0x08,0
(0172) NOP(); //DQ拉低480-960US,接着将数据线拉高15-60US
192 0000 NOP
(0173) DQ(0);
193 B188 IN R24,0x08
194 7F8E ANDI R24,0xFE
195 B988 OUT 0x08,R24
(0174) delay_10us(56);
196 E308 LDI R16,0x38
197 D05B RCALL _delay_10us
(0175) DQ(1);
198 9A40 SBI 0x08,0
(0176) DRC(0); //In 释放总线 此时上拉电阻使能
199 B187 IN R24,0x07
19A 7F8E ANDI R24,0xFE
19B B987 OUT 0x07,R24
(0177) delay_10us(7);
19C E007 LDI R16,7
19D D055 RCALL _delay_10us
(0178) while(PINC & 0x01);
19E 9930 SBIC 0x06,0
19F CFFE RJMP 0x019E
(0179) delay_10us(50); //presence pulse 60-240us 480us min
1A0 E302 LDI R16,0x32
1A1 D051 RCALL _delay_10us
(0180)
(0181) if (flag & 0x80)
1A2 9020 011B LDS R2,flag
1A4 FE27 SBRS R2,7
1A5 C001 RJMP 0x01A7
(0182) {SEI(); /*恢复中断状态*/
1A6 9478 BSET 7
(0183) }
1A7 9508 RET
_WriteByte_1wire:
temp --> R10
i --> R20
data --> R12
1A8 D0C1 RCALL push_xgset303C
1A9 2EC0 MOV R12,R16
(0184) }
(0185) /*写字节*/
(0186) void WriteByte_1wire(uchar data)
(0187) {uchar i,temp;
(0188) temp=data;
1AA 2CAC MOV R10,R12
(0189)
(0190) flag = SREG; /*中断保护*/
1AB B62F IN R2,0x3F
1AC 9220 011B STS flag,R2
(0191) CLI();
1AE 94F8 BCLR 7
(0192)
(0193) DRC(1);
1AF 9A38 SBI 0x07,0
(0194) for(i=0;i<8;i++)
1B0 2744 CLR R20
1B1 C00E RJMP 0x01C0
(0195) {DQ(1);
1B2 9A40 SBI 0x08,0
(0196) NOP();
1B3 0000 NOP
(0197) DQ(0); //写时间隙开始
1B4 B188 IN R24,0x08
1B5 7F8E ANDI R24,0xFE
1B6 B988 OUT 0x08,R24
(0198) delay_10us(1);
1B7 E001 LDI R16,1
1B8 D03A RCALL _delay_10us
(0199) if(temp&0x01)DQ(1);
1B9 FEA0 SBRS R10,0
1BA C001 RJMP 0x01BC
1BB 9A40 SBI 0x08,0
(0200) //else DQ(0);
(0201) temp>>=1; //LSB First
1BC 94A6 LSR R10
(0202) delay_10us(7);
1BD E007 LDI R16,7
1BE D034 RCALL _delay_10us
1BF 9543 INC R20
1C0 3048 CPI R20,0x8
1C1 F380 BCS 0x01B2
(0203) }
(0204) DQ(1);
1C2 9A40 SBI 0x08,0
(0205)
(0206) if (flag & 0x80)
1C3 9020 011B LDS R2,flag
1C5 FE27 SBRS R2,7
1C6 C001 RJMP 0x01C8
(0207) {SEI(); /*恢复中断状态*/
1C7 9478 BSET 7
(0208) }
1C8 C0A8 RJMP pop_xgset303C
_ReadByte_1wire:
data --> R20
i --> R22
1C9 934A ST R20,-Y
1CA 936A ST R22,-Y
(0209) }
(0210) /*读字节*/
(0211) uchar ReadByte_1wire(void)
(0212) {uchar i,data=0;
1CB 2744 CLR R20
(0213)
(0214) flag = SREG; /*中断保护*/
1CC B62F IN R2,0x3F
1CD 9220 011B STS flag,R2
(0215) CLI();
1CF 94F8 BCLR 7
(0216)
(0217) for(i=0;i<8;i++)
1D0 2766 CLR R22
1D1 C014 RJMP 0x01E6
(0218) {data>>=1; //处理方法:先右移 后将最高位与 0x80相或 !!!
1D2 9546 LSR R20
(0219) DRC(1);
1D3 9A38 SBI 0x07,0
(0220) DQ(1);
1D4 9A40 SBI 0x08,0
(0221) NOP();
1D5 0000 NOP
(0222) DQ(0);
1D6 B188 IN R24,0x08
1D7 7F8E ANDI R24,0xFE
1D8 B988 OUT 0x08,R24
(0223) delay_1us(); //delay 3us
1D9 D028 RCALL _delay_1us
(0224) delay_1us();
1DA D027 RCALL _delay_1us
(0225) //DQ(1);
(0226) DRC(0);
1DB B187 IN R24,0x07
1DC 7F8E ANDI R24,0xFE
1DD B987 OUT 0x07,R24
(0227) delay_10us(1);
1DE E001 LDI R16,1
1DF D013 RCALL _delay_10us
(0228) if(PINC&0x01)data|=0x80;
1E0 9B30 SBIS 0x06,0
1E1 C001 RJMP 0x01E3
1E2 6840 ORI R20,0x80
(0229) delay_10us(6);
1E3 E006 LDI R16,6
1E4 D00E RCALL _delay_10us
1E5 9563 INC R22
1E6 3068 CPI R22,0x8
1E7 F350 BCS 0x01D2
(0230)
(0231) }
(0232) DRC(1);
1E8 9A38 SBI 0x07,0
(0233) DQ(1);
1E9 9A40 SBI 0x08,0
(0234)
(0235) if (flag & 0x80)
1EA 9020 011B LDS R2,flag
1EC FE27 SBRS R2,7
1ED C001 RJMP 0x01EF
(0236) {SEI(); /*恢复中断状态*/
1EE 9478 BSET 7
(0237) }
(0238) return(data);
1EF 2F04 MOV R16,R20
1F0 9169 LD R22,Y+
1F1 9149 LD R20,Y+
1F2 9508 RET
_delay_10us:
i --> R10
j --> R20
n --> R16
1F3 92AA ST R10,-Y
1F4 934A ST R20,-Y
(0239) }
(0240) /********************************************************/
(0241)
(0242) /* n*10us
(0243) 通过AVR Studio仿真*/
(0244) void delay_10us(uchar n)
(0245) {uchar i,j;
(0246) for(i=0;i<n;i++)
1F5 24AA CLR R10
1F6 C006 RJMP 0x01FD
(0247) for(j=0;j<38;j++);
1F7 2744 CLR R20
1F8 C001 RJMP 0x01FA
1F9 9543 INC R20
1FA 3246 CPI R20,0x26
1FB F3E8 BCS 0x01F9
1FC 94A3 INC R10
1FD 16A0 CP R10,R16
1FE F3C0 BCS 0x01F7
1FF 9149 LD R20,Y+
200 90A9 LD R10,Y+
201 9508 RET
(0248) }
(0249) /* 1.75us */
(0250) void delay_1us(void)
(0251) {uchar i;
(0252) for(i=0;i<4;i++);
_delay_1us:
i --> R16
202 2700 CLR R16
203 C001 RJMP 0x0205
204 9503 INC R16
205 3004 CPI R16,4
206 F3E8 BCS 0x0204
207 9508 RET
_UartRece_int:
208 922A ST R2,-Y
209 923A ST R3,-Y
20A 938A ST R24,-Y
20B 939A ST R25,-Y
20C 93EA ST R30,-Y
20D 93FA ST R31,-Y
20E B62F IN R2,0x3F
20F 922A ST R2,-Y
(0253) }
(0254) /********************************通信部分*************************/
(0255) void UartRece_int(void)
(0256) {if(count3<2)Rece[count3++]=UDR0;
210 9180 010C LDS R24,count3
212 3082 CPI R24,2
213 F478 BCC 0x0223
214 2E28 MOV R2,R24
215 2433 CLR R3
216 5F8F SUBI R24,0xFF
217 9380 010C STS count3,R24
219 E181 LDI R24,0x11
21A E091 LDI R25,1
21B 2DE2 MOV R30,R2
21C 27FF CLR R31
21D 0FE8 ADD R30,R24
21E 1FF9 ADC R31,R25
21F 9020 00C6 LDS R2,0x00C6
221 8220 STD Z+0,R2
222 C006 RJMP 0x0229
(0257) else
(0258) {count3=0;
223 2422 CLR R2
224 9220 010C STS count3,R2
(0259) flag1=1;
226 E081 LDI R24,1
227 9380 010D STS flag1,R24
(0260) }
229 9029 LD R2,Y+
22A BE2F OUT 0x3F,R2
22B 91F9 LD R31,Y+
22C 91E9 LD R30,Y+
22D 9199 LD R25,Y+
22E 9189 LD R24,Y+
22F 9039 LD R3,Y+
230 9029 LD R2,Y+
231 9518 RETI
(0261) }
(0262) /**************串口初始化函数*****************/
(0263) void UartInit(void)
(0264) {
(0265) /* 设置波特率*/
(0266) UBRR0H = 0x00; /*9600 U2X0=0 103*/
_UartInit:
232 2422 CLR R2
233 9220 00C5 STS 0x00C5,R2
(0267) UBRR0L = 0x67;
235 E687 LDI R24,0x67
236 9380 00C4 STS 0x00C4,R24
(0268) /* 接收中断使能 接收器与发送器使能*/
(0269) UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
238 E988 LDI R24,0x98
239 9380 00C1 STS 0x00C1,R24
(0270) /* 设置帧格式: 8 个数据位, 1 个停止位 */
(0271) UCSR0C = (3<<UCSZ00);
23B E086 LDI R24,6
23C 9380 00C2 STS 0x00C2,R24
23E 9508 RET
_UartSend:
i --> R10
length --> R18
a --> R16
23F 92AA ST R10,-Y
(0272) }
(0273) /****************串行发送函数****************/
(0274) void UartSend(uchar a[],uchar length)
(0275) {uchar i;
(0276) for(i=0;i<length;i++)
240 24AA CLR R10
241 C00C RJMP 0x024E
(0277) {/* 等待发送缓冲器为空*/
(0278) while ( !( UCSR0A & (1<<UDRE0)) );
242 9020 00C0 LDS R2,0x00C0
244 FE25 SBRS R2,5
245 CFFC RJMP 0x0242
(0279) /* 将数据放入缓冲器,发送数据*/
(0280) UDR0=a[i];
FILE: <library>
246 2DEA MOV R30,R10
247 27FF CLR R31
248 0FE0 ADD R30,R16
249 1FF1 ADC R31,R17
24A 8020 LDD R2,Z+0
24B 9220 00C6 STS 0x00C6,R2
24D 94A3 INC R10
24E 16A2 CP R10,R18
24F F390 BCS 0x0242
250 90A9 LD R10,Y+
251 9508 RET
mod8u:
252 9468 BSET 6
253 C001 RJMP xdiv8u
div8u:
254 94E8 BCLR 6
xdiv8u:
255 932A ST R18,-Y
256 92FA ST R15,-Y
257 92EA ST R14,-Y
258 24FF CLR R15
259 24EE CLR R14
25A E120 LDI R18,0x10
25B 0F00 LSL R16
25C 1CFF ROL R15
25D 1CEE ROL R14
25E 16E1 CP R14,R17
25F F010 BCS 0x0262
260 1AE1 SUB R14,R17
261 9503 INC R16
262 952A DEC R18
263 F7B9 BNE 0x025B
264 F40E BRTC 0x0266
265 2D0E MOV R16,R14
266 90E9 LD R14,Y+
267 90F9 LD R15,Y+
268 9129 LD R18,Y+
269 9508 RET
push_xgset303C:
26A 935A ST R21,-Y
26B 934A ST R20,-Y
26C 92DA ST R13,-Y
26D 92CA ST R12,-Y
26E 92BA ST R11,-Y
26F 92AA ST R10,-Y
270 9508 RET
pop_xgset303C:
271 90A9 LD R10,Y+
272 90B9 LD R11,Y+
273 90C9 LD R12,Y+
274 90D9 LD R13,Y+
275 9149 LD R20,Y+
276 9159 LD R21,Y+
277 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -