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

📄 main.lis

📁 ds18b20多个时候的分辨函数
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\cood\18b20\main.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 33
 0000           ; #include <iom32v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define F_CPU 7372800
 0000           ; 
 0000           ; //数据类型的定义
 0000           ; #define     uint8   unsigned char                                         
 0000           ; #define   uint16   unsigned int
 0000           ; 
 0000           ; //位变量操作宏定义
 0000           ; #define     BIT_SET(a,b)   a|=BIT(b)
 0000           ; #define     BIT_CLR(a,b)   a&=~BIT(b)
 0000           ; #define     BIT_INV(a,b)     a^=BIT(b)
 0000           ; #define     BIT_STATUS(a,b) a&BIT(b)
 0000           ; 
 0000           ; //DS18B20操作定义
 0000           ; #define     CLR_DS18B20     BIT_CLR(PORTA,PA0)     //数据线强制拉低
 0000           ; #define     SET_DS18B20     BIT_SET(PORTA,PA0)     //数据线强制拉高,上拉
 0000           ; #define     HLD_DS18B20     BIT_SET(DDRA,PA0)     //Mega16控制总线
 0000           ; #define     RLS_DS18B20     BIT_CLR(DDRA,PA0)         //释放总线
 0000           ; #define     STU_DS18B20     BIT_STATUS(PINA,PA0)     //数据线的状态
 0000           ; #define     bit_0_1  0x00
 0000           ; #define     bit_0    0x01    //因为移位了,所以低在前,高位在后
 0000           ; #define     bit_1    0x02
 0000           ; #define     maxsize  7
 0000           ; unsigned char rom_seq[maxsize][8];
 0000           ; unsigned char B20_num;
 0000           ; unsigned char tep[maxsize][10];
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 34
 0000           ; PORTA = 0xFF;
 0000 8FEF              ldi R24,255
 0002 8BBB              out 0x1b,R24
 0004                   .dbline 35
 0004           ; DDRA = 0xFF;
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 36
 0006           ; PORTB = 0xFF;
 0006 88BB              out 0x18,R24
 0008                   .dbline 37
 0008           ; DDRB = 0xFF; //输出
 0008 87BB              out 0x17,R24
 000A                   .dbline 38
 000A           ; PORTC = 0xFF; //m103 output only
 000A 85BB              out 0x15,R24
 000C                   .dbline 39
 000C           ; DDRC = 0xFF; //输出 
 000C 84BB              out 0x14,R24
 000E                   .dbline 40
 000E           ; DDRD = 0xFF;
 000E 81BB              out 0x11,R24
 0010                   .dbline 41
 0010           ; PORTD = 0xFF;
 0010 82BB              out 0x12,R24
 0012                   .dbline -2
 0012           L1:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbend
 0014                   .dbfunc e delayUs _delayUs fV
 0014           ;           temp -> R16
                        .even
 0014           _delayUs::
 0014                   .dbline -1
 0014                   .dbline 63
 0014           ; }
 0014           ; 
 0014           ; /**********************************************************************
 0014           ; functionName: void delayUs(BYTE temp)
 0014           ; description :延时函数 晶振频率:7.3728MHZ
 0014           ; delayUs(1);       //2.71us
 0014           ; delayUs(2);       //3.53us
 0014           ; delayUs(4);       //5.15us
 0014           ; delayUs(8);       //8.41us
 0014           ; delayUs(16);       //14.92us
 0014           ; delayUs(32);       //27.94us
 0014           ; delayUs(64);       //53.98us
 0014           ; delayUs(128);       //106.07us
 0014           ; delayUs(255);     //209.42us
 0014           ; delayUs(18);       //16.55us
 0014           ; delayUs(34);       //29.57us
 0014           ; delayUs(35);       //30.38us
 0014           ; delayUs(100);       //83.28
 0014           ; _NOP();         //0.14us 
 0014           ; **********************************************************************/
 0014           ; void delayUs(uint8 temp)
 0014           ; {
 0014           L3:
 0014                   .dbline 64
 0014           ;     while(temp--);
 0014           L4:
 0014                   .dbline 64
 0014 202E              mov R2,R16
 0016 3324              clr R3
 0018 0150              subi R16,1
 001A 2220              tst R2
 001C D9F7              brne L3
 001E           X0:
 001E                   .dbline -2
 001E           L2:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbsym r temp 16 c
 0020                   .dbend
 0020                   .dbfunc e longdelay _longdelay fV
 0020           ;              i -> R20,R21
                        .even
 0020           _longdelay::
 0020 4A93              st -y,R20
 0022 5A93              st -y,R21
 0024                   .dbline -1
 0024                   .dbline 69
 0024           ; }
 0024           ; 
 0024           ; //延时约1s
 0024           ; void longdelay(void)
 0024           ; {
 0024                   .dbline 71
 0024           ; unsigned int i;
 0024           ; for(i=4761;i!=0;i--)
 0024 49E9              ldi R20,4761
 0026 52E1              ldi R21,18
 0028 04C0              xjmp L10
 002A           L7:
 002A                   .dbline 72
 002A           ; delayUs(255);
 002A 0FEF              ldi R16,255
 002C F3DF              xcall _delayUs
 002E           L8:
 002E                   .dbline 71
 002E 4150              subi R20,1
 0030 5040              sbci R21,0
 0032           L10:
 0032                   .dbline 71
 0032 4030              cpi R20,0
 0034 4507              cpc R20,R21
 0036 C9F7              brne L7
 0038           X1:
 0038                   .dbline -2
 0038           L6:
 0038                   .dbline 0 ; func end
 0038 5991              ld R21,y+
 003A 4991              ld R20,y+
 003C 0895              ret
 003E                   .dbsym r i 20 i
 003E                   .dbend
 003E                   .dbfunc e resetDS18B20 _resetDS18B20 fc
 003E           ;        errTime -> R10
                        .even
 003E           _resetDS18B20::
 003E AA92              st -y,R10
 0040                   .dbline -1
 0040                   .dbline 81
 0040           ; }
 0040           ; 
 0040           ; 
 0040           ; /*******************************************************************************
 0040           ; functionName: uint8 resetDS18B20(void)
 0040           ; description :DS18B20初始化
 0040           ; ********************************************************************************/
 0040           ; uint8 resetDS18B20(void)
 0040           ; {
 0040                   .dbline 82
 0040           ;   uint8 errTime=0;
 0040 AA24              clr R10
 0042                   .dbline 83
 0042           ;   RLS_DS18B20;     //释放总线
 0042 D098              cbi 0x1a,0
 0044                   .dbline 84
 0044           ;   _NOP();
 0044 0000              nop
 0046                   .dbline 85
 0046           ;   HLD_DS18B20;     //Maga16控制总线
 0046 D09A              sbi 0x1a,0
 0048                   .dbline 86
 0048           ;   CLR_DS18B20;     //强制拉低
 0048 D898              cbi 0x1b,0
 004A                   .dbline 87
 004A           ;   delayUs(255);     //209.42us
 004A 0FEF              ldi R16,255
 004C E3DF              xcall _delayUs
 004E                   .dbline 88
 004E           ;   delayUs(255);     //209.42us
 004E 0FEF              ldi R16,255
 0050 E1DF              xcall _delayUs
 0052                   .dbline 89
 0052           ;   delayUs(255);     //83.28us
 0052 0FEF              ldi R16,255
 0054 DFDF              xcall _delayUs
 0056                   .dbline 91
 0056           ;   //以上的三个延时大于480us
 0056           ;   RLS_DS18B20;     //释放总线,总线自动上拉
 0056 D098              cbi 0x1a,0
 0058                   .dbline 92
 0058           ;   _NOP();         
 0058 0000              nop
 005A 08C0              xjmp L13
 005C           L12:
 005C                   .dbline 94
 005C           ;   while(STU_DS18B20)   
 005C           ;   {
 005C                   .dbline 95
 005C           ;     delayUs(4);       //5.15us
 005C 04E0              ldi R16,4
 005E DADF              xcall _delayUs
 0060                   .dbline 96
 0060           ;     errTime++;
 0060 A394              inc R10
 0062                   .dbline 97
 0062           ;     if(errTime>20)
 0062 84E1              ldi R24,20
 0064 8A15              cp R24,R10
 0066 10F4              brsh L15
 0068           X2:
 0068                   .dbline 98
 0068           ;     return(0x00);     //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
 0068 0027              clr R16
 006A 0FC0              xjmp L11
 006C           L15:
 006C                   .dbline 99
 006C           ;   }
 006C           L13:
 006C                   .dbline 93
 006C C899              sbic 0x19,0
 006E F6CF              rjmp L12
 0070           X3:
 0070                   .dbline 100
 0070           ;   errTime=0;
 0070 AA24              clr R10
 0072 08C0              xjmp L18
 0074           L17:
 0074                   .dbline 102
 0074           ;   while(!(STU_DS18B20))   
 0074           ;   {
 0074                   .dbline 103
 0074           ;     delayUs(4);       //5.15us
 0074 04E0              ldi R16,4
 0076 CEDF              xcall _delayUs
 0078                   .dbline 104
 0078           ;     errTime++;
 0078 A394              inc R10
 007A                   .dbline 105
 007A           ;     if(errTime>50)
 007A 82E3              ldi R24,50
 007C 8A15              cp R24,R10
 007E 10F4              brsh L20
 0080           X4:
 0080                   .dbline 106
 0080           ;     return(0x00);     //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
 0080 0027              clr R16
 0082 03C0              xjmp L11
 0084           L20:
 0084                   .dbline 107
 0084           ;   }
 0084           L18:
 0084                   .dbline 101
 0084 C89B              sbis 0x19,0
 0086 F6CF              rjmp L17
 0088           X5:
 0088                   .dbline 108
 0088           ;   return(0xff);
 0088 0FEF              ldi R16,255
 008A                   .dbline -2
 008A           L11:
 008A                   .dbline 0 ; func end
 008A A990              ld R10,y+
 008C 0895              ret
 008E                   .dbsym r errTime 10 c
 008E                   .dbend
 008E                   .dbfunc e write_a_bit _write_a_bit fV
 008E           ;           temp -> R10
                        .even
 008E           _write_a_bit::
 008E AA92              st -y,R10
 0090 A02E              mov R10,R16
 0092                   .dbline -1
 0092                   .dbline 115
 0092           ; }
 0092           ; 
 0092           ; 
 0092           ; /*
 0092           ; 写一个位
 0092           ; */
 0092           ; void write_a_bit(unsigned char temp){
 0092                   .dbline 116
 0092           ;     HLD_DS18B20;     //Maga16控制总线
 0092 D09A              sbi 0x1a,0
 0094                   .dbline 117
 0094           ;     CLR_DS18B20;     //强制拉低
 0094 D898              cbi 0x1b,0
 0096                   .dbline 118
 0096           ;     delayUs(16);       //14.92us
 0096 00E1              ldi R16,16
 0098 BDDF              xcall _delayUs
 009A                   .dbline 119
 009A           ;     if(temp&0x01)
 009A A0FE              sbrs R10,0
 009C 02C0              rjmp L23
 009E           X6:
 009E                   .dbline 120
 009E           ;     RLS_DS18B20;     //释放总线
 009E D098              cbi 0x1a,0
 00A0 01C0              xjmp L24
 00A2           L23:
 00A2                   .dbline 122
 00A2           ;     else
 00A2           ;     CLR_DS18B20;     //强制拉低
 00A2 D898              cbi 0x1b,0
 00A4           L24:
 00A4                   .dbline 123
 00A4           ;     delayUs(16);       //14.92us
 00A4 00E1              ldi R16,16
 00A6 B6DF              xcall _delayUs
 00A8                   .dbline 124
 00A8           ;     delayUs(35);       //30.38us
 00A8 03E2              ldi R16,35
 00AA B4DF              xcall _delayUs
 00AC                   .dbline 125
 00AC           ;     RLS_DS18B20;     //释放总线
 00AC D098              cbi 0x1a,0
 00AE                   .dbline 126
 00AE           ;     delayUs(1);         //2.71us(大于1us就行了)
 00AE 01E0              ldi R16,1
 00B0 B1DF              xcall _delayUs
 00B2                   .dbline -2
 00B2           L22:
 00B2                   .dbline 0 ; func end
 00B2 A990              ld R10,y+
 00B4 0895              ret
 00B6                   .dbsym r temp 10 c
 00B6                   .dbend
 00B6                   .dbfunc e read_a_bit _read_a_bit fc
 00B6           ;           temp -> R20
                        .even

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -