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

📄 ds18b20.lst

📁 利用AVRM16和DX18B20温度传感器通信
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0207) 	delayUs(255);		//209.42us
    00FF EF0F      LDI	R16,0xFF
    0100 DFEF      RCALL	_delayUs
(0208) 	delayUs(255);		//83.28us
    0101 EF0F      LDI	R16,0xFF
    0102 DFED      RCALL	_delayUs
(0209) 	//以上的三个延时大于480us
(0210) 	RLS_DS18B20;		//释放总线,总线自动上拉
    0103 98B9      CBI	0x17,1
(0211) 	_NOP();			
    0104 0000      NOP
    0105 C008      RJMP	0x010E
(0212) 	while(STU_DS18B20)	
(0213) 	{
(0214) 		delayUs(5); 	//5.15us
    0106 E005      LDI	R16,5
    0107 DFE8      RCALL	_delayUs
(0215) 		errTime++;
    0108 9543      INC	R20
(0216) 		if(errTime>20)
    0109 E184      LDI	R24,0x14
    010A 1784      CP	R24,R20
    010B F410      BCC	0x010E
(0217) 		return(0x00);		//如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
    010C 2700      CLR	R16
    010D C00F      RJMP	0x011D
    010E 99B1      SBIC	0x16,1
    010F CFF6      RJMP	0x0106
(0218) 	}
(0219) 	errTime=0;
    0110 2744      CLR	R20
    0111 C008      RJMP	0x011A
(0220) 	while(!(STU_DS18B20))	
(0221) 	{   
(0222) 		delayUs(5);	 	//5.15us
    0112 E005      LDI	R16,5
    0113 DFDC      RCALL	_delayUs
(0223) 		errTime++;
    0114 9543      INC	R20
(0224) 		if(errTime>50)
    0115 E382      LDI	R24,0x32
    0116 1784      CP	R24,R20
    0117 F410      BCC	0x011A
(0225) 		return(0x00);		//如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
    0118 2700      CLR	R16
    0119 C003      RJMP	0x011D
    011A 9BB1      SBIS	0x16,1
    011B CFF6      RJMP	0x0112
(0226) 	}
(0227) 	return(0xff);
    011C EF0F      LDI	R16,0xFF
    011D 940E02D9  CALL	pop_gset1
    011F 9508      RET
_readByteDS18B20:
  retVal               --> R20
  i                    --> R22
    0120 940E02D4  CALL	push_gset2
