-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDS18B20.lis
More file actions
606 lines (606 loc) · 23.1 KB
/
DS18B20.lis
File metadata and controls
606 lines (606 loc) · 23.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
.module DS18B20.C
.area text(rom, con, rel)
0000 .dbfile DS18B20.C
0000 .dbfile E:\git\AVR\OldManAlarm\DS18B20.C
0000 .dbfunc e DS18B20_Reset _DS18B20_Reset fc
0000 ; i -> R20
.even
0000 _DS18B20_Reset::
0000 4A93 st -y,R20
0002 .dbline -1
0002 .dbline 15
0002 ; #include <iom128v.h>
0002 ; #include "DS18B20.h"
0002 ; #include "basic.h"
0002 ;
0002 ;
0002 ; uint temp_value;
0002 ; uint temp,A1,A2,A3;
0002 ;
0002 ; //*************************************************************************
0002 ; // DS18B20初始化
0002 ; //*************************************************************************
0002 ;
0002 ; unsigned char DS18B20_Reset(void) //初始化和复位
0002 ;
0002 ; {
0002 .dbline 17
0002 ; unsigned char i;
0002 ; DQ_OUT;
0002 149A sbi 0x2,4
0004 .dbline 18
0004 ; DQ_CLR;
0004 1C98 cbi 0x3,4
0006 .dbline 19
0006 ; delay_n100us(5); //延时500uS(480-960)
0006 05E0 ldi R16,5
0008 10E0 ldi R17,0
000A 0E940000 xcall _delay_n100us
000E .dbline 20
000E ; DQ_SET;
000E 1C9A sbi 0x3,4
0010 .dbline 21
0010 ; DQ_IN;
0010 1498 cbi 0x2,4
0012 .dbline 22
0012 ; delay_n100us(1); //延时100uS
0012 01E0 ldi R16,1
0014 10E0 ldi R17,0
0016 0E940000 xcall _delay_n100us
001A .dbline 23
001A ; i = DQ_R;
001A 41B1 in R20,0x1
001C 4071 andi R20,16
001E .dbline 24
001E ; delay_n100us(5); //延时500uS(保持>480uS)
001E 05E0 ldi R16,5
0020 10E0 ldi R17,0
0022 0E940000 xcall _delay_n100us
0026 .dbline 26
0026 ;
0026 ; if (i)
0026 4423 tst R20
0028 11F0 breq L2
002A X0:
002A .dbline 27
002A ; {
002A .dbline 28
002A ; return 0x00;
002A 0027 clr R16
002C 01C0 xjmp L1
002E L2:
002E .dbline 32
002E ;
002E ; }
002E ; else
002E ; {
002E .dbline 33
002E ; return 0x01;
002E 01E0 ldi R16,1
0030 .dbline -2
0030 L1:
0030 .dbline 0 ; func end
0030 4991 ld R20,y+
0032 0895 ret
0034 .dbsym r i 20 c
0034 .dbend
0034 .dbfunc e DS18B20_Read_byte _DS18B20_Read_byte fc
0034 ; value -> R20
0034 ; i -> R22
.even
0034 _DS18B20_Read_byte::
0034 4A93 st -y,R20
0036 6A93 st -y,R22
0038 .dbline -1
0038 .dbline 45
0038 ;
0038 ; }
0038 ;
0038 ; }
0038 ;
0038 ;
0038 ; //*************************************************************************
0038 ; // DS18B20读一个字节函数
0038 ; //*************************************************************************
0038 ;
0038 ; unsigned char DS18B20_Read_byte(void)
0038 ; {
0038 .dbline 48
0038 ;
0038 ; unsigned char i;
0038 ; unsigned char value = 0;
0038 4427 clr R20
003A .dbline 49
003A ; for (i = 8; i != 0; i--)
003A 68E0 ldi R22,8
003C 0FC0 xjmp L8
003E L5:
003E .dbline 50
003E ; {
003E .dbline 51
003E ; value >>= 1;
003E 4695 lsr R20
0040 .dbline 52
0040 ; DQ_OUT;
0040 149A sbi 0x2,4
0042 .dbline 53
0042 ; DQ_CLR;
0042 1C98 cbi 0x3,4
0044 .dbline 54
0044 ; delay_10us(); //*延时10uS
0044 0E940000 xcall _delay_10us
0048 .dbline 56
0048 ;
0048 ; DQ_SET;
0048 1C9A sbi 0x3,4
004A .dbline 57
004A ; DQ_IN;
004A 1498 cbi 0x2,4
004C .dbline 58
004C ; delay_10us(); //*延时10uS
004C 0E940000 xcall _delay_10us
0050 .dbline 60
0050 ;
0050 ; if (DQ_R)
0050 0C9B sbis 0x1,4
0052 01C0 rjmp L9
0054 X1:
0054 .dbline 61
0054 ; {
0054 .dbline 62
0054 ; value|=0x80;
0054 4068 ori R20,128
0056 .dbline 64
0056 ;
0056 ; }
0056 L9:
0056 .dbline 65
0056 ; delay_50us(); //*延时50uS
0056 0E940000 xcall _delay_50us
005A .dbline 67
005A ;
005A ; }
005A L6:
005A .dbline 49
005A 6A95 dec R22
005C L8:
005C .dbline 49
005C 6623 tst R22
005E 79F7 brne L5
0060 X2:
0060 .dbline 69
0060 ;
0060 ; return(value);
0060 042F mov R16,R20
0062 .dbline -2
0062 L4:
0062 .dbline 0 ; func end
0062 6991 ld R22,y+
0064 4991 ld R20,y+
0066 0895 ret
0068 .dbsym r value 20 c
0068 .dbsym r i 22 c
0068 .dbend
0068 .dbfunc e ds1820_write_byte _ds1820_write_byte fV
0068 ; i -> R20
0068 ; value -> R10
.even
0068 _ds1820_write_byte::
0068 AA92 st -y,R10
006A 4A93 st -y,R20
006C A02E mov R10,R16
006E .dbline -1
006E .dbline 77
006E ; }
006E ;
006E ; //*************************************************************************
006E ; // 向18B20写一个字节函数
006E ; //*************************************************************************
006E ;
006E ; void ds1820_write_byte(unsigned char value)
006E ; {
006E .dbline 80
006E ;
006E ; unsigned char i;
006E ; for (i = 8; i != 0; i--)
006E 48E0 ldi R20,8
0070 0EC0 xjmp L15
0072 L12:
0072 .dbline 81
0072 ; {
0072 .dbline 82
0072 ; DQ_OUT;
0072 149A sbi 0x2,4
0074 .dbline 83
0074 ; DQ_CLR;
0074 1C98 cbi 0x3,4
0076 .dbline 84
0076 ; delay_10us(); //延时10uS
0076 0E940000 xcall _delay_10us
007A .dbline 85
007A ; if (value & 0x01)
007A A0FE sbrs R10,0
007C 01C0 rjmp L16
007E X3:
007E .dbline 86
007E ; {
007E .dbline 87
007E ; DQ_SET;
007E 1C9A sbi 0x3,4
0080 .dbline 89
0080 ;
0080 ; }
0080 L16:
0080 .dbline 90
0080 ; delay_n100us(1); //延时100uS
0080 01E0 ldi R16,1
0082 10E0 ldi R17,0
0084 0E940000 xcall _delay_n100us
0088 .dbline 91
0088 ; DQ_SET; //位结束
0088 1C9A sbi 0x3,4
008A .dbline 92
008A ; value >>= 1;
008A A694 lsr R10
008C .dbline 94
008C ;
008C ; }
008C L13:
008C .dbline 80
008C 4A95 dec R20
008E L15:
008E .dbline 80
008E 4423 tst R20
0090 81F7 brne L12
0092 X4:
0092 .dbline -2
0092 L11:
0092 .dbline 0 ; func end
0092 4991 ld R20,y+
0094 A990 ld R10,y+
0096 0895 ret
0098 .dbsym r i 20 c
0098 .dbsym r value 10 c
0098 .dbend
0098 .dbfunc e ds1820_start _ds1820_start fV
.even
0098 _ds1820_start::
0098 .dbline -1
0098 .dbline 102
0098 ;
0098 ; }
0098 ; //*************************************************************************
0098 ; // 发送温度转换命令
0098 ; //*************************************************************************
0098 ;
0098 ; /*启动ds1820转换*/
0098 ; void ds1820_start(void) {
0098 .dbline 104
0098 ;
0098 ; DS18B20_Reset();
0098 B3DF xcall _DS18B20_Reset
009A .dbline 105
009A ; ds1820_write_byte(0xCC);
009A 0CEC ldi R16,204
009C E5DF xcall _ds1820_write_byte
009E .dbline 106
009E ; ds1820_write_byte(0x44); //启动转换
009E 04E4 ldi R16,68
00A0 .dbline -2
00A0 L18:
00A0 .dbline 0 ; func end
00A0 E3CF xjmp _ds1820_write_byte
00A2 .dbend
00A2 .dbfunc e DS18B20_Read_temp _DS18B20_Read_temp fi
00A2 ; buf -> y+0
00A2 ; i -> R20,R21
.even
00A2 _DS18B20_Read_temp::
00A2 4A93 st -y,R20
00A4 5A93 st -y,R21
00A6 2997 sbiw R28,9
00A8 .dbline -1
00A8 .dbline 114
00A8 ; }
00A8 ;
00A8 ; //*************************************************************************
00A8 ; // DS8B20读取温度信息
00A8 ; //*************************************************************************
00A8 ;
00A8 ; unsigned int DS18B20_Read_temp(void)
00A8 ; {
00A8 .dbline 119
00A8 ;
00A8 ; unsigned int i;
00A8 ; unsigned char buf[9];
00A8 ;
00A8 ; DS18B20_Reset();
00A8 ABDF xcall _DS18B20_Reset
00AA .dbline 120
00AA ; ds1820_write_byte(0xCC);
00AA 0CEC ldi R16,204
00AC DDDF xcall _ds1820_write_byte
00AE .dbline 121
00AE ; ds1820_write_byte(0xBE); //读取温度
00AE 0EEB ldi R16,190
00B0 DBDF xcall _ds1820_write_byte
00B2 .dbline 122
00B2 ; for (i = 0; i < 9; i++)
00B2 4427 clr R20
00B4 5527 clr R21
00B6 08C0 xjmp L23
00B8 L20:
00B8 .dbline 123
00B8 ; {
00B8 .dbline 124
00B8 ; buf[i] = DS18B20_Read_byte();
00B8 BDDF xcall _DS18B20_Read_byte
00BA CE01 movw R24,R28
00BC FA01 movw R30,R20
00BE E80F add R30,R24
00C0 F91F adc R31,R25
00C2 0083 std z+0,R16
00C4 .dbline 125
00C4 ; }
00C4 L21:
00C4 .dbline 122
00C4 4F5F subi R20,255 ; offset = 1
00C6 5F4F sbci R21,255
00C8 L23:
00C8 .dbline 122
00C8 4930 cpi R20,9
00CA E0E0 ldi R30,0
00CC 5E07 cpc R21,R30
00CE A0F3 brlo L20
00D0 X5:
00D0 .dbline 126
00D0 ; i = buf[1];
00D0 4981 ldd R20,y+1
00D2 5527 clr R21
00D4 .dbline 127
00D4 ; i <<= 8;
00D4 542F mov R21,R20
00D6 4427 clr R20
00D8 .dbline 128
00D8 ; i |= buf[0];
00D8 2880 ldd R2,y+0
00DA 3324 clr R3
00DC 4229 or R20,R2
00DE 5329 or R21,R3
00E0 .dbline 129
00E0 ; temp_value=i;
00E0 50930900 sts _temp_value+1,R21
00E4 40930800 sts _temp_value,R20
00E8 .dbline 130
00E8 ; temp_value=temp_value*0.625; //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
00E8 00E0 ldi R16,<L25
00EA 10E0 ldi R17,>L25
00EC 0E940000 xcall elpm32
00F0 1801 movw R2,R16
00F2 2901 movw R4,R18
00F4 00910800 lds R16,_temp_value
00F8 10910900 lds R17,_temp_value+1
00FC 0E940000 xcall uint2fp
0100 3A93 st -y,R19
0102 2A93 st -y,R18
0104 1A93 st -y,R17
0106 0A93 st -y,R16
0108 8101 movw R16,R2
010A 9201 movw R18,R4
010C 0E940000 xcall fpmule2
0110 0E940000 xcall fpint
0114 10930900 sts _temp_value+1,R17
0118 00930800 sts _temp_value,R16
011C .dbline 133
011C ; //比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
011C ; //然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
011C ; return i;
011C 8A01 movw R16,R20
011E .dbline -2
011E L19:
011E .dbline 0 ; func end
011E 2996 adiw R28,9
0120 5991 ld R21,y+
0122 4991 ld R20,y+
0124 0895 ret
0126 .dbsym l buf 0 A[9:9]c
0126 .dbsym r i 20 i
0126 .dbend
0126 .dbfunc e data_do _data_do fV
0126 ; A2t -> R10,R11
0126 ; temp_d -> R10,R11
.even
0126 _data_do::
0126 AA92 st -y,R10
0128 BA92 st -y,R11
012A 5801 movw R10,R16
012C .dbline -1
012C .dbline 142
012C ; }
012C ;
012C ;
012C ;
012C ; //*************************************************************************
012C ; // 温度数据处理函数
012C ; //*************************************************************************
012C ; void data_do(uint temp_d)
012C ; {
012C .dbline 144
012C ; uint A2t;
012C ; A1=temp_d/100; //分出百,十,和个位
012C 24E6 ldi R18,100
012E 30E0 ldi R19,0
0130 8501 movw R16,R10
0132 0E940000 xcall div16u
0136 10930500 sts _A1+1,R17
013A 00930400 sts _A1,R16
013E .dbline 145
013E ; A2t=temp_d%100;
013E 24E6 ldi R18,100
0140 30E0 ldi R19,0
0142 8501 movw R16,R10
0144 0E940000 xcall mod16u
0148 5801 movw R10,R16
014A .dbline 146
014A ; A2=A2t/10;
014A 2AE0 ldi R18,10
014C 30E0 ldi R19,0
014E 0E940000 xcall div16u
0152 10930300 sts _A2+1,R17
0156 00930200 sts _A2,R16
015A .dbline 147
015A ; A3=A2t%10;
015A 2AE0 ldi R18,10
015C 30E0 ldi R19,0
015E 8501 movw R16,R10
0160 0E940000 xcall mod16u
0164 10930100 sts _A3+1,R17
0168 00930000 sts _A3,R16
016C .dbline -2
016C L26:
016C .dbline 0 ; func end
016C B990 ld R11,y+
016E A990 ld R10,y+
0170 0895 ret
0172 .dbsym r A2t 10 i
0172 .dbsym r temp_d 10 i
0172 .dbend
0172 .dbfunc e LCD_write_temperature _LCD_write_temperature fV
0172 ; temp -> y+0
.even
0172 _LCD_write_temperature::
0172 2197 sbiw R28,1
0174 .dbline -1
0174 .dbline 154
0174 ; }
0174 ;
0174 ; //*************************************************************************
0174 ; // LCD显示温度函数
0174 ; //*************************************************************************
0174 ; void LCD_write_temperature(void)
0174 ; {
0174 .dbline 156
0174 ; volatile unsigned char temp;
0174 ; ds1820_start(); //启动一次转换
0174 91DF xcall _ds1820_start
0176 .dbline 157
0176 ; DS18B20_Read_temp(); //读取温度数值
0176 95DF xcall _DS18B20_Read_temp
0178 .dbline 158
0178 ; data_do(temp_value); //处理数据,得到要显示的值
0178 00910800 lds R16,_temp_value
017C 10910900 lds R17,_temp_value+1
0180 D2DF xcall _data_do
0182 .dbline 160
0182 ;
0182 ; LCD_write_com(0x95);
0182 05E9 ldi R16,149
0184 10E0 ldi R17,0
0186 0E940000 xcall _LCD_write_com
018A .dbline 161
018A ; delay_nms(2);
018A 02E0 ldi R16,2
018C 10E0 ldi R17,0
018E 0E940000 xcall _delay_nms
0192 .dbline 162
0192 ; temp = A1 + '0'; //在LCD上写温度十位
0192 80910400 lds R24,_A1
0196 90910500 lds R25,_A1+1
019A C096 adiw R24,48
019C 8883 std y+0,R24
019E .dbline 163
019E ; LCD_write_data(temp);
019E 082F mov R16,R24
01A0 1127 clr R17
01A2 0E940000 xcall _LCD_write_data
01A6 .dbline 164
01A6 ; delay_nms(2);
01A6 02E0 ldi R16,2
01A8 10E0 ldi R17,0
01AA 0E940000 xcall _delay_nms
01AE .dbline 165
01AE ; temp = A2 + '0'; //在LCD上写温度个位
01AE 80910200 lds R24,_A2
01B2 90910300 lds R25,_A2+1
01B6 C096 adiw R24,48
01B8 8883 std y+0,R24
01BA .dbline 166
01BA ; LCD_write_data(temp);
01BA 082F mov R16,R24
01BC 1127 clr R17
01BE 0E940000 xcall _LCD_write_data
01C2 .dbline 167
01C2 ; delay_nms(2);
01C2 02E0 ldi R16,2
01C4 10E0 ldi R17,0
01C6 0E940000 xcall _delay_nms
01CA .dbline 168
01CA ; LCD_write_data(0x2e); //在LCD上写.号
01CA 0EE2 ldi R16,46
01CC 10E0 ldi R17,0
01CE 0E940000 xcall _LCD_write_data
01D2 .dbline 169
01D2 ; delay_nms(2);
01D2 02E0 ldi R16,2
01D4 10E0 ldi R17,0
01D6 0E940000 xcall _delay_nms
01DA .dbline 170
01DA ; temp = A3 + '0'; //在LCD上写温度小数位
01DA 80910000 lds R24,_A3
01DE 90910100 lds R25,_A3+1
01E2 C096 adiw R24,48
01E4 8883 std y+0,R24
01E6 .dbline 171
01E6 ; LCD_write_data(temp);
01E6 082F mov R16,R24
01E8 1127 clr R17
01EA 0E940000 xcall _LCD_write_data
01EE .dbline 172
01EE ; delay_nms(2);
01EE 02E0 ldi R16,2
01F0 10E0 ldi R17,0
01F2 0E940000 xcall _delay_nms
01F6 .dbline 173
01F6 ; DisplayCgrom(0x97,"℃"); //在LCD上写温度单位
01F6 20E0 ldi R18,<L28
01F8 30E0 ldi R19,>L28
01FA 07E9 ldi R16,151
01FC 10E0 ldi R17,0
01FE 0E940000 xcall _DisplayCgrom
0202 .dbline -2
0202 L27:
0202 .dbline 0 ; func end
0202 2196 adiw R28,1
0204 0895 ret
0206 .dbsym l temp 0 c
0206 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\git\AVR\OldManAlarm\DS18B20.C
0000 _A3::
0000 .blkb 2
0002 .dbsym e A3 _A3 i
0002 _A2::
0002 .blkb 2
0004 .dbsym e A2 _A2 i
0004 _A1::
0004 .blkb 2
0006 .dbsym e A1 _A1 i
0006 _temp::
0006 .blkb 2
0008 .dbsym e temp _temp i
0008 _temp_value::
0008 .blkb 2
000A .dbsym e temp_value _temp_value i
.area data(ram, con, rel)
0000 .dbfile E:\git\AVR\OldManAlarm\DS18B20.C
0000 L28:
0000 .blkb 3
.area idata
0000 A1E600 .byte 161,230,0
.area data(ram, con, rel)
0003 .dbfile E:\git\AVR\OldManAlarm\DS18B20.C
.area lit(rom, con, rel)
0000 L25:
0000 0000203F .word 0x0,0x3f20
0004 ;
0004 ; }