📄 ds18b20.lis
字号:
.module ds18b20.c
.area text(rom, con, rel)
0000 .dbfile D:\NEW\ECHO\ds18b20.c
0000 .dbfunc e resetDS18B20 _resetDS18B20 fc
0000 ; errTime -> R20
.even
0000 _resetDS18B20::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 13
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #include "ds18b20.h"
0004 ; #include "delay.h"
0004 ;
0004 ;
0004 ; unsigned char temp_buf[4];
0004 ; /**********************************************************************
0004 ; functionName: unsigned char resetDS18B20(void)
0004 ; description :DS18B20初始化
0004 ; **********************************************************************/
0004 ; unsigned char resetDS18B20(void)
0004 ; {
0004 .dbline 14
0004 ; unsigned char errTime=0;
0004 4427 clr R20
0006 .dbline 15
0006 ; RLS_DS18B20; //释放总线
0006 A198 cbi 0x14,1
0008 .dbline 16
0008 ; _NOP();
0008 0000 nop
000A .dbline 17
000A ; HLD_DS18B20; //Maga16控制总线
000A A19A sbi 0x14,1
000C .dbline 18
000C ; CLR_DS18B20; //强制拉低
000C A998 cbi 0x15,1
000E .dbline 19
000E ; ds_delay(254); //209.42us
000E 0EEF ldi R16,254
0010 0E940000 xcall _ds_delay
0014 .dbline 20
0014 ; ds_delay(254);
0014 0EEF ldi R16,254
0016 0E940000 xcall _ds_delay
001A .dbline 21
001A ; ds_delay(254);
001A 0EEF ldi R16,254
001C 0E940000 xcall _ds_delay
0020 .dbline 23
0020 ; //以上延时大于480us
0020 ; RLS_DS18B20; //释放总线,总线自动上拉
0020 A198 cbi 0x14,1
0022 .dbline 24
0022 ; _NOP();
0022 0000 nop
0024 09C0 xjmp L3
0026 L2:
0026 .dbline 26
0026 ; while(STU_DS18B20)
0026 ; {
0026 .dbline 27
0026 ; ds_delay(10);//5-15us
0026 0AE0 ldi R16,10
0028 0E940000 xcall _ds_delay
002C .dbline 28
002C ; errTime++;
002C 4395 inc R20
002E .dbline 29
002E ; if(errTime>4)
002E 84E0 ldi R24,4
0030 8417 cp R24,R20
0032 10F4 brsh L5
0034 .dbline 30
0034 ; return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
0034 0027 clr R16
0036 10C0 xjmp L1
0038 L5:
0038 .dbline 31
0038 L3:
0038 .dbline 25
0038 9999 sbic 0x13,1
003A F5CF rjmp L2
003C .dbline 32
003C ; }
003C ; errTime=0;
003C 4427 clr R20
003E 09C0 xjmp L8
0040 L7:
0040 .dbline 34
0040 ; while(!(STU_DS18B20))
0040 ; {
0040 .dbline 35
0040 ; ds_delay(10);//5.15us
0040 0AE0 ldi R16,10
0042 0E940000 xcall _ds_delay
0046 .dbline 36
0046 ; errTime++;
0046 4395 inc R20
0048 .dbline 37
0048 ; if(errTime>20)
0048 84E1 ldi R24,20
004A 8417 cp R24,R20
004C 10F4 brsh L10
004E .dbline 38
004E ; return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
004E 0027 clr R16
0050 03C0 xjmp L1
0052 L10:
0052 .dbline 39
0052 L8:
0052 .dbline 33
0052 999B sbis 0x13,1
0054 F5CF rjmp L7
0056 .dbline 40
0056 ; }
0056 ; return(0xff);
0056 0FEF ldi R16,255
0058 .dbline -2
0058 L1:
0058 0E940000 xcall pop_gset1
005C .dbline 0 ; func end
005C 0895 ret
005E .dbsym r errTime 20 c
005E .dbend
005E .dbfunc e readByteDS18B20 _readByteDS18B20 fc
005E ; retVal -> R20
005E ; i -> R22
.even
005E _readByteDS18B20::
005E 0E940000 xcall push_gset2
0062 .dbline -1
0062 .dbline 48
0062 ; }
0062 ;
0062 ; /**********************************************************************
0062 ; functionName: unsigned char readByteDS18B20(void)
0062 ; description :读DS18B20一个字节
0062 ; **********************************************************************/
0062 ; unsigned char readByteDS18B20(void)
0062 ; {
0062 .dbline 50
0062 ; unsigned char i;
0062 ; unsigned char retVal=0;
0062 4427 clr R20
0064 .dbline 51
0064 ; RLS_DS18B20; //释放总线
0064 A198 cbi 0x14,1
0066 .dbline 52
0066 ; for(i=8;i>0;i--)
0066 68E0 ldi R22,8
0068 11C0 xjmp L16
006A L13:
006A .dbline 53
006A ; {
006A .dbline 54
006A ; retVal>>=1;
006A 4695 lsr R20
006C .dbline 55
006C ; HLD_DS18B20; //Maga16控制总线
006C A19A sbi 0x14,1
006E .dbline 56
006E ; CLR_DS18B20; //强制拉低
006E A998 cbi 0x15,1
0070 .dbline 57
0070 ; ds_delay(2); //延时大于1us
0070 02E0 ldi R16,2
0072 0E940000 xcall _ds_delay
0076 .dbline 58
0076 ; SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
0076 A99A sbi 0x15,1
0078 .dbline 60
0078 ; //delay_nus(8);
0078 ; RLS_DS18B20; //释放总线
0078 A198 cbi 0x14,1
007A .dbline 61
007A ; if(STU_DS18B20)
007A 999B sbis 0x13,1
007C 01C0 rjmp L17
007E .dbline 62
007E ; retVal|=0x80;
007E 4068 ori R20,128
0080 L17:
0080 .dbline 63
0080 02E3 ldi R16,50
0082 0E940000 xcall _ds_delay
0086 .dbline 64
0086 A19A sbi 0x14,1
0088 .dbline 65
0088 A99A sbi 0x15,1
008A .dbline 67
008A L14:
008A .dbline 52
008A 6A95 dec R22
008C L16:
008C .dbline 52
008C 2224 clr R2
008E 2616 cp R2,R22
0090 60F3 brlo L13
0092 .dbline 68
0092 ; ds_delay(50); //31us
0092 ; HLD_DS18B20; //释放总线
0092 ; SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
0092 ; //delay_nus(30); //30.38us
0092 ; }
0092 ; ds_delay(5); //2.71us(大于1us就行了)
0092 05E0 ldi R16,5
0094 0E940000 xcall _ds_delay
0098 .dbline 69
0098 ; return(retVal);
0098 042F mov R16,R20
009A .dbline -2
009A L12:
009A 0E940000 xcall pop_gset2
009E .dbline 0 ; func end
009E 0895 ret
00A0 .dbsym r retVal 20 c
00A0 .dbsym r i 22 c
00A0 .dbend
00A0 .dbfunc e writeByteDS18B20 _writeByteDS18B20 fV
00A0 ; temp -> R20
00A0 ; i -> R22
00A0 ; wb -> R10
.even
00A0 _writeByteDS18B20::
00A0 0E940000 xcall push_gset3
00A4 A02E mov R10,R16
00A6 .dbline -1
00A6 .dbline 77
00A6 ; }
00A6 ;
00A6 ; /**********************************************************************
00A6 ; functionName: unsigned char readByteDS18B20(void)
00A6 ; description :写DS18B20一个字节
00A6 ; **********************************************************************/
00A6 ; void writeByteDS18B20(unsigned char wb)
00A6 ; {
00A6 .dbline 80
00A6 ; unsigned char i;
00A6 ; unsigned char temp;
00A6 ; RLS_DS18B20; //释放总线
00A6 A198 cbi 0x14,1
00A8 .dbline 81
00A8 ; for(i=0;i<8;i++)
00A8 6627 clr R22
00AA 17C0 xjmp L23
00AC L20:
00AC .dbline 82
00AC ; {
00AC .dbline 83
00AC ; HLD_DS18B20; //Maga16控制总线
00AC A19A sbi 0x14,1
00AE .dbline 84
00AE ; CLR_DS18B20; //强制拉低
00AE A998 cbi 0x15,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -