📄 18b20.lis
字号:
.module _18b20.c
.area text(rom, con, rel)
0000 .dbfile D:\时钟芯片\1302\1302-162\18b20.c
0000 .dbfunc e delayb _delayb fV
0000 ; x -> R16,R17
.even
0000 _delayb::
0000 .dbline -1
0000 .dbline 6
0000 ; #include <io8515v.h>
0000 ; #include <macros.h>
0000 ; #include <162-1302.h>
0000 ; //时间延迟
0000 ; void delayb(uint x) //1.5us左右
0000 ; {
0000 02C0 rjmp L3
0002 L2:
0002 .dbline 8
0002 .dbline 9
0002 0150 subi R16,1
0004 1040 sbci R17,0
0006 .dbline 10
0006 L3:
0006 .dbline 7
0006 ; while(x)
0006 0030 cpi R16,0
0008 0107 cpc R16,R17
000A D9F7 brne L2
000C X0:
000C .dbline -2
000C L1:
000C .dbline 0 ; func end
000C 0895 ret
000E .dbsym r x 16 i
000E .dbend
000E .dbfunc e init_1820 _init_1820 fc
000E ; ack -> R20
.even
000E _init_1820::
000E 00D0 rcall push_gset1
0010 .dbline -1
0010 .dbline 14
0010 ; {
0010 ; x--;
0010 ; }
0010 ; }
0010 ; //18b20初始化
0010 ; uchar init_1820()
0010 ; { uchar ack;
0010 .dbline 15
0010 ; B20_DATA_DDR|=B20_DATA_IO ; //输出
0010 A09A sbi 0x14,0
0012 .dbline 16
0012 ; B20_DATA_PORT&=~B20_DATA_IO ;
0012 A898 cbi 0x15,0
0014 .dbline 17
0014 ; delayb(600); //复位低电平480us~960us
0014 08E5 ldi R16,600
0016 12E0 ldi R17,2
0018 F3DF rcall _delayb
001A .dbline 18
001A ; B20_DATA_PORT|=B20_DATA_IO ; //电平拉高
001A A89A sbi 0x15,0
001C .dbline 19
001C ; B20_DATA_DDR&=~B20_DATA_IO ; //输入
001C A098 cbi 0x14,0
001E .dbline 20
001E ; delayb(90); //延时60us~240us
001E 0AE5 ldi R16,90
0020 10E0 ldi R17,0
0022 EEDF rcall _delayb
0024 .dbline 21
0024 ; ack=B20_DATA_PIN; //读出ack的值
0024 43B3 in R20,0x13
0026 .dbline 22
0026 ; ack&=B20_DATA_IO;
0026 4170 andi R20,1
0028 .dbline 23
0028 ; delayb(200); //等待480us以上
0028 08EC ldi R16,200
002A 10E0 ldi R17,0
002C E9DF rcall _delayb
002E .dbline 24
002E ; B20_DATA_DDR|=B20_DATA_IO ; //输出
002E A09A sbi 0x14,0
0030 .dbline 25
0030 ; return(ack);
0030 042F mov R16,R20
0032 .dbline -2
0032 L5:
0032 00D0 rcall pop_gset1
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r ack 20 c
0036 .dbend
0036 .dbfunc e write_1820 _write_1820 fV
0036 ; m -> R20
0036 ; i -> R22
0036 ; x -> R10
.even
0036 _write_1820::
0036 00D0 rcall push_gset3
0038 A02E mov R10,R16
003A .dbline -1
003A .dbline 29
003A ; }
003A ; //写一个字节
003A ; void write_1820(uchar x)
003A ; {
003A .dbline 31
003A ; uchar i,m;
003A ; B20_DATA_DDR|=B20_DATA_IO; //输出
003A A09A sbi 0x14,0
003C .dbline 32
003C ; for(i=0;i<8;i++)
003C 6627 clr R22
003E 1AC0 rjmp L10
0040 L7:
0040 .dbline 33
0040 ; {
0040 .dbline 34
0040 ; m=x&0x01;
0040 4A2D mov R20,R10
0042 4170 andi R20,1
0044 .dbline 35
0044 ; if(m==0x01)
0044 4130 cpi R20,1
0046 61F4 brne L11
0048 .dbline 36
0048 ; {
0048 .dbline 37
0048 ; delayb(1); //延时>1us
0048 01E0 ldi R16,1
004A 10E0 ldi R17,0
004C D9DF rcall _delayb
004E .dbline 38
004E ; B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
004E A898 cbi 0x15,0
0050 .dbline 39
0050 ; delayb(3); //延时1us~15us 8us
0050 03E0 ldi R16,3
0052 10E0 ldi R17,0
0054 D5DF rcall _delayb
0056 .dbline 40
0056 ; B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
0056 A89A sbi 0x15,0
0058 .dbline 41
0058 ; delayb(55); //延时60us~120us 85us
0058 07E3 ldi R16,55
005A 10E0 ldi R17,0
005C D1DF rcall _delayb
005E .dbline 42
005E ; }
005E 08C0 rjmp L12
0060 L11:
0060 .dbline 44
0060 ; else
0060 ; {
0060 .dbline 45
0060 ; delayb(1); //延时>1us
0060 01E0 ldi R16,1
0062 10E0 ldi R17,0
0064 CDDF rcall _delayb
0066 .dbline 46
0066 ; B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
0066 A898 cbi 0x15,0
0068 .dbline 47
0068 ; delayb(55); //B20采样要60us到120us 85us
0068 07E3 ldi R16,55
006A 10E0 ldi R17,0
006C C9DF rcall _delayb
006E .dbline 48
006E ; B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
006E A89A sbi 0x15,0
0070 .dbline 49
0070 ; }
0070 L12:
0070 .dbline 50
0070 A694 lsr R10
0072 .dbline 51
0072 L8:
0072 .dbline 32
0072 6395 inc R22
0074 L10:
0074 .dbline 32
0074 6830 cpi R22,8
0076 20F3 brlo L7
0078 .dbline -2
0078 L6:
0078 00D0 rcall pop_gset3
007A .dbline 0 ; func end
007A 0895 ret
007C .dbsym r m 20 c
007C .dbsym r i 22 c
007C .dbsym r x 10 c
007C .dbend
007C .dbfunc e read_1820 _read_1820 fc
007C ; temp -> R20
007C ; k -> R22
007C ; n -> R10
.even
007C _read_1820::
007C 00D0 rcall push_gset3
007E .dbline -1
007E .dbline 55
007E ; x=x>>1; //右移一位
007E ; }
007E ; }
007E ; //读一个字节
007E ; uchar read_1820()
007E ; {
007E .dbline 57
007E ; uchar temp,k,n;
007E ; temp=0;
007E 4427 clr R20
0080 .dbline 58
0080 ; for(n=0;n<8;n++)
0080 AA24 clr R10
0082 1EC0 rjmp L17
0084 L14:
0084 .dbline 59
0084 ; {
0084 .dbline 60
0084 ; B20_DATA_DDR|=B20_DATA_IO; //输出
0084 A09A sbi 0x14,0
0086 .dbline 61
0086 ; B20_DATA_PORT&=~B20_DATA_IO; //产生读起始信号
0086 A898 cbi 0x15,0
0088 .dbline 62
0088 ; asm("nop");
0088 0000 nop
008A .dbline 63
008A ; asm("nop");
008A 0000 nop
008C .dbline 64
008C ; asm("nop");
008C 0000 nop
008E .dbline 65
008E ; asm("nop"); //延时1us~15us 2us
008E 0000 nop
0090 .dbline 66
0090 ; B20_DATA_PORT|=B20_DATA_IO; //电平拉高
0090 A89A sbi 0x15,0
0092 .dbline 67
0092 ; B20_DATA_DDR&=~B20_DATA_IO; //接收数据
0092 A098 cbi 0x14,0
0094 .dbline 68
0094 ; asm("nop"); //要在15us内完成读数
0094 0000 nop
0096 .dbline 69
0096 ; asm("nop");
0096 0000 nop
0098 .dbline 70
0098 ; k=B20_DATA_PIN; //读数据,从低位开始
0098 63B3 in R22,0x13
009A .dbline 71
009A ; k&=0x01;
009A 6170 andi R22,1
009C .dbline 72
009C ; if(k)
009C 29F0 breq L18
009E .dbline 73
009E ; temp|=(1<<n);
009E 01E0 ldi R16,1
00A0 1A2D mov R17,R10
00A2 00D0 rcall lsl8
00A4 402B or R20,R16
00A6 06C0 rjmp L19
00A8 L18:
00A8 .dbline 75
00A8 ; else
00A8 ; temp&=~(1<<n);
00A8 01E0 ldi R16,1
00AA 1A2D mov R17,R10
00AC 00D0 rcall lsl8
00AE 202E mov R2,R16
00B0 2094 com R2
00B2 4221 and R20,R2
00B4 L19:
00B4 .dbline 76
00B4 08E2 ldi R16,40
00B6 10E0 ldi R17,0
00B8 A3DF rcall _delayb
00BA .dbline 77
00BA A09A sbi 0x14,0
00BC .dbline 78
00BC A89A sbi 0x15,0
00BE .dbline 79
00BE L15:
00BE .dbline 58
00BE A394 inc R10
00C0 L17:
00C0 .dbline 58
00C0 8A2D mov R24,R10
00C2 8830 cpi R24,8
00C4 F8F2 brlo L14
00C6 .dbline 80
00C6 ; delayb(40); //60~120us
00C6 ; B20_DATA_DDR|=B20_DATA_IO; //输出
00C6 ; B20_DATA_PORT|=B20_DATA_IO;
00C6 ; }
00C6 ; return temp;
00C6 042F mov R16,R20
00C8 .dbline -2
00C8 L13:
00C8 00D0 rcall pop_gset3
00CA .dbline 0 ; func end
00CA 0895 ret
00CC .dbsym r temp 20 c
00CC .dbsym r k 22 c
00CC .dbsym r n 10 c
00CC .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -