⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lis

📁 温度测量ds18b20.rar
💻 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 + -