📄 ds18b20.lis
字号:
.module ds18b20.c
.area text(rom, con, rel)
0000 .dbfile ..\..\..\..\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\ds18b20.c
0000 .dbfile D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\ds18b20.c
0000 .dbfunc e reset _reset fV
.even
0000 _reset::
0000 .dbline -1
0000 .dbline 11
0000 ; /*
0000 ; 我自己写的ds18b20的驱动,暂时固定PORTC0口当总线口好了
0000 ; */
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #include "mydelay.h"
0000 ; #include "ds18b20.h"
0000 ; //一。单点测量只要有presense应答就可以了,多点测量以后再搞
0000 ; //1.reset
0000 ; void reset(void)
0000 ; {
0000 .dbline 12
0000 ; DDRC=DDRC|0x01;//输出
0000 A09A sbi 0x14,0
0002 .dbline 13
0002 ; PORTC=PORTC&0xfe;//置0
0002 85B3 in R24,0x15
0004 8E7F andi R24,254
0006 85BB out 0x15,R24
0008 .dbline 14
0008 ; delay0ms500us();
0008 .dbline -2
0008 L1:
0008 .dbline 0 ; func end
0008 00C0 rjmp _delay0ms500us
000A .dbend
000A .dbfunc e ReadPresense _ReadPresense fV
.even
000A _ReadPresense::
000A .dbline -1
000A .dbline 18
000A ; }
000A ; //2.读取presense应答信号
000A ; void ReadPresense(void)
000A ; {
000A .dbline 19
000A ; DDRC=DDRC&0xfe;//输入
000A 84B3 in R24,0x14
000C 8E7F andi R24,254
000E 84BB out 0x14,R24
0010 .dbline 20
0010 ; delay0ms60us();
0010 00D0 rcall _delay0ms60us
0012 L3:
0012 .dbline 21
0012 ; while((PINC&0x01)==0x00) ;//检测到了应答信号
0012 L4:
0012 .dbline 21
0012 989B sbis 0x13,0
0014 FECF rjmp L3
0016 X0:
0016 .dbline -2
0016 L2:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
0018 .dbfunc e rdbit _rdbit fc
0018 ; data -> R20
.even
0018 _rdbit::
0018 4A93 st -y,R20
001A .dbline -1
001A .dbline 25
001A ; //delay0ms60us();
001A ; }
001A ; unsigned char rdbit(void)
001A ; {
001A .dbline 27
001A ; unsigned char data;
001A ; DDRC=DDRC|0x01;//输出
001A A09A sbi 0x14,0
001C .dbline 28
001C ; PORTC=PORTC&0xfe;//置0
001C 85B3 in R24,0x15
001E 8E7F andi R24,254
0020 85BB out 0x15,R24
0022 .dbline 29
0022 ; delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
0022 00D0 rcall _delay0ms5us
0024 .dbline 31
0024 ; //PORTC=PORTC|0x01;//置1
0024 ; DDRC=DDRC&0xfe;//输入
0024 84B3 in R24,0x14
0026 8E7F andi R24,254
0028 84BB out 0x14,R24
002A .dbline 32
002A ; data=PINC&0x01;
002A 43B3 in R20,0x13
002C 4170 andi R20,1
002E .dbline 33
002E ; delay0ms15us();
002E 00D0 rcall _delay0ms15us
0030 .dbline 34
0030 ; delay0ms60us();//读时隙不少于60us
0030 00D0 rcall _delay0ms60us
0032 .dbline 35
0032 ; return (data);
0032 042F mov R16,R20
0034 .dbline -2
0034 L6:
0034 .dbline 0 ; func end
0034 4991 ld R20,y+
0036 0895 ret
0038 .dbsym r data 20 c
0038 .dbend
0038 .dbfunc e rdbyte _rdbyte fc
0038 ; j -> R12
0038 ; i -> R20
0038 ; data -> R10
.even
0038 _rdbyte::
0038 00D0 rcall push_xgset303C
003A .dbline -1
003A .dbline 38
003A ; }
003A ; unsigned char rdbyte(void)
003A ; {
003A .dbline 41
003A ; unsigned char data;
003A ; unsigned char i,j;
003A ; for(i=8;i>0;i--)
003A 48E0 ldi R20,8
003C 0FC0 rjmp L11
003E L8:
003E .dbline 42
003E ; {
003E .dbline 43
003E ; j=rdbit();
003E ECDF rcall _rdbit
0040 C02E mov R12,R16
0042 .dbline 44
0042 ; data=(data>>1)|(j<<7);
0042 2C2C mov R2,R12
0044 220C lsl R2
0046 220C lsl R2
0048 220C lsl R2
004A 220C lsl R2
004C 220C lsl R2
004E 220C lsl R2
0050 220C lsl R2
0052 3A2C mov R3,R10
0054 3694 lsr R3
0056 3228 or R3,R2
0058 A32C mov R10,R3
005A .dbline 45
005A ; }
005A L9:
005A .dbline 41
005A 4A95 dec R20
005C L11:
005C .dbline 41
005C 80E0 ldi R24,0
005E 8417 cp R24,R20
0060 70F3 brlo L8
0062 X1:
0062 .dbline 46
0062 ; return (data);
0062 0A2D mov R16,R10
0064 .dbline -2
0064 L7:
0064 .dbline 0 ; func end
0064 00C0 rjmp pop_xgset303C
0066 .dbsym r j 12 c
0066 .dbsym r i 20 c
0066 .dbsym r data 10 c
0066 .dbend
0066 .dbfunc e wtbit _wtbit fV
0066 ; data -> R20
.even
0066 _wtbit::
0066 4A93 st -y,R20
0068 402F mov R20,R16
006A .dbline -1
006A .dbline 49
006A ; }
006A ; void wtbit(unsigned char data)
006A ; {
006A .dbline 50
006A ; DDRC=DDRC|0x01;//输出
006A A09A sbi 0x14,0
006C .dbline 51
006C ; PORTC=PORTC&0xfe;//置0
006C 85B3 in R24,0x15
006E 8E7F andi R24,254
0070 85BB out 0x15,R24
0072 .dbline 52
0072 ; delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
0072 00D0 rcall _delay0ms5us
0074 .dbline 53
0074 ; if (data==0x01) PORTC=PORTC|0x01;//置1
0074 4130 cpi R20,1
0076 09F4 brne L13
0078 X2:
0078 .dbline 53
0078 A89A sbi 0x15,0
007A L13:
007A .dbline 54
007A ; delay0ms60us();
007A 00D0 rcall _delay0ms60us
007C .dbline 55
007C ; PORTC=PORTC|0x01;//拉高回来
007C A89A sbi 0x15,0
007E .dbline 56
007E ; delay0ms60us();//时隙不少于60us
007E 00D0 rcall _delay0ms60us
0080 .dbline -2
0080 L12:
0080 .dbline 0 ; func end
0080 4991 ld R20,y+
0082 0895 ret
0084 .dbsym r data 20 c
0084 .dbend
0084 .dbfunc e wtbyte _wtbyte fV
0084 ; j -> R22
0084 ; i -> R20
0084 ; data -> R10
.even
0084 _wtbyte::
0084 00D0 rcall push_xgsetF00C
0086 A02E mov R10,R16
0088 .dbline -1
0088 .dbline 59
0088 ; }
0088 ; void wtbyte(unsigned char data)
0088 ; {
0088 .dbline 61
0088 ; unsigned char i,j;
0088 ; for (i=8;i>0;i--)
0088 48E0 ldi R20,8
008A 08C0 rjmp L19
008C L16:
008C .dbline 62
008C ; {
008C .dbline 63
008C ; j=(data>>i)&0x01;
008C 0A2D mov R16,R10
008E 142F mov R17,R20
0090 00D0 rcall lsr8
0092 602F mov R22,R16
0094 6170 andi R22,1
0096 .dbline 64
0096 ; wtbit(j);
0096 062F mov R16,R22
0098 E6DF rcall _wtbit
009A .dbline 65
009A ; }
009A L17:
009A .dbline 61
009A 4A95 dec R20
009C L19:
009C .dbline 61
009C 80E0 ldi R24,0
009E 8417 cp R24,R20
00A0 A8F3 brlo L16
00A2 X3:
00A2 .dbline -2
00A2 L15:
00A2 .dbline 0 ; func end
00A2 00C0 rjmp pop_xgsetF00C
00A4 .dbsym r j 22 c
00A4 .dbsym r i 20 c
00A4 .dbsym r data 10 c
00A4 .dbend
00A4 .dbfunc e convert _convert fV
.even
00A4 _convert::
00A4 .dbline -1
00A4 .dbline 69
00A4 ; }
00A4 ; //启动温度转换
00A4 ; void convert(void)
00A4 ; {
00A4 .dbline 70
00A4 ; reset();
00A4 ADDF rcall _reset
00A6 .dbline 71
00A6 ; ReadPresense();
00A6 B1DF rcall _ReadPresense
00A8 .dbline 72
00A8 ; wtbyte(0xcc);
00A8 0CEC ldi R16,204
00AA ECDF rcall _wtbyte
00AC .dbline 73
00AC ; wtbyte(0x44);
00AC 04E4 ldi R16,68
00AE .dbline -2
00AE L20:
00AE .dbline 0 ; func end
00AE EACF rjmp _wtbyte
00B0 .dbend
00B0 .dbfunc e rdtemp _rdtemp fi
00B0 ; tmp -> <dead>
00B0 ; temp -> R10,R11
.even
00B0 _rdtemp::
00B0 AA92 st -y,R10
00B2 BA92 st -y,R11
00B4 .dbline -1
00B4 .dbline 77
00B4 ; }
00B4 ; //读温度值
00B4 ; unsigned int rdtemp(void)
00B4 ; {
00B4 .dbline 79
00B4 ; unsigned int temp,tmp;
00B4 ; reset();
00B4 A5DF rcall _reset
00B6 .dbline 80
00B6 ; ReadPresense();
00B6 A9DF rcall _ReadPresense
00B8 .dbline 81
00B8 ; wtbyte(0xcc);
00B8 0CEC ldi R16,204
00BA E4DF rcall _wtbyte
00BC .dbline 82
00BC ; wtbyte(0xbe);
00BC 0EEB ldi R16,190
00BE E2DF rcall _wtbyte
00C0 .dbline 87
00C0 ; //temp=rdbyte();
00C0 ; //tmp=temp;
00C0 ; //temp=rdbyte();
00C0 ; //temp=(temp<<8)|tmp;
00C0 ; PORTB=rdbyte();
00C0 BBDF rcall _rdbyte
00C2 08BB out 0x18,R16
00C4 .dbline 88
00C4 ; PORTD=rdbyte();
00C4 B9DF rcall _rdbyte
00C6 02BB out 0x12,R16
00C8 .dbline 89
00C8 ; return temp;
00C8 8501 movw R16,R10
00CA .dbline -2
00CA L21:
00CA .dbline 0 ; func end
00CA B990 ld R11,y+
00CC A990 ld R10,y+
00CE 0895 ret
00D0 .dbsym l tmp 1 i
00D0 .dbsym r temp 10 i
00D0 .dbend
00D0 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -