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

📄 main.lss

📁 DS18B20最全驱动.包含CRC8算法.ROM Search等.主机采用AVR mega16或者mega32.原创作品.
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 272:	f1 e0       	ldi	r31, 0x01	; 1
	unsigned char temp;
	unsigned char n;
	unsigned char OneWireData=0;
	for(n=0;n<8;n++)
	{
		OneWirePORT	&=~(1<<DS18B20);
 274:	d8 98       	cbi	0x1b, 0	; 27
		OneWirePORT	|= (1<<DS18B20);
 276:	d8 9a       	sbi	0x1b, 0	; 27
		OneWireDDR	&=~(1<<DS18B20);
 278:	d0 98       	cbi	0x1a, 0	; 26
		temp=(OneWirePIN&(1<<DS18B20));		//读数据,从低位开始
		if(temp)OneWireData	|= (1<<n);
 27a:	c8 9b       	sbis	0x19, 0	; 25
 27c:	09 c0       	rjmp	.+18     	; 0x290 <ReadOneWire+0x2a>
 27e:	cb 01       	movw	r24, r22
 280:	02 2e       	mov	r0, r18
 282:	02 c0       	rjmp	.+4      	; 0x288 <ReadOneWire+0x22>
 284:	88 0f       	add	r24, r24
 286:	99 1f       	adc	r25, r25
 288:	0a 94       	dec	r0
 28a:	e2 f7       	brpl	.-8      	; 0x284 <ReadOneWire+0x1e>
 28c:	48 2b       	or	r20, r24
 28e:	09 c0       	rjmp	.+18     	; 0x2a2 <ReadOneWire+0x3c>
		else OneWireData	&=~(1<<n);
 290:	cb 01       	movw	r24, r22
 292:	02 2e       	mov	r0, r18
 294:	02 c0       	rjmp	.+4      	; 0x29a <ReadOneWire+0x34>
 296:	88 0f       	add	r24, r24
 298:	99 1f       	adc	r25, r25
 29a:	0a 94       	dec	r0
 29c:	e2 f7       	brpl	.-8      	; 0x296 <ReadOneWire+0x30>
 29e:	80 95       	com	r24
 2a0:	48 23       	and	r20, r24
 2a2:	cf 01       	movw	r24, r30
 2a4:	01 97       	sbiw	r24, 0x01	; 1
 2a6:	f1 f7       	brne	.-4      	; 0x2a4 <ReadOneWire+0x3e>
		_delay_us(120);				//60~120us
		OneWireDDR	|= (1<<DS18B20);
 2a8:	d0 9a       	sbi	0x1a, 0	; 26
 2aa:	2f 5f       	subi	r18, 0xFF	; 255
 2ac:	3f 4f       	sbci	r19, 0xFF	; 255
unsigned char ReadOneWire(void)
{
	unsigned char temp;
	unsigned char n;
	unsigned char OneWireData=0;
	for(n=0;n<8;n++)
 2ae:	28 30       	cpi	r18, 0x08	; 8
 2b0:	31 05       	cpc	r19, r1
 2b2:	01 f7       	brne	.-64     	; 0x274 <ReadOneWire+0xe>
		else OneWireData	&=~(1<<n);
		_delay_us(120);				//60~120us
		OneWireDDR	|= (1<<DS18B20);
	}
	return OneWireData;
}
 2b4:	84 2f       	mov	r24, r20
 2b6:	08 95       	ret

000002b8 <ReadOneWireID>:
	OneWirePORT	|= (1<<DS18B20);
	_delay_us(240);			//60~240us
}

