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

📄 main.lis

📁 51单片驱动18b20的源代码程序!供设计者参考!
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0244 2496              adiw R28,4
 0246 0C940000          xjmp pop_xgset303C
 024A                   .dbsym r temp 20 c
 024A                   .dbsym l ascii 2 A[2:2]c
 024A                   .dbsym l asc 10 c
 024A                   .dbsym r column 12 c
 024A                   .dbsym r row 10 c
 024A                   .dbend
 024A                   .dbfunc e delay_1us _delay_1us fV
                        .even
 024A           _delay_1us::
 024A                   .dbline -1
 024A                   .dbline 152
 024A           ; }
 024A           ; 
 024A           ; /****************************************************************************/
 024A           ; //////////////////////////////延时程序////////////////////////////////////////
 024A           ; /****************************************************************************/
 024A           ; #define XTAL 8                    //晶振频率,单位MHz
 024A           ; void delay_1us(void)                 //1us延时函数
 024A           ;   {
 024A                   .dbline 153
 024A           ;    asm("nop");
 024A 0000              nop
 024C                   .dbline -2
 024C           L41:
 024C                   .dbline 0 ; func end
 024C 0895              ret
 024E                   .dbend
 024E                   .dbfunc e delay_nus _delay_nus fV
 024E           ;              i -> R20,R21
 024E           ;              n -> R10,R11
                        .even
 024E           _delay_nus::
 024E 0E940000          xcall push_xgset300C
 0252 5801              movw R10,R16
 0254                   .dbline -1
 0254                   .dbline 157
 0254           ;   }
 0254           ; 
 0254           ; void delay_nus(unsigned int n)       //N us延时函数
 0254           ;   {
 0254                   .dbline 158
 0254           ;    unsigned int i=0;
 0254 4427              clr R20
 0256 5527              clr R21
 0258                   .dbline 159
 0258           ;    for (i=0;i<n;i++)
 0258 03C0              xjmp L46
 025A           L43:
 025A                   .dbline 160
 025A           ;    delay_1us();
 025A F7DF              xcall _delay_1us
 025C           L44:
 025C                   .dbline 159
 025C 4F5F              subi R20,255  ; offset = 1
 025E 5F4F              sbci R21,255
 0260           L46:
 0260                   .dbline 159
 0260 4A15              cp R20,R10
 0262 5B05              cpc R21,R11
 0264 D0F3              brlo L43
 0266           X8:
 0266                   .dbline -2
 0266           L42:
 0266                   .dbline 0 ; func end
 0266 0C940000          xjmp pop_xgset300C
 026A                   .dbsym r i 20 i
 026A                   .dbsym r n 10 i
 026A                   .dbend
 026A                   .dbfunc e delay_1ms _delay_1ms fV
 026A           ;              i -> R16,R17
                        .even
 026A           _delay_1ms::
 026A                   .dbline -1
 026A                   .dbline 164
 026A           ;   }
 026A           ;   
 026A           ; void delay_1ms(void)                 //1ms延时函数
 026A           ;   {
 026A                   .dbline 166
 026A           ;    unsigned int i;
 026A           ;    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
 026A 0027              clr R16
 026C 1127              clr R17
 026E 02C0              xjmp L51
 0270           L48:
 0270                   .dbline 166
 0270           L49:
 0270                   .dbline 166
 0270 0F5F              subi R16,255  ; offset = 1
 0272 1F4F              sbci R17,255
 0274           L51:
 0274                   .dbline 166
 0274 86E7              ldi R24,1142
 0276 94E0              ldi R25,4
 0278 0817              cp R16,R24
 027A 1907              cpc R17,R25
 027C C8F3              brlo L48
 027E           X9:
 027E                   .dbline -2
 027E           L47:
 027E                   .dbline 0 ; func end
 027E 0895              ret
 0280                   .dbsym r i 16 i
 0280                   .dbend
 0280                   .dbfunc e delay_nms _delay_nms fV
 0280           ;              i -> R20,R21
 0280           ;              n -> R10,R11
                        .even
 0280           _delay_nms::
 0280 0E940000          xcall push_xgset300C
 0284 5801              movw R10,R16
 0286                   .dbline -1
 0286                   .dbline 170
 0286           ;   }
 0286           ;   
 0286           ; void delay_nms(unsigned int n)       //N ms延时函数
 0286           ;   {
 0286                   .dbline 171
 0286           ;    unsigned int i=0;
 0286 4427              clr R20
 0288 5527              clr R21
 028A                   .dbline 172
 028A           ;    for (i=0;i<n;i++)
 028A 03C0              xjmp L56
 028C           L53:
 028C                   .dbline 173
 028C           ;    {
 028C                   .dbline 174
 028C           ;       delay_1ms();
 028C EEDF              xcall _delay_1ms
 028E                   .dbline 175
 028E           ;    }   
 028E           L54:
 028E                   .dbline 172
 028E 4F5F              subi R20,255  ; offset = 1
 0290 5F4F              sbci R21,255
 0292           L56:
 0292                   .dbline 172
 0292 4A15              cp R20,R10
 0294 5B05              cpc R21,R11
 0296 D0F3              brlo L53
 0298           X10:
 0298                   .dbline -2
 0298           L52:
 0298                   .dbline 0 ; func end
 0298 0C940000          xjmp pop_xgset300C
 029C                   .dbsym r i 20 i
 029C                   .dbsym r n 10 i
 029C                   .dbend
 029C                   .dbfile D:\DS18B20\ds18b20.h
 029C                   .dbfunc e resetDS18B20 _resetDS18B20 fc
 029C           ;        errTime -> R10
                        .even
 029C           _resetDS18B20::
 029C AA92              st -y,R10
 029E                   .dbline -1
 029E                   .dbline 8
 029E           ; #define       dq_clr  PORTB&=~(1<<PB7)    //数据线强制拉低
 029E           ; #define       dq_set  PORTB|=(1<<PB7)     //数据线强制拉高,上拉
 029E           ; #define       hold_dq DDRB|=(1<<PB7)     //Mega16控制总线
 029E           ; #define       rls_dq  DDRB&=~(1<<PB7)     //释放总线
 029E           ; #define       stu_dq  PINB&(1<<PB7)  //数据线的状态
 029E           ; 
 029E           ; unsigned char resetDS18B20(void)
 029E           ; {
 029E                   .dbline 9
 029E           ;    unsigned char errTime=0;
 029E AA24              clr R10
 02A0                   .dbline 10
 02A0           ;    rls_dq;               //释放总线
 02A0 BF98              cbi 0x17,7
 02A2                   .dbline 11
 02A2           ;    _NOP();
 02A2 0000              nop
 02A4                   .dbline 12
 02A4           ;    hold_dq;              //Maga16控制总线
 02A4 BF9A              sbi 0x17,7
 02A6                   .dbline 13
 02A6           ;    dq_clr;               //强制拉低
 02A6 C798              cbi 0x18,7
 02A8                   .dbline 14
 02A8           ;    delay_nus(480);       
 02A8 00EE              ldi R16,480
 02AA 11E0              ldi R17,1
 02AC D0DF              xcall _delay_nus
 02AE                   .dbline 16
 02AE           ;    //以上延时大于480us
 02AE           ;    rls_dq;               //释放总线,总线自动上拉
 02AE BF98              cbi 0x17,7
 02B0                   .dbline 17
 02B0           ;    _NOP();
 02B0 0000              nop
 02B2 09C0              xjmp L59
 02B4           L58:
 02B4                   .dbline 19
 02B4           ;    while(stu_dq)
 02B4           ;    {
 02B4                   .dbline 20
 02B4           ;       delay_nus(5);      //5us
 02B4 05E0              ldi R16,5
 02B6 10E0              ldi R17,0
 02B8 CADF              xcall _delay_nus
 02BA                   .dbline 21
 02BA           ;       errTime++;
 02BA A394              inc R10
 02BC                   .dbline 22
 02BC           ;       if(errTime>12)
 02BC 8CE0              ldi R24,12
 02BE 8A15              cp R24,R10
 02C0 10F4              brsh L61
 02C2           X11:
 02C2                   .dbline 23
 02C2           ;          return(0x00);           //如果等带大于约 5*12就返回0x00,报告复位失败(实际上只要等待15-60us)
 02C2 0027              clr R16
 02C4 10C0              xjmp L57
 02C6           L61:
 02C6                   .dbline 24
 02C6           ;    }
 02C6           L59:
 02C6                   .dbline 18
 02C6 B799              sbic 0x16,7
 02C8 F5CF              rjmp L58
 02CA           X12:
 02CA                   .dbline 25
 02CA           ;    errTime=0;
 02CA AA24              clr R10
 02CC 09C0              xjmp L64
 02CE           L63:
 02CE                   .dbline 27
 02CE           ;    while(!(stu_dq))
 02CE           ;    {
 02CE                   .dbline 28
 02CE           ;       delay_nus(5);      //5us
 02CE 05E0              ldi R16,5
 02D0 10E0              ldi R17,0
 02D2 BDDF              xcall _delay_nus
 02D4                   .dbline 29
 02D4           ;       errTime++;
 02D4 A394              inc R10
 02D6                   .dbline 30
 02D6           ;       if(errTime>50)
 02D6 82E3              ldi R24,50
 02D8 8A15              cp R24,R10
 02DA 10F4              brsh L66
 02DC           X13:
 02DC                   .dbline 31
 02DC           ;          return(0x00);     //如果等带大于约 5us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
 02DC 0027              clr R16
 02DE 03C0              xjmp L57
 02E0           L66:
 02E0                   .dbline 32
 02E0           ;    }
 02E0           L64:
 02E0                   .dbline 26
 02E0 B79B              sbis 0x16,7
 02E2 F5CF              rjmp L63
 02E4           X14:
 02E4                   .dbline 33
 02E4           ;    return(0xff);
 02E4 0FEF              ldi R16,255
 02E6                   .dbline -2
 02E6           L57:
 02E6                   .dbline 0 ; func end
 02E6 A990              ld R10,y+
 02E8 0895              ret
 02EA                   .dbsym r errTime 10 c
 02EA                   .dbend
 02EA                   .dbfunc e readByteDS18B20 _readByteDS18B20 fc
 02EA           ;         retVal -> R20
 02EA           ;              i -> R22
                        .even
 02EA           _readByteDS18B20::
 02EA 4A93              st -y,R20
 02EC 6A93              st -y,R22
 02EE                   .dbline -1
 02EE                   .dbline 37
 02EE           ; }
 02EE           ; 
 02EE           ; unsigned char readByteDS18B20(void)
 02EE           ; {
 02EE                   .dbline 39
 02EE           ;    unsigned char i;
 02EE           ;    unsigned char retVal=0;
 02EE 4427              clr R20
 02F0                   .dbline 40
 02F0           ;    rls_dq;               //释放总线
 02F0 BF98              cbi 0x17,7
 02F2                   .dbline 41
 02F2           ;    for(i=8;i>0;i--)
 02F2 68E0              ldi R22,8
 02F4 11C0              xjmp L72
 02F6           L69:
 02F6                   .dbline 42
 02F6           ;    {
 02F6                   .dbline 43
 02F6           ;       retVal>>=1;
 02F6 4695              lsr R20
 02F8                   .dbline 44
 02F8           ;       hold_dq;           //Maga16控制总线
 02F8 BF9A              sbi 0x17,7
 02FA                   .dbline 45
 02FA           ;       dq_clr;    //强制拉低
 02FA C798              cbi 0x18,7
 02FC                   .dbline 46
 02FC           ;       delay_nus(8);      //延时大于1us
 02FC 08E0              ldi R16,8
 02FE 10E0              ldi R17,0
 0300 A6DF              xcall _delay_nus
 0302                   .dbline 47
 0302           ;       dq_set;    //释放总线,DS18B20会将总线强制拉低
 0302 C79A              sbi 0x18,7
 0304                   .dbline 49
 0304           ;      
 0304           ;         rls_dq;               //释放总线
 0304 BF98              cbi 0x17,7
 0306                   .dbline 50
 0306           ;       if(stu_dq)
 0306 B79B              sbis 0x16,7
 0308 01C0              rjmp L73
 030A           X15:
 030A                   .dbline 51
 030A           ;          retVal|=0x80;
 030A 4068              ori R20,128
 030C           L73:
 030C                   .dbline 52

⌨️ 快捷键说明

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