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

📄 18b20.lis

📁 1302_18b20_8515基于AVR单片机的开发系统。 在使用中通过仿真来实现。可以将此程序扩展成其他外围设备的基础
💻 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 + -