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

📄 18b20ok.lst

📁 ds18b20多个时候的分辨函数
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0248)     RLS_DS18B20;     //释放总线
(0249)     delayUs(1);         //2.71us(大于1us就行了)
(0250) 	*/
(0251)   }
(0252) }
(0253) 
(0254) //////////////////////////////////////////////////////////
(0255) 
(0256) /*******************************************************************************
(0257) functionName: unsigned int readTempDS18B20(void)
(0258) description :读DS18B20温度
(0259) ********************************************************************************/
(0260) unsigned int readTempDS18B20(void)
(0261) {
(0262)   uint8 tempL,tempH;
(0263)   uint16 x;
(0264)   resetDS18B20();
      F2 DF79      RCALL	_resetDS18B20
(0265)   writeuint8DS18B20(0xcc);   //跳过ROM
      F3 EC0C      LDI	R16,0xCC
      F4 DFE8      RCALL	_writeuint8DS18B20
(0266)   writeuint8DS18B20(0x44);     //启动温度转换
      F5 E404      LDI	R16,0x44
      F6 DFE6      RCALL	_writeuint8DS18B20
(0267)   delayUs(1);
      F7 E001      LDI	R16,1
      F8 DF5E      RCALL	_delayUs
(0268)   resetDS18B20();
      F9 DF72      RCALL	_resetDS18B20
(0269)   writeuint8DS18B20(0xcc);     //跳过ROM
      FA EC0C      LDI	R16,0xCC
      FB DFE1      RCALL	_writeuint8DS18B20
(0270)   writeuint8DS18B20(0xbe);     //读数据
      FC EB0E      LDI	R16,0xBE
      FD DFDF      RCALL	_writeuint8DS18B20
(0271)   tempL=readuint8DS18B20();
      FE DFC8      RCALL	_readuint8DS18B20
      FF 2EA0      MOV	R10,R16
(0272)   tempH=readuint8DS18B20();
     100 DFC6      RCALL	_readuint8DS18B20
     101 2EC0      MOV	R12,R16
(0273)   x=(tempH<<8)|tempL;
     102 2CBC      MOV	R11,R12
(0274)   return(x);
     103 0185      MOVW	R16,R10
     104 940C 0328 JMP	pop_xgset003C
_USART_Init:
  tmp                  --> R10
  baud                 --> R10
     106 940E 034D CALL	push_xgsetF00C
     108 0158      MOVW	R10,R16
(0275) }
(0276) 
(0277) /*******************************************************************************
(0278) 串口操作相关函数
(0279) *******************************************************************************/
(0280) 
(0281) void USART_Init( unsigned int baud )
(0282) {
(0283) unsigned int tmp;
(0284) /* 设置波特率*/
(0285) tmp= F_CPU/baud/16-1;
     109 0115      MOVW	R2,R10
     10A 2444      CLR	R4
     10B 2455      CLR	R5
     10C E040      LDI	R20,0
     10D E850      LDI	R21,0x80
     10E E760      LDI	R22,0x70
     10F E070      LDI	R23,0
     110 925A      ST	R5,-Y
     111 924A      ST	R4,-Y
     112 923A      ST	R3,-Y
     113 922A      ST	R2,-Y
     114 018A      MOVW	R16,R20
     115 019B      MOVW	R18,R22
     116 940E 02C4 CALL	div32s
     118 E140      LDI	R20,0x10
     119 E050      LDI	R21,0
     11A E060      LDI	R22,0
     11B E070      LDI	R23,0
     11C 937A      ST	R23,-Y
     11D 936A      ST	R22,-Y
     11E 935A      ST	R21,-Y
     11F 934A      ST	R20,-Y
     120 940E 02C4 CALL	div32s
     122 0118      MOVW	R2,R16
     123 0129      MOVW	R4,R18
     124 E041      LDI	R20,1
     125 E050      LDI	R21,0
     126 E060      LDI	R22,0
     127 E070      LDI	R23,0
     128 1A24      SUB	R2,R20
     129 0A35      SBC	R3,R21
     12A 0A46      SBC	R4,R22
     12B 0A57      SBC	R5,R23
     12C 0151      MOVW	R10,R2
(0286) UBRRH = (unsigned char)(tmp>>8);
     12D 2C23      MOV	R2,R3
     12E 2433      CLR	R3
     12F BC20      OUT	0x20,R2
(0287) UBRRL = (unsigned char)tmp;
     130 B8A9      OUT	0x09,R10
(0288) /* 接收器与发送器使能*/
(0289) UCSRB = (1<<RXEN)|(1<<TXEN);
     131 E188      LDI	R24,0x18
     132 B98A      OUT	0x0A,R24
(0290) /* 设置帧格式: 8 个数据位, 2 个停止位*/
(0291) UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
     133 E88E      LDI	R24,0x8E
     134 BD80      OUT	0x20,R24
     135 940C 0354 JMP	pop_xgsetF00C
(0292) }
(0293) 
(0294) // 数据发送【发送5 到8 位数据位的帧】
(0295) void USART_Transmit( unsigned char data )
(0296) {
(0297) /* 等待发送缓冲器为空 */
(0298) while ( !( UCSRA & (1<<UDRE)) )
_USART_Transmit:
  data                 --> R16
     137 9B5D      SBIS	0x0B,5
     138 CFFE      RJMP	_USART_Transmit
(0299) ;
(0300) /* 将数据放入缓冲器,发送数据 */
(0301) UDR = data;
     139 B90C      OUT	0x0C,R16
     13A 9508      RET
_read_rom:
  end_flag             --> R10
  num2                 --> Y,+10
  chr                  --> R12
  flag                 --> Y,+0
  flag_count           --> R20
  num                  --> Y,+20
  i                    --> R22
  retVal               --> Y,+19
  temp                 --> Y,+18
     13B 940E 0338 CALL	push_xgsetF0FC
     13D 9765      SBIW	R28,0x15
(0302) } 
(0303) 
(0304) 
(0305) 
(0306) unsigned char read_rom(void){
(0307)  unsigned char i;
(0308)  unsigned char num=0;
     13E 2400      CLR	R0
     13F 8A0C      STD	Y+20,R0
(0309)  unsigned char num2[8];
(0310)  unsigned char retVal=0;
     140 8A0B      STD	Y+19,R0
(0311)  unsigned char temp=0;
     141 8A0A      STD	Y+18,R0
(0312)  unsigned char chr;
(0313)  unsigned char flag[10];
(0314)  unsigned char flag_count=0;
     142 2744      CLR	R20
(0315)  unsigned char end_flag=0; 
     143 24AA      CLR	R10
(0316)  B20_num=0;
     144 2422      CLR	R2
     145 9220 00A6 STS	B20_num,R2
(0317)  
(0318)  do{
(0319)  flag_count=0;
     147 2744      CLR	R20
(0320)  end_flag=0;
     148 24AA      CLR	R10
(0321)  i=resetDS18B20();
     149 DF22      RCALL	_resetDS18B20
     14A 2F60      MOV	R22,R16
(0322)  writeuint8DS18B20(0xf0);   
     14B EF00      LDI	R16,0xF0
     14C DF90      RCALL	_writeuint8DS18B20
(0323)  RLS_DS18B20;     //释放总线
     14D 98D0      CBI	0x1A,0
(0324)  for(chr=0;chr<8;chr++){
     14E 24CC      CLR	R12
     14F C04D      RJMP	0x019D
(0325)  num=0;
     150 2400      CLR	R0
     151 8A0C      STD	Y+20,R0
(0326)  for(i=0;i<8;i++){
     152 2766      CLR	R22
     153 C03D      RJMP	0x0191
(0327)     num=num>>1;
     154 880C      LDD	R0,Y+20
     155 9406      LSR	R0
     156 8A0C      STD	Y+20,R0
(0328)     retVal=0;
     157 2400      CLR	R0
     158 8A0B      STD	Y+19,R0
(0329) 	temp=0;
     159 8A0A      STD	Y+18,R0
(0330)     
(0331)     temp=read_a_bit();
     15A DF4D      RCALL	_read_a_bit
     15B 8B0A      STD	Y+18,R16
(0332) 	if(temp)
     15C 2E00      MOV	R0,R16
     15D 2300      TST	R16
     15E F019      BEQ	0x0162
(0333) 	retVal|=0x01;
     15F 898B      LDD	R24,Y+19
     160 6081      ORI	R24,1
     161 8B8B      STD	Y+19,R24
(0334) 	retVal<<=1;
     162 880B      LDD	R0,Y+19
     163 0C00      LSL	R0
     164 8A0B      STD	Y+19,R0
(0335) 	temp=0;
     165 2400      CLR	R0
     166 8A0A      STD	Y+18,R0
(0336) 
(0337) 	temp=read_a_bit();
     167 DF40      RCALL	_read_a_bit
     168 2EE0      MOV	R14,R16
     169 8AEA      STD	Y+18,R14
(0338) 	if(temp)
     16A 2C0E      MOV	R0,R14
     16B 2300      TST	R16
     16C F019      BEQ	0x0170
(0339) 	retVal|=0x01;
     16D 898B      LDD	R24,Y+19
     16E 6081      ORI	R24,1
     16F 8B8B      STD	Y+19,R24
(0340)     
(0341) 	if(retVal==bit_1){        //1
     170 898B      LDD	R24,Y+19
     171 3082      CPI	R24,2
     172 F431      BNE	0x0179
(0342) 	write_a_bit(1);
     173 E001      LDI	R16,1
     174 DF1F      RCALL	_write_a_bit
(0343) 	num|=0x80;
     175 898C      LDD	R24,Y+20
     176 6880      ORI	R24,0x80
     177 8B8C      STD	Y+20,R24
(0344) 	}
     178 C017      RJMP	0x0190
(0345) 	else if(retVal==bit_0){    //0
     179 898B      LDD	R24,Y+19
     17A 3081      CPI	R24,1
     17B F419      BNE	0x017F
(0346) 	    
(0347) 	    write_a_bit(0);
     17C 2700      CLR	R16
     17D DF16      RCALL	_write_a_bit
(0348) 	}else {              //maybe o or 1
     17E C011      RJMP	0x0190
(0349) 	    if(flag[flag_count]==0){
     17F 01CE      MOVW	R24,R28
     180 2FE4      MOV	R30,R20
     181 27FF      CLR	R31
     182 0FE8      ADD	R30,R24
     183 1FF9      ADC	R31,R25
     184 8020      LDD	R2,Z+0
     185 2022      TST	R2
     186 F419      BNE	0x018A
(0350) 		write_a_bit(0);
     187 2700      CLR	R16
     188 DF0B      RCALL	_write_a_bit
(0351) 		
(0352) 		}
     189 C005      RJMP	0x018F
(0353) 		else{
(0354) 		write_a_bit(0x01);
     18A E001      LDI	R16,1
     18B DF08      RCALL	_write_a_bit
(0355) 		num|=0x80;
     18C 898C      LDD	R24,Y+20
     18D 6880      ORI	R24,0x80
     18E 8B8C      STD	Y+20,R24
(0356) 		
(0357) 		}
(0358) 		flag_count++;
     18F 9543      INC	R20
     190 9563      INC	R22
     191 3068      CPI	R22,0x8
     192 F408      BCC	0x0194
     193 CFC0      RJMP	0x0154
(0359) 		
(0360) 	}
(0361) 	
(0362) 	
(0363)  }
(0364)   num2[chr]=num; 
     194 01CE      MOVW	R24,R28
     195 960A      ADIW	R24,0xA
     196 2DEC      MOV	R30,R12
     197 27FF      CLR	R31
     198 0FE8      ADD	R30,R24
     199 1FF9      ADC	R31,R25
     19A 880C      LDD	R0,Y+20
     19B 8200      STD	Z+0,R0
     19C 94C3      INC	R12
     19D 2D8C      MOV	R24,R12
     19E 3088      CPI	R24,0x8
     19F F408      BCC	0x01A1
     1A0 CFAF      RJMP	0x0150
(0365)  
(0366)   
(0367)  }
(0368)    for(i=0;i<8;i++){
     1A1 2766      CLR	R22
     1A2 C022      RJMP	0x01C5
(0369)    USART_Transmit(num2[i]);
     1A3 01CE      MOVW	R24,R28
     1A4 960A      ADIW	R24,0xA
     1A5 2FE6      MOV	R30,R22
     1A6 27FF      CLR	R31
     1A7 0FE8      ADD	R30,R24
     1A8 1FF9      ADC	R31,R25
     1A9 8100      LDD	R16,Z+0
     1AA DF8C      RCALL	_USART_Transmit
(0370)    rom_seq[B20_num][i]=num2[i];
     1AB EA87      LDI	R24,0xA7
     1AC E090      LDI	R25,0
     1AD 9020 00A6 LDS	R2,B20_num
     1AF 2433      CLR	R3
     1B0 0C22      LSL	R2
     1B1 1C33      ROL	R3
     1B2 0C22      LSL	R2
     1B3 1C33      ROL	R3
     1B4 0C22      LSL	R2
     1B5 1C33      ROL	R3
     1B6 0E28      ADD	R2,R24
     1B7 1E39      ADC	R3,R25
     1B8 2FE6      MOV	R30,R22
     1B9 27FF      CLR	R31
     1BA 0DE2      ADD	R30,R2
     1BB 1DF3      ADC	R31,R3
     1BC 01CE      MOVW	R24,R28
     1BD 960A      ADIW	R24,0xA
     1BE 2FA6      MOV	R26,R22
     1BF 27BB      CLR	R27
     1C0 0FA8      ADD	R26,R24
     1C1 1FB9      ADC	R27,R25
     1C2 902C      LD	R2,10(X)
     1C3 8220      STD	Z+0,R2
     1C4 9563      INC	R22
     1C5 3068      CPI	R22,0x8
     1C6 F2E0      BCS	0x01A3
(0371)    } 
(0372)    B20_num++; 
     1C7 9180 00A6 LDS	R24,B20_num
     1C9 5F8F      SUBI	R24,0xFF
     1CA 9380 00A6 STS	B20_num,R24
(0373)    for(i=0;i<flag_count;i++){
     1CC 2766      CLR	R22
     1CD C00A      RJMP	0x01D8
(0374)    if(flag[i]==1)end_flag++;
     1CE 01CE      MOVW	R24,R28
     1CF 2FE6      MOV	R30,R22
     1D0 27FF      CLR	R31
     1D1 0FE8      ADD	R30,R24
     1D2 1FF9      ADC	R31,R25
     1D3 8180      LDD	R24,Z+0
     1D4 3081      CPI	R24,1
     1D5 F409      BNE	0x01D7
     1D6 94A3      INC	R10
     1D7 9563      INC	R22
     1D8 1764      CP	R22,R20
     1D9 F3A0      BCS	0x01CE
(0375)    
(0376)    }
(0377)   
(0378)    if(end_flag==flag_count)
     1DA 16A4      CP	R10,R20
     1DB F429      BNE	0x01E1
(0379)    {
(0380)      flag_count=0xff;
     1DC EF4F      LDI	R20,0xFF
(0381)      USART_Transmit(0xff);
     1DD EF0F      LDI	R16,0xFF
     1DE DF58      RCALL	_USART_Transmit
(0382) 	 return 0;
     1DF 2700      CLR	R16
     1E0 C037      RJMP	0x0218
(0383) 	 }
(0384)    
(0385)    
(0386)    
(0387)    if(flag_count>0&&flag_count!=0xff){    //has bentch
     1E1 E080      LDI	R24,0
     1E2 1784      CP	R24,R20
     1E3 F008      BCS	0x01E5
     1E4 C030      RJMP	0x0215
     1E5 3F4F      CPI	R20,0xFF
     1E6 F409      BNE	0x01E8
     1E7 C02D      RJMP	0x0215
(0388)       flag_count--;  //flag_count point to the next one
     1E8 954A      DEC	R20
(0389)       if(flag[flag_count]==0){
     1E9 01CE      MOVW	R24,R28
     1EA 2FE4      MOV	R30,R20
     1EB 27FF      CLR	R31
     1EC 0FE8      ADD	R30,R24
     1ED 1FF9      ADC	R31,R25
     1EE 8020      LDD	R2,Z+0
     1EF 2022      TST	R2
     1F0 F491      BNE	0x0203
(0390)           flag[flag_count]=1;
     1F1 01CE      MOVW	R24,R28
     1F2 2FE4      MOV	R30,R20
     1F3 27FF      CLR	R31
     1F4 0FE8      ADD	R30,R24
     1F5 1FF9      ADC	R31,R25
     1F6 E081      LDI	R24,1
     1F7 8380      STD	Z+0,R24
(0391) 	  }
     1F8 C01C      RJMP	0x0215
(0392) 	  else{
(0393) 	       while((flag[flag_count]==1)&&(flag_count>0)){
(0394) 	             flag[flag_count--]=0;
     1F9 2F64      MOV	R22,R20
     1FA 2777      CLR	R23
     1FB 5041      SUBI	R20,1
     1FC 01CE      MOVW	R24,R28
     1FD 2FE6      MOV	R30,R22
     1FE 27FF      CLR	R31
     1FF 0FE8      ADD	R30,R24
     200 1FF9      ADC	R31,R25
     201 2422      CLR	R2
     202 8220      STD	Z+0,R2
     203 01CE      MOVW	R24,R28
     204 2FE4      MOV	R30,R20
     205 27FF      CLR	R31
     206 0FE8      ADD	R30,R24
     207 1FF9      ADC	R31,R25
     208 8180      LDD	R24,Z+0
     209 3081      CPI	R24,1
     20A F419      BNE	0x020E
     20B E080      LDI	R24,0
     20C 1784      CP	R24,R20
     20D F358      BCS	0x01F9
(0395) 	       }
(0396) 	       flag[flag_count]=1; 
     20E 01CE      MOVW	R24,R28
     20F 2FE4      MOV	R30,R20
     210 27FF      CLR	R31
     211 0FE8      ADD	R30,R24
     212 1FF9      ADC	R31,R25
     213 E081      LDI	R24,1
     214 8380      STD	Z+0,R24
(0397) 
(0398) 	
(0399) 	  }
(0400) 	
(0401)    }
(0402) 
(0403)   }while(flag_count!=0xff);
     215 3F4F      CPI	R20,0xFF
     216 F009      BEQ	0x0218
     217 CF2F      RJMP	0x0147
     218 9665      ADIW	R28,0x15
     219 940C 032D JMP	pop_xgsetF0FC
_match_rom:
  k                    --> R20
  num                  --> R10
     21B 92AA      ST	R10,-Y
     21C 934A      ST	R20,-Y
     21D 2EA0      MOV	R10,R16
(0404) 
(0405) }
(0406) 
(0407) void match_rom(unsigned char num){

⌨️ 快捷键说明

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