void ReadOneWireID(void)
{
 2b8:	cf 93       	push	r28
 2ba:	df 93       	push	r29
	unsigned char i;
	OneWireInit();
 2bc:	0e 94 e5 00 	call	0x1ca	; 0x1ca <OneWireInit>
	WriteOneWire(0x33);		//ReadROM(读ROM) [33h]
 2c0:	83 e3       	ldi	r24, 0x33	; 51
 2c2:	0e 94 13 01 	call	0x226	; 0x226 <WriteOneWire>
 2c6:	c0 e0       	ldi	r28, 0x00	; 0
 2c8:	d0 e0       	ldi	r29, 0x00	; 0
	for(i=0;i<8;i++)
	{
		OneWireID[i]=ReadOneWire();
 2ca:	0e 94 33 01 	call	0x266	; 0x266 <ReadOneWire>
 2ce:	fe 01       	movw	r30, r28
 2d0:	ec 51       	subi	r30, 0x1C	; 28
 2d2:	ff 4f       	sbci	r31, 0xFF	; 255
 2d4:	80 83       	st	Z, r24
 2d6:	21 96       	adiw	r28, 0x01	; 1
void ReadOneWireID(void)
{
	unsigned char i;
	OneWireInit();
	WriteOneWire(0x33);		//ReadROM(读ROM) [33h]
	for(i=0;i<8;i++)
 2d8:	c8 30       	cpi	r28, 0x08	; 8
 2da:	d1 05       	cpc	r29, r1
 2dc:	b1 f7       	brne	.-20     	; 0x2ca <ReadOneWireID+0x12>
	{
		OneWireID[i]=ReadOneWire();
	}
}
 2de:	df 91       	pop	r29
 2e0:	cf 91       	pop	r28
 2e2:	08 95       	ret

000002e4 <ReadTemperature>:
	}
	return OneWireData;
}

