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

📄 ds18b20.lis

📁 用的avr icc 开发的atmega16的超声波测距仪模型。
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -