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

📄 1.lst

📁 测试18b20的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0156)      while(x) 
(0157)     { 
(0158)        x--; 
    0115 5001      SUBI	R16,1
    0116 4010      SBCI	R17,0
    0117 3000      CPI	R16,0
    0118 0701      CPC	R16,R17
    0119 F7D9      BNE	0x0115
    011A 9508      RET
(0159)     } 
(0160) } 
(0161)  
(0162) //////////////////////////////////////////
(0163) void init_1820() 
(0164) { 
(0165)     PORTD|=(1<<6);    
_init_1820:
    011B 9A96      SBI	0x12,6
(0166)     PORTD&=~(1<<6); 
    011C 9896      CBI	0x12,6
(0167)     delay(3000);    //480us以上 
    011D EB08      LDI	R16,0xB8
    011E E01B      LDI	R17,0xB
    011F DFF4      RCALL	_delay
(0168)     PORTD|=(1<<6); 
    0120 9A96      SBI	0x12,6
(0169)     DDRD&=~(1<<6); 
    0121 988E      CBI	0x11,6
(0170)     delay(40);     //15~60us 
    0122 E208      LDI	R16,0x28
    0123 E010      LDI	R17,0
    0124 DFEF      RCALL	_delay
(0171)     while(PIND&(1<<6)) 
    0125 9986      SBIC	0x10,6
    0126 CFFE      RJMP	0x0125
(0172)     { 
(0173)       // disp_led(3,0); 
(0174)       // for(;;) 
(0175)        //{} 
(0176)    } 
(0177)     DDRD|=(1<<6); 
    0127 9A8E      SBI	0x11,6
(0178)     PORTD|=(1<<6); 
    0128 9A96      SBI	0x12,6
(0179)     delay(150);   //60~240us 
    0129 E906      LDI	R16,0x96
    012A E010      LDI	R17,0
    012B DFE8      RCALL	_delay
    012C 9508      RET
_write_1820:
  m                    --> R20
  x                    --> R22
    012D 940E020C  CALL	push_gset2
    012F 2F60      MOV	R22,R16
(0180) }
(0181) ///////////////////////////////////////////////////////
(0182) write_1820(uchar x) 
(0183) {    
(0184)      uchar m; 
(0185)     for(m=0;m<8;m++) 
    0130 2744      CLR	R20
    0131 C010      RJMP	0x0142
(0186)     { 
(0187)          PORTD&=~(1<<6); 
    0132 9896      CBI	0x12,6
(0188)        if(x&(1<<m))    //写数据,从低位开始 
    0133 E001      LDI	R16,1
    0134 2F14      MOV	R17,R20
    0135 940E0242  CALL	lsl8
    0137 2E26      MOV	R2,R22
    0138 2220      AND	R2,R16
    0139 F011      BEQ	0x013C
(0189)        PORTD|=(1<<6); 
    013A 9A96      SBI	0x12,6
    013B C001      RJMP	0x013D
(0190)        else 
(0191)        PORTD&=~(1<<6); 
    013C 9896      CBI	0x12,6
(0192)        delay(40);   //15~60us 
    013D E208      LDI	R16,0x28
    013E E010      LDI	R17,0
    013F DFD4      RCALL	_delay
(0193)        PORTD|=(1<<6); 
    0140 9A96      SBI	0x12,6
    0141 9543      INC	R20
    0142 3048      CPI	R20,0x8
    0143 F370      BCS	0x0132
(0194)     } 
(0195)      PORTD|=(1<<6); 
    0144 9A96      SBI	0x12,6
    0145 940E0200  CALL	pop_gset2
    0147 9508      RET
_read_1820:
  temp                 --> R20
  k                    --> R22
  n                    --> R10
    0148 940E020A  CALL	push_gset3
(0196) } 
(0197) 
(0198) //////////////////////////////////////////////
(0199) uchar read_1820() 
(0200) {     
(0201)     uchar temp,k,n; 
(0202)            temp=0; 
    014A 2744      CLR	R20
(0203)     for(n=0;n<8;n++) 
    014B 24AA      CLR	R10
    014C C018      RJMP	0x0165
(0204)        { 
(0205)       PORTD&=~(1<<6); 
    014D 9896      CBI	0x12,6
(0206)       //delay(2);       
(0207)       PORTD|=(1<<6); 
    014E 9A96      SBI	0x12,6
(0208)       //delay(3);     
(0209)       DDRD&=~(1<<6); 
    014F 988E      CBI	0x11,6
(0210)       k=(PIND&(1<<6));    //读数据,从低位开始 
    0150 B360      IN	R22,0x10
    0151 7460      ANDI	R22,0x40
(0211)       if(k) 
    0152 F031      BEQ	0x0159
(0212)       temp|=(1<<n); 
    0153 E001      LDI	R16,1
    0154 2D1A      MOV	R17,R10
    0155 940E0242  CALL	lsl8
    0157 2B40      OR	R20,R16
    0158 C007      RJMP	0x0160
(0213)       else 
(0214)       temp&=~(1<<n); 
    0159 E001      LDI	R16,1
    015A 2D1A      MOV	R17,R10
    015B 940E0242  CALL	lsl8
    015D 2E20      MOV	R2,R16
    015E 9420      COM	R2
    015F 2142      AND	R20,R2
(0215)       delay(50); //60~120us     
    0160 E302      LDI	R16,0x32
    0161 E010      LDI	R17,0
    0162 DFB1      RCALL	_delay
(0216)       DDRD|=(1<<6); 
    0163 9A8E      SBI	0x11,6
    0164 94A3      INC	R10
    0165 2D8A      MOV	R24,R10
    0166 3088      CPI	R24,0x8
    0167 F328      BCS	0x014D
(0217)         } 
(0218)    return (temp); 
    0168 2F04      MOV	R16,R20
    0169 940E0203  CALL	pop_gset3
    016B 9508      RET
_send_byte:
  i                    --> R20
  x                    --> R22
    016C 940E020C  CALL	push_gset2
    016E 2F60      MOV	R22,R16
(0219) }  
(0220) ////////////////////////////////////////////////
(0221) void send_byte(uchar x)    //以下为显示程序 
(0222) { 
(0223)    uchar i; 
(0224)     for(i=0;i<8;i++) 
    016F 2744      CLR	R20
    0170 C014      RJMP	0x0185
(0225)     { 
(0226)        PORTC&=~(1<<5);   // PC5为底  为164提供时钟信号 
    0171 98AD      CBI	0x15,5
(0227)       if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断 
    0172 E017      LDI	R17,7
    0173 1B14      SUB	R17,R20
    0174 E001      LDI	R16,1
    0175 940E0242  CALL	lsl8
    0177 2E26      MOV	R2,R22
    0178 2220      AND	R2,R16
    0179 F431      BNE	0x0180
    017A 9180007A  LDS	R24,dp
    017C 3081      CPI	R24,1
    017D F421      BNE	0x0182
    017E 2344      TST	R20
    017F F411      BNE	0x0182
(0228)       PORTC|=(1<<4);                           //若为高着PC4输出高电平    
    0180 9AAC      SBI	0x15,4
    0181 C001      RJMP	0x0183
(0229)       else 
(0230)       PORTC&=~(1<<4);                           //若为低着输出低电平 
    0182 98AC      CBI	0x15,4
(0231)       PORTC|=(1<<5);   //PC5 提供始终信号 
    0183 9AAD      SBI	0x15,5
    0184 9543      INC	R20
    0185 3048      CPI	R20,0x8
    0186 F350      BCS	0x0171
    0187 940E0200  CALL	pop_gset2
    0189 9508      RET
_main:
  teml                 --> R20
  temh                 --> R22
  i                    --> R10
    018A 9722      SBIW	R28,2
(0232)    } 
(0233)    //PORTC|=((1<<0)|(1<<1)|(1<<2)); 
(0234) } 
(0235) ////////////////////////////////////////////////
(0236) void main(void) //主函数 
(0237) { 
(0238)  // disp_led(0,0); 
(0239)   delay(2000); 
    018B ED00      LDI	R16,0xD0
    018C E017      LDI	R17,7
    018D DF86      RCALL	_delay
(0240)   OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率, 
    018E E98D      LDI	R24,0x9D
    018F BF81      OUT	0x31,R24
(0241)   DDRC=0xff; 
    0190 EF8F      LDI	R24,0xFF
    0191 BB84      OUT	0x14,R24
(0242)   DDRD=0XFF;
    0192 BB81      OUT	0x11,R24
(0243)   DDRA=0XFF;
    0193 BB8A      OUT	0x1A,R24
(0244)  PORTA=0XF3; 
    0194 EF83      LDI	R24,0xF3
    0195 BB8B      OUT	0x1B,R24
(0245)   PORTD=0XFF; 
    0196 EF8F      LDI	R24,0xFF
    0197 BB82      OUT	0x12,R24
(0246)   WDR();       //看门狗计数清零 
    0198 95A8      WDR
(0247)   LCD_init();
    0199 DEED      RCALL	_LCD_init
(0248)   WDTCR=0x0F; 
    019A E08F      LDI	R24,0xF
    019B BD81      OUT	0x21,R24
(0249)   PORTC=0xff; 
    019C EF8F      LDI	R24,0xFF
    019D BB85      OUT	0x15,R24
    019E C049      RJMP	0x01E8
(0250)   while(1) 
(0251)    { 
(0252)       uchar i,temh,teml; 
(0253)       init_1820();        //复位18b20 
    019F DF7B      RCALL	_init_1820
(0254)       write_1820(0xcc);   //skip rom 
    01A0 EC0C      LDI	R16,0xCC
    01A1 DF8B      RCALL	_write_1820
(0255)       write_1820(0x44); // 发出转换命令 convert T
    01A2 E404      LDI	R16,0x44
    01A3 DF89      RCALL	_write_1820
(0256)       delay(400); 
    01A4 E900      LDI	R16,0x90
    01A5 E011      LDI	R17,1
    01A6 DF6D      RCALL	_delay
(0257)       init_1820(); 
    01A7 DF73      RCALL	_init_1820
(0258)       WDR(); 
    01A8 95A8      WDR
(0259)       write_1820(0xcc);  //发出读命令 
    01A9 EC0C      LDI	R16,0xCC
    01AA DF82      RCALL	_write_1820
(0260)       write_1820(0xbe); 
    01AB EB0E      LDI	R16,0xBE
    01AC DF80      RCALL	_write_1820
(0261)       teml=read_1820();  //读数据 
    01AD DF9A      RCALL	_read_1820
    01AE 2F40      MOV	R20,R16
(0262)       temh=read_1820(); 
    01AF DF98      RCALL	_read_1820
    01B0 2F60      MOV	R22,R16
(0263) 	 
(0264)       //for(i=0;i<7;i++)    //测试用 
(0265)       //{ 
(0266)       //send_byte(0x40); 
(0267)       //send_byte(disp_table[0&0x0f]); 
(0268)                   //} 
(0269)       //send_byte(disp_table[temh>>4]); 
(0270)       //send_byte(disp_table[temh&0x0f]); 
(0271)                   //send_byte(disp_table[teml>>4]); 
(0272)       //send_byte(disp_table[teml&0x0f]); 
(0273)       count=(temh*256+teml)*6.25;  //计算具体温度 
    01B1 E504      LDI	R16,0x54
    01B2 E010      LDI	R17,0
    01B3 940E022E  CALL	lpm32
    01B5 933A      ST	R19,-Y
    01B6 932A      ST	R18,-Y
    01B7 931A      ST	R17,-Y
    01B8 930A      ST	R16,-Y
    01B9 2F26      MOV	R18,R22
    01BA 2733      CLR	R19
    01BB E000      LDI	R16,0
    01BC E011      LDI	R17,1
    01BD 940E01F0  CALL	empy16s
    01BF 0118      MOVW	R2,R16
    01C0 2E44      MOV	R4,R20
    01C1 2455      CLR	R5
    01C2 0C24      ADD	R2,R4
    01C3 1C35      ADC	R3,R5
    01C4 0181      MOVW	R16,R2
    01C5 940E0290  CALL	int2fp
    01C7 933A      ST	R19,-Y
    01C8 932A      ST	R18,-Y
    01C9 931A      ST	R17,-Y
    01CA 930A      ST	R16,-Y
    01CB 940E02F9  CALL	empy32f
    01CD 940E0256  CALL	fp2long
    01CF 93100077  STS	count+1,R17
    01D1 93000076  STS	count,R16
    01D3 93300079  STS	count+3,R19
    01D5 93200078  STS	count+2,R18
(0274)       WDR(); 
    01D7 95A8      WDR
(0275)                   //disp_led(0,1);     //显示温度 
(0276)       for(i=0;i<100;i++)   //每次转换需要延时200ms以上 
    01D8 24AA      CLR	R10
    01D9 C004      RJMP	0x01DE
(0277)       delay(1000);  
    01DA EE08      LDI	R16,0xE8
    01DB E013      LDI	R17,3
    01DC DF37      RCALL	_delay
    01DD 94A3      INC	R10
    01DE 2D8A      MOV	R24,R10
    01DF 3684      CPI	R24,0x64
    01E0 F3C8      BCS	0x01DA
(0278) 	   LCD_write_string(0,0,"count");    
FILE: <library>
    01E1 E780      LDI	R24,0x70
    01E2 E090      LDI	R25,0
    01E3 8399      STD	Y+1,R25
    01E4 8388      STD	Y+0,R24
    01E5 2722      CLR	R18
    01E6 2700      CLR	R16
    01E7 DF0A      RCALL	_LCD_write_string
    01E8 CFB6      RJMP	0x019F
    01E9 9622      ADIW	R28,2
    01EA 9508      RET
push_arg4:
    01EB 933A      ST	R19,-Y
    01EC 932A      ST	R18,-Y
push_arg2:
    01ED 931A      ST	R17,-Y
    01EE 930A      ST	R16,-Y
    01EF 9508      RET
empy16s:
    01F0 920A      ST	R0,-Y
    01F1 921A      ST	R1,-Y
    01F2 938A      ST	R24,-Y
    01F3 939A      ST	R25,-Y
    01F4 9F02      MUL	R16,R18
    01F5 01C0      MOVW	R24,R0
    01F6 9F12      MUL	R17,R18
    01F7 0D90      ADD	R25,R0
    01F8 9F03      MUL	R16,R19
    01F9 0D90      ADD	R25,R0
    01FA 018C      MOVW	R16,R24
    01FB 9199      LD	R25,Y+
    01FC 9189      LD	R24,Y+
    01FD 9019      LD	R1,Y+
    01FE 9009      LD	R0,Y+
    01FF 9508      RET
pop_gset2:
    0200 E0E2      LDI	R30,2
    0201 940C0212  JMP	pop
pop_gset3:
    0203 E0E4      LDI	R30,4
    0204 940C0212  JMP	pop
push_gset5:
    0206 92FA      ST	R15,-Y
    0207 92EA      ST	R14,-Y
push_gset4:
    0208 92DA      ST	R13,-Y
    0209 92CA      ST	R12,-Y
push_gset3:
    020A 92BA      ST	R11,-Y
    020B 92AA      ST	R10,-Y
push_gset2:
    020C 937A      ST	R23,-Y
    020D 936A      ST	R22,-Y
push_gset1:
    020E 935A      ST	R21,-Y
    020F 934A      ST	R20,-Y
    0210 9508      RET
pop_gset1:
    0211 E0E1      LDI	R30,1
pop:
    0212 9149      LD	R20,Y+
    0213 9159      LD	R21,Y+
    0214 FDE0      SBRC	R30,0
    0215 9508      RET
    0216 9169      LD	R22,Y+
    0217 9179      LD	R23,Y+
    0218 FDE1      SBRC	R30,1
    0219 9508      RET

⌨️ 快捷键说明

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