void ReadTemperature(void)		//读取温度值 
{
 2e4:	ef 92       	push	r14
 2e6:	ff 92       	push	r15
 2e8:	0f 93       	push	r16
 2ea:	1f 93       	push	r17
 2ec:	df 93       	push	r29
 2ee:	cf 93       	push	r28
 2f0:	cd b7       	in	r28, 0x3d	; 61
 2f2:	de b7       	in	r29, 0x3e	; 62
 2f4:	28 97       	sbiw	r28, 0x08	; 8
 2f6:	0f b6       	in	r0, 0x3f	; 63
 2f8:	f8 94       	cli
 2fa:	de bf       	out	0x3e, r29	; 62
 2fc:	0f be       	out	0x3f, r0	; 63
 2fe:	cd bf       	out	0x3d, r28	; 61
	unsigned char i;	
	unsigned char OneWireData[8];

	if(ProcessReadT==_ConvertT)
 300:	10 91 cf 00 	lds	r17, 0x00CF
 304:	11 30       	cpi	r17, 0x01	; 1
 306:	59 f4       	brne	.+22     	; 0x31e <ReadTemperature+0x3a>
	{
		OneWireInit();			//复位DS18B20 
 308:	0e 94 e5 00 	call	0x1ca	; 0x1ca <OneWireInit>
		WriteOneWire(0xcc);	//跳过ID码匹配,适用于一个DS18B20 
 30c:	8c ec       	ldi	r24, 0xCC	; 204
 30e:	0e 94 13 01 	call	0x226	; 0x226 <WriteOneWire>
		WriteOneWire(0x44);	//启动温度转换 
 312:	84 e4       	ldi	r24, 0x44	; 68
 314:	0e 94 13 01 	call	0x226	; 0x226 <WriteOneWire>
		ReadTFlag=1;
 318:	10 93 d8 00 	sts	0x00D8, r17
 31c:	d4 c0       	rjmp	.+424    	; 0x4c6 <ReadTemperature+0x1e2>
	}
	else if(ProcessReadT==_ReadT)
 31e:	80 91 cf 00 	lds	r24, 0x00CF
 322:	82 30       	cpi	r24, 0x02	; 2
 324:	09 f0       	breq	.+2      	; 0x328 <ReadTemperature+0x44>
 326:	cf c0       	rjmp	.+414    	; 0x4c6 <ReadTemperature+0x1e2>
	{
		ProcessReadT=_ConvertT;
 328:	81 e0       	ldi	r24, 0x01	; 1
 32a:	80 93 cf 00 	sts	0x00CF, r24
		OneWireInit();
 32e:	0e 94 e5 00 	call	0x1ca	; 0x1ca <OneWireInit>
		WriteOneWire(0xcc);	//跳过ID码匹配,适用于一个DS18B20 
 332:	8c ec       	ldi	r24, 0xCC	; 204
 334:	0e 94 13 01 	call	0x226	; 0x226 <WriteOneWire>
		WriteOneWire(0xbe);	//通知DS18B20,准备读数据 
 338:	8e eb       	ldi	r24, 0xBE	; 190
 33a:	0e 94 13 01 	call	0x226	; 0x226 <WriteOneWire>
 33e:	8e 01       	movw	r16, r28
 340:	0f 5f       	subi	r16, 0xFF	; 255
 342:	1f 4f       	sbci	r17, 0xFF	; 255

		for(i=0;i<8;i++)
 344:	39 e0       	ldi	r19, 0x09	; 9
 346:	e3 2e       	mov	r14, r19
 348:	f1 2c       	mov	r15, r1
 34a:	ec 0e       	add	r14, r28
 34c:	fd 1e       	adc	r15, r29
		{
			OneWireData[i]=ReadOneWire();
 34e:	0e 94 33 01 	call	0x266	; 0x266 <ReadOneWire>
 352:	f8 01       	movw	r30, r16
 354:	81 93       	st	Z+, r24
 356:	8f 01       	movw	r16, r30
		ProcessReadT=_ConvertT;
		OneWireInit();
		WriteOneWire(0xcc);	//跳过ID码匹配,适用于一个DS18B20 
		WriteOneWire(0xbe);	//通知DS18B20,准备读数据 

		for(i=0;i<8;i++)
 358:	ee 15       	cp	r30, r14
 35a:	ff 05       	cpc	r31, r15
 35c:	c1 f7       	brne	.-16     	; 0x34e <ReadTemperature+0x6a>
		OneWireID[7]=CRC8(OneWireID,7);
		UartSendByte(OneWireID,8);
		*/
//		if(OneWireData[7]==CRC8(OneWireData,7))
		{
			if(OneWireData[1]<16)
 35e:	2a 81       	ldd	r18, Y+2	; 0x02
 360:	20 31       	cpi	r18, 0x10	; 16
 362:	18 f4       	brcc	.+6      	; 0x36a <ReadTemperature+0x86>
			{
				_T=1;
 364:	81 e0       	ldi	r24, 0x01	; 1
 366:	80 93 ce 00 	sts	0x00CE, r24
			}
			DataT=OneWireData[1]*256+OneWireData[0];//合并后得到原始温度数据 
 36a:	92 2f       	mov	r25, r18
 36c:	80 e0       	ldi	r24, 0x00	; 0
 36e:	29 81       	ldd	r18, Y+1	; 0x01
 370:	82 0f       	add	r24, r18
 372:	91 1d       	adc	r25, r1
 374:	90 93 cd 00 	sts	0x00CD, r25
 378:	80 93 cc 00 	sts	0x00CC, r24
			if(_T)	//+
 37c:	80 91 ce 00 	lds	r24, 0x00CE
 380:	88 23       	and	r24, r24
 382:	29 f0       	breq	.+10     	; 0x38e <ReadTemperature+0xaa>
			{
				DataT=DataT/16;
 384:	80 91 cc 00 	lds	r24, 0x00CC
 388:	90 91 cd 00 	lds	r25, 0x00CD
 38c:	07 c0       	rjmp	.+14     	; 0x39c <ReadTemperature+0xb8>
			}
			else 	//-
			{
				DataT=(~DataT+1)/16;
 38e:	80 91 cc 00 	lds	r24, 0x00CC
 392:	90 91 cd 00 	lds	r25, 0x00CD
 396:	90 95       	com	r25
 398:	81 95       	neg	r24
 39a:	9f 4f       	sbci	r25, 0xFF	; 255
 39c:	24 e0       	ldi	r18, 0x04	; 4
 39e:	96 95       	lsr	r25
 3a0:	87 95       	ror	r24
 3a2:	2a 95       	dec	r18
 3a4:	e1 f7       	brne	.-8      	; 0x39e <ReadTemperature+0xba>
 3a6:	90 93 cd 00 	sts	0x00CD, r25
 3aa:	80 93 cc 00 	sts	0x00CC, r24
			}
			//计算实际温度 -55~+125 器件以0.0625摄氏度递增
			//如果温度为正 则T的最高位的4位都为0 否则为1;
			//负温度的计算:原始数据取反 加1 再乘以0.0625;正温度的计算:原始数据乘以0.0625 
			
			if((DataT!=85)&(DataT!=95))
 3ae:	80 91 cc 00 	lds	r24, 0x00CC
 3b2:	90 91 cd 00 	lds	r25, 0x00CD
 3b6:	20 91 cc 00 	lds	r18, 0x00CC
 3ba:	30 91 cd 00 	lds	r19, 0x00CD
 3be:	85 35       	cpi	r24, 0x55	; 85
 3c0:	91 05       	cpc	r25, r1
 3c2:	09 f4       	brne	.+2      	; 0x3c6 <ReadTemperature+0xe2>
 3c4:	6e c0       	rjmp	.+220    	; 0x4a2 <ReadTemperature+0x1be>
 3c6:	2f 35       	cpi	r18, 0x5F	; 95
 3c8:	31 05       	cpc	r19, r1
 3ca:	09 f4       	brne	.+2      	; 0x3ce <ReadTemperature+0xea>
 3cc:	6a c0       	rjmp	.+212    	; 0x4a2 <ReadTemperature+0x1be>
			{
				TemperatrueBuffer[0]=DataT/100;		//100 
 3ce:	80 91 cc 00 	lds	r24, 0x00CC
 3d2:	90 91 cd 00 	lds	r25, 0x00CD
 3d6:	64 e6       	ldi	r22, 0x64	; 100
 3d8:	70 e0       	ldi	r23, 0x00	; 0
 3da:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 3de:	60 93 ec 00 	sts	0x00EC, r22
				TemperatrueBuffer[1]=DataT/10%10;	//10  
 3e2:	80 91 cc 00 	lds	r24, 0x00CC
 3e6:	90 91 cd 00 	lds	r25, 0x00CD
 3ea:	6a e0       	ldi	r22, 0x0A	; 10
 3ec:	70 e0       	ldi	r23, 0x00	; 0
 3ee:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 3f2:	cb 01       	movw	r24, r22
 3f4:	6a e0       	ldi	r22, 0x0A	; 10
 3f6:	70 e0       	ldi	r23, 0x00	; 0
 3f8:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 3fc:	80 93 ed 00 	sts	0x00ED, r24
				TemperatrueBuffer[2]=DataT%10;		//1 
 400:	80 91 cc 00 	lds	r24, 0x00CC
 404:	90 91 cd 00 	lds	r25, 0x00CD
 408:	6a e0       	ldi	r22, 0x0A	; 10
 40a:	70 e0       	ldi	r23, 0x00	; 0
 40c:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 410:	80 93 ee 00 	sts	0x00EE, r24
				DataT%=0xff;
 414:	80 91 cc 00 	lds	r24, 0x00CC
 418:	90 91 cd 00 	lds	r25, 0x00CD
 41c:	6f ef       	ldi	r22, 0xFF	; 255
 41e:	70 e0       	ldi	r23, 0x00	; 0
 420:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 424:	90 93 cd 00 	sts	0x00CD, r25
 428:	80 93 cc 00 	sts	0x00CC, r24
				DataT*=625;
 42c:	20 91 cc 00 	lds	r18, 0x00CC
 430:	30 91 cd 00 	lds	r19, 0x00CD
 434:	81 e7       	ldi	r24, 0x71	; 113
 436:	92 e0       	ldi	r25, 0x02	; 2
 438:	ac 01       	movw	r20, r24
 43a:	24 9f       	mul	r18, r20
 43c:	c0 01       	movw	r24, r0
 43e:	25 9f       	mul	r18, r21
 440:	90 0d       	add	r25, r0
 442:	34 9f       	mul	r19, r20
 444:	90 0d       	add	r25, r0
 446:	11 24       	eor	r1, r1
 448:	90 93 cd 00 	sts	0x00CD, r25
 44c:	80 93 cc 00 	sts	0x00CC, r24
				TemperatrueBuffer[3]=DataT/100%10;	//.1
 450:	80 91 cc 00 	lds	r24, 0x00CC
 454:	90 91 cd 00 	lds	r25, 0x00CD
 458:	64 e6       	ldi	r22, 0x64	; 100
 45a:	70 e0       	ldi	r23, 0x00	; 0
 45c:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 460:	cb 01       	movw	r24, r22
 462:	6a e0       	ldi	r22, 0x0A	; 10
 464:	70 e0       	ldi	r23, 0x00	; 0
 466:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 46a:	80 93 ef 00 	sts	0x00EF, r24
				TemperatrueBuffer[4]=DataT/10%10;	//0.01
 46e:	80 91 cc 00 	lds	r24, 0x00CC
 472:	90 91 cd 00 	lds	r25, 0x00CD
 476:	6a e0       	ldi	r22, 0x0A	; 10
 478:	70 e0       	ldi	r23, 0x00	; 0
 47a:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 47e:	cb 01       	movw	r24, r22
 480:	6a e0       	ldi	r22, 0x0A	; 10
 482:	70 e0       	ldi	r23, 0x00	; 0
 484:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 488:	80 93 f0 00 	sts	0x00F0, r24
				TemperatrueBuffer[5]=DataT%10;		//0.001
 48c:	80 91 cc 00 	lds	r24, 0x00CC
 490:	90 91 cd 00 	lds	r25, 0x00CD
 494:	6a e0       	ldi	r22, 0x0A	; 10
 496:	70 e0       	ldi	r23, 0x00	; 0
 498:	0e 94 6f 07 	call	0xede	; 0xede <__udivmodhi4>
 49c:	80 93 f1 00 	sts	0x00F1, r24
 4a0:	12 c0       	rjmp	.+36     	; 0x4c6 <ReadTemperature+0x1e2>
 4a2:	80 e0       	ldi	r24, 0x00	; 0
 4a4:	90 e0       	ldi	r25, 0x00	; 0
			}
			else
			{
				for(i=0;i<8;i++)
				{
					TemperatrueBuffer[i]=0;
 4a6:	fc 01       	movw	r30, r24
 4a8:	e4 51       	subi	r30, 0x14	; 20
 4aa:	ff 4f       	sbci	r31, 0xFF	; 255
 4ac:	10 82       	st	Z, r1
 4ae:	01 96       	adiw	r24, 0x01	; 1
				TemperatrueBuffer[4]=DataT/10%10;	//0.01
				TemperatrueBuffer[5]=DataT%10;		//0.001
			}
			else
			{
				for(i=0;i<8;i++)
 4b0:	88 30       	cpi	r24, 0x08	; 8
 4b2:	91 05       	cpc	r25, r1
 4b4:	c1 f7       	brne	.-16     	; 0x4a6 <ReadTemperature+0x1c2>
				{
					TemperatrueBuffer[i]=0;
				}
				UartSendString((unsigned char *)"测温异常!");
 4b6:	82 e7       	ldi	r24, 0x72	; 114
 4b8:	90 e0       	ldi	r25, 0x00	; 0
 4ba:	0e 94 33 04 	call	0x866	; 0x866 <UartSendString>
				UartSendString((unsigned char *)"\r\n");
 4be:	8c e7       	ldi	r24, 0x7C	; 124
 4c0:	90 e0       	ldi	r25, 0x00	; 0
 4c2:	0e 94 33 04 	call	0x866	; 0x866 <UartSendString>
			}
		}

⌨️ 快捷键说明

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