(0228) }
(0229) 
(0230) 
(0231) /**********************************************************************
(0232) functionName: BYTE readByteDS18B20(void)
(0233) description :读DS18B20一个字节2
(0234) **********************************************************************/
(0235) unsigned char readByteDS18B20(void)
(0236) {
(0237) 	unsigned char i;
(0238) 	unsigned char retVal=0;
    0122 2744      CLR	R20
(0239) 	RLS_DS18B20;		//释放总线
    0123 98B9      CBI	0x17,1
(0240) 	for(i=8;i>0;i--)
    0124 E068      LDI	R22,0x8
    0125 C01A      RJMP	0x0140
(0241) 	{
(0242) 	 	retVal>>=1;
    0126 9546      LSR	R20
(0243) 	    HLD_DS18B20;	//Maga16控制总线
    0127 9AB9      SBI	0x17,1
(0244) 		CLR_DS18B20;	//强制拉低
    0128 98C1      CBI	0x18,1
(0245) 		NOP();
    0129 0000      NOP
(0246) 	   	NOP();
    012A 0000      NOP
(0247) 	   	NOP();
    012B 0000      NOP
(0248) 	   	NOP();
    012C 0000      NOP
(0249) 	   	NOP();
    012D 0000      NOP
(0250) 		NOP();
    012E 0000      NOP
(0251) 		NOP();	
    012F 0000      NOP
(0252) 		NOP();			//延时大于1us	
    0130 0000      NOP
(0253) 		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
    0131 98B9      CBI	0x17,1
(0254) 		NOP();
    0132 0000      NOP
(0255) 		NOP();
    0133 0000      NOP
(0256) 		NOP();
    0134 0000      NOP
(0257) 		if(STU_DS18B20)
    0135 9BB1      SBIS	0x16,1
    0136 C001      RJMP	0x0138
(0258) 		retVal|=0x80;
    0137 6840      ORI	R20,0x80
(0259) 	
(0260) 		
(0261) 		delayUs(20);	 	//14.92us
    0138 E104      LDI	R16,0x14
    0139 DFB6      RCALL	_delayUs
(0262) 	    delayUs(30);	 	//14.92us
    013A E10E      LDI	R16,0x1E
    013B DFB4      RCALL	_delayUs
(0263) 		RLS_DS18B20;		//释放总线
    013C 98B9      CBI	0x17,1
(0264) 		delayUs(45);	 	//30.38us
    013D E20D      LDI	R16,0x2D
    013E DFB1      RCALL	_delayUs
    013F 956A      DEC	R22
    0140 2422      CLR	R2
    0141 1626      CP	R2,R22
    0142 F318      BCS	0x0126
(0265) 		
(0266) 	}
(0267) 	delayUs(1);	 		//2.71us(大于1us就行了)
    0143 E001      LDI	R16,1
    0144 DFAB      RCALL	_delayUs
(0268) 	return(retVal);
    0145 2F04      MOV	R16,R20
    0146 940E02C5  CALL	pop_gset2
    0148 9508      RET
_writeByteDS18B20:
  temp                 --> R20
  i                    --> R22
  wb                   --> R10
    0149 940E02D2  CALL	push_gset3
    014B 2EA0      MOV	R10,R16
(0269) }
(0270) 
(0271) 
(0272) /**********************************************************************
(0273) functionName: BYTE readByteDS18B20(void)
(0274) description :写DS18B20一个字节
(0275) **********************************************************************/
(0276) void writeByteDS18B20(unsigned char wb)
(0277) {
(0278) 	unsigned char i;
(0279) 	unsigned char temp;
(0280) 	RLS_DS18B20;		//释放总线
    014C 98B9      CBI	0x17,1
(0281) 	for(i=0;i<8;i++)
    014D 2766      CLR	R22
    014E C016      RJMP	0x0165
(0282) 	{
(0283) 		HLD_DS18B20;		//Maga16控制总线
    014F 9AB9      SBI	0x17,1
(0284) 		CLR_DS18B20;		//强制拉低
    0150 98C1      CBI	0x18,1
(0285) 		delayUs(16);	 	//14.92us
    0151 E100      LDI	R16,0x10
    0152 DF9D      RCALL	_delayUs
(0286) 		temp=wb>>i;
    0153 2D0A      MOV	R16,R10
    0154 2F16      MOV	R17,R22
    0155 940E030A  CALL	lsr8
    0157 2F40      MOV	R20,R16
(0287) 		temp&=0x01;
    0158 7041      ANDI	R20,1
(0288) 		if(temp)
    0159 F011      BEQ	0x015C
(0289) 		RLS_DS18B20;		//释放总线
    015A 98B9      CBI	0x17,1
    015B C001      RJMP	0x015D
(0290) 		else
(0291) 		CLR_DS18B20;		//强制拉低
    015C 98C1      CBI	0x18,1
(0292) 		delayUs(16);	 	//14.92us
    015D E100      LDI	R16,0x10
    015E DF91      RCALL	_delayUs
(0293) 		delayUs(35);	 	//30.38us
    015F E203      LDI	R16,0x23
    0160 DF8F      RCALL	_delayUs
(0294) 		RLS_DS18B20;		//释放总线
    0161 98B9      CBI	0x17,1
(0295) 		delayUs(1);	 		//2.71us(大于1us就行了)
    0162 E001      LDI	R16,1
    0163 DF8C      RCALL	_delayUs
    0164 9563      INC	R22
    0165 3068      CPI	R22,0x8
    0166 F340      BCS	0x014F
    0167 940E02C8  CALL	pop_gset3
    0169 9508      RET
_readTempDS18B20:
  x                    --> R20
  tempH                --> R20
  tempL                --> R22
    016A 940E02D4  CALL	push_gset2
(0296) 	}
(0297) }
(0298) 
(0299) 
(0300) /**********************************************************************
(0301) functionName: unsigned int readTempDS18B20(void)
(0302) description :读DS18B20温度
(0303) **********************************************************************/
(0304) unsigned int readTempDS18B20(void)
(0305) {
(0306) 	unsigned char tempL,tempH;
(0307) 	unsigned int x;
(0308) 	resetDS18B20();
    016C DF89      RCALL	_resetDS18B20
(0309) 	writeByteDS18B20(0xcc); 	//跳过ROM
    016D EC0C      LDI	R16,0xCC
    016E DFDA      RCALL	_writeByteDS18B20
(0310) 	writeByteDS18B20(0x44);		//启动温度转换
    016F E404      LDI	R16,0x44
    0170 DFD8      RCALL	_writeByteDS18B20
(0311) 	delayUs(1);
    0171 E001      LDI	R16,1
    0172 DF7D      RCALL	_delayUs
(0312) 	tempL=resetDS18B20();
    0173 DF82      RCALL	_resetDS18B20
(0313) 	writeByteDS18B20(0xcc);		//跳过ROM
    0174 EC0C      LDI	R16,0xCC
    0175 DFD3      RCALL	_writeByteDS18B20
(0314) 	writeByteDS18B20(0xbe);		//读数据
    0176 EB0E      LDI	R16,0xBE
    0177 DFD1      RCALL	_writeByteDS18B20
(0315) 	tempL=readByteDS18B20();
    0178 DFA7      RCALL	_readByteDS18B20
    0179 2F60      MOV	R22,R16
(0316) 	tempH=readByteDS18B20();
    017A DFA5      RCALL	_readByteDS18B20
    017B 2F40      MOV	R20,R16
(0317) 	x=(tempH<<8)|tempL;
    017C 2F54      MOV	R21,R20
    017D 2F46      MOV	R20,R22
(0318) 	return(x);
    017E 018A      MOVW	R16,R20
    017F 940E02C5  CALL	pop_gset2
    0181 9508      RET
_realTemp:
  Temp                 --> Y+0
    0182 9724      SBIW	R28,4
(0319) } 
(0320) 
(0321) 
(0322) /******************************************************************************
(0323) * 名称:float realTemp(void)
(0324) * 说明:倍率为0.0625
(0325) * 功能:计算真实温度值
(0326) * 调用:unsigned int readTempDS18B20(void)
(0327) * 输入:无
(0328) * 返回值:真实温度值(浮点数)
(0329) *******************************************************************************/
(0330) float realTemp(void)
(0331) {
(0332) float Temp= readTempDS18B20()*0.0625;
    0183 DFE6      RCALL	_readTempDS18B20
    0184 0118      MOVW	R2,R16
    0185 E604      LDI	R16,0x64
    0186 E010      LDI	R17,0
    0187 940E02F6  CALL	lpm32
    0189 933A      ST	R19,-Y
    018A 932A      ST	R18,-Y
    018B 931A      ST	R17,-Y
    018C 930A      ST	R16,-Y
    018D E600      LDI	R16,0x60
    018E E010      LDI	R17,0
    018F 940E02F6  CALL	lpm32
    0191 933A      ST	R19,-Y
    0192 932A      ST	R18,-Y
    0193 931A      ST	R17,-Y
    0194 930A      ST	R16,-Y
    0195 0181      MOVW	R16,R2
    0196 9516      LSR	R17
    0197 9507      ROR	R16
    0198 940E0358  CALL	int2fp
    019A 933A      ST	R19,-Y
    019B 932A      ST	R18,-Y
    019C 931A      ST	R17,-Y
    019D 930A      ST	R16,-Y
    019E 940E0444  CALL	empy32fs
    01A0 0181      MOVW	R16,R2
    01A1 7001      ANDI	R16,1
    01A2 7010      ANDI	R17,0
    01A3 940E0358  CALL	int2fp
    01A5 933A      ST	R19,-Y
    01A6 932A      ST	R18,-Y
    01A7 931A      ST	R17,-Y
    01A8 930A      ST	R16,-Y
    01A9 940E03B2  CALL	add32fs
    01AB 940E0447  CALL	empy32f
    01AD 01FE      MOVW	R30,R28
    01AE 8300      STD	Z+0,R16
    01AF 8311      STD	Z+1,R17
    01B0 8322      STD	Z+2,R18
    01B1 8333      STD	Z+3,R19
(0333) return Temp;
    01B2 01FE      MOVW	R30,R28
    01B3 8100      LDD	R16,Z+0
    01B4 8111      LDD	R17,Z+1
    01B5 8122      LDD	R18,Z+2
    01B6 8133      LDD	R19,Z+3
    01B7 9624      ADIW	R28,4
    01B8 9508      RET
_displayTemp:
  l                    --> Y+3
  T                    --> Y+2
  temp                 --> R10
  num                  --> Y+19
  j                    --> R22
  i                    --> R20
    01B9 940E02D0  CALL	push_gset4
    01BB 2F62      MOV	R22,R18
    01BC 2F40      MOV	R20,R16
    01BD 972B      SBIW	R28,0xB
(0334) }
(0335) 
(0336) 
(0337) /******************************************************************************
(0338) * 名称:displayTemp
(0339) * 说明:num为真实温度值,i列.j为行,
(0340) * 功能:显示温度值
(0341) * 调用:LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0342) * 输入:真实温度值
(0343) * 返回值:无
(0344) *******************************************************************************/
(0345) displayTemp( unsigned char i,unsigned char j, float num)//LCD显示
(0346) {unsigned char T[5] ,l;
(0347)  unsigned int temp=num*100;
    01BE E50C      LDI	R16,0x5C
    01BF E010      LDI	R17,0
    01C0 940E02F6  CALL	lpm32
    01C2 933A      ST	R19,-Y
    01C3 932A      ST	R18,-Y
    01C4 931A      ST	R17,-Y
    01C5 930A      ST	R16,-Y
    01C6 01FE      MOVW	R30,R28
    01C7 8827      LDD	R2,Z+23
    01C8 8C30      LDD	R3,Z+24
    01C9 8C41      LDD	R4,Z+25
    01CA 8C52      LDD	R5,Z+26
    01CB 925A      ST	R5,-Y
    01CC 924A      ST	R4,-Y
    01CD 923A      ST	R3,-Y
    01CE 922A      ST	R2,-Y
    01CF 940E0447  CALL	empy32f
    01D1 01FE      MOVW	R30,R28
    01D2 8307      STD	Z+7,R16
    01D3 8710      STD	Z+8,R17
    01D4 8721      STD	Z+9,R18
    01D5 8732      STD	Z+10,R19
    01D6 01FE      MOVW	R30,R28
    01D7 8027      LDD	R2,Z+7
    01D8 8430      LDD	R3,Z+8
    01D9 8441      LDD	R4,Z+9
    01DA 8452      LDD	R5,Z+10
    01DB 925A      ST	R5,-Y
    01DC 924A      ST	R4,-Y
    01DD 923A      ST	R3,-Y
    01DE 922A      ST	R2,-Y
    01DF E508      LDI	R16,0x58
    01E0 E010      LDI	R17,0
    01E1 940E02F6  CALL	lpm32
    01E3 933A      ST	R19,-Y
    01E4 932A      ST	R18,-Y
    01E5 931A      ST	R17,-Y
    01E6 930A      ST	R16,-Y
    01E7 940E0413  CALL	cmp32f
    01E9 F0D4      BLT	0x0204
    01EA 01FE      MOVW	R30,R28
    01EB 8027      LDD	R2,Z+7
    01EC 8430      LDD	R3,Z+8
    01ED 8441      LDD	R4,Z+9
    01EE 8452      LDD	R5,Z+10
    01EF 925A      ST	R5,-Y
    01F0 924A      ST	R4,-Y
    01F1 923A      ST	R3,-Y
    01F2 922A      ST	R2,-Y
    01F3 E508      LDI	R16,0x58
    01F4 E010      LDI	R17,0
    01F5 940E02F6  CALL	lpm32
    01F7 933A      ST	R19,-Y
    01F8 932A      ST	R18,-Y
    01F9 931A      ST	R17,-Y
    01FA 930A      ST	R16,-Y
    01FB 940E03BD  CALL	sub32f
    01FD 940E0310  CALL	fp2int
    01FF 01C8      MOVW	R24,R16
    0200 5080      SUBI	R24,0
    0201 4890      SBCI	R25,0x80
    0202 016C      MOVW	R12,R24
    0203 C008      RJMP	0x020C
    0204 01FE      MOVW	R30,R28
    0205 8107      LDD	R16,Z+7
    0206 8510      LDD	R17,Z+8
    0207 8521      LDD	R18,Z+9
    0208 8532      LDD	R19,Z+10
    0209 940E0310  CALL	fp2int
    020B 0168      MOVW	R12,R16
    020C 0156      MOVW	R10,R12
(0348)  T[0]='0'+temp/1000;
    020D EE28      LDI	R18,0xE8
    020E E033      LDI	R19,3
    020F 0185      MOVW	R16,R10
    0210 940E02AB  CALL	div16u
    0212 01C8      MOVW	R24,R16
    0213 96C0      ADIW	R24,0x30

⌨️ 快捷键说明

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