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

📄 ds18b20.lss

📁 avr单片机编写的18B20测温程序
💻 LSS
📖 第 1 页 / 共 2 页
字号:

    //USART 9600 8n1  
    UCSRC = (1<<URSEL) | 0x06;

    UBRRL= (F_CPU/BAUDRATE/16-1)%256;
 19a:	89 e1       	ldi	r24, 0x19	; 25
 19c:	89 b9       	out	0x09, r24	; 9
    UBRRH= (F_CPU/BAUDRATE/16-1)/256;
 19e:	10 bc       	out	0x20, r1	; 32
    UCSRA = 0x00;
 1a0:	1b b8       	out	0x0b, r1	; 11
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
 1a2:	88 e9       	ldi	r24, 0x98	; 152
 1a4:	8a b9       	out	0x0a, r24	; 10
 1a6:	08 95       	ret

000001a8 <display>:
/*-------------------------------------------------------------------------
*动态显示数码管
*/
void display(void)
{
 1a8:	41 e0       	ldi	r20, 0x01	; 1
 1aa:	20 e0       	ldi	r18, 0x00	; 0
 1ac:	30 e0       	ldi	r19, 0x00	; 0
 1ae:	a0 ed       	ldi	r26, 0xD0	; 208
 1b0:	b7 e0       	ldi	r27, 0x07	; 7
 1b2:	e8 e7       	ldi	r30, 0x78	; 120
 1b4:	f0 e0       	ldi	r31, 0x00	; 0
	uint8_t i,sel=0x01;
	for (i=0;i<5;i++)
	{
		PORTA = led_seg[4-i];
 1b6:	80 81       	ld	r24, Z
 1b8:	31 97       	sbiw	r30, 0x01	; 1
 1ba:	8b bb       	out	0x1b, r24	; 27
		PORTB = ~sel;
 1bc:	84 2f       	mov	r24, r20
 1be:	80 95       	com	r24
 1c0:	88 bb       	out	0x18, r24	; 24
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1c2:	cd 01       	movw	r24, r26
 1c4:	01 97       	sbiw	r24, 0x01	; 1
 1c6:	f1 f7       	brne	.-4      	; 0x1c4 <display+0x1c>
		_delay_ms (2);
		sel=sel<<1;
 1c8:	44 0f       	add	r20, r20
 1ca:	2f 5f       	subi	r18, 0xFF	; 255
 1cc:	3f 4f       	sbci	r19, 0xFF	; 255
 1ce:	25 30       	cpi	r18, 0x05	; 5
 1d0:	31 05       	cpc	r19, r1
 1d2:	89 f7       	brne	.-30     	; 0x1b6 <display+0xe>
 1d4:	08 95       	ret

000001d6 <delay_s>:
	}
}


/*--------------------------------------------------------------------------
*初始化avr和18b20
*/
void init(void)
{
	DDRA = 0XFF;
	DDRB = 0XFF;
	PORTA = 0X00;
	PORTB = 0XFF;
	DDRD  = 0xFF;
    PORTD = 0xFF;
	init_USART();
	DS18b20_config();
}

/*--------------------------------------------------------------------------
*延时程序
*/
void delay_s(uint16_t m)
{
 1d6:	e8 ee       	ldi	r30, 0xE8	; 232
 1d8:	f3 e0       	ldi	r31, 0x03	; 3
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1da:	cf 01       	movw	r24, r30
 1dc:	01 97       	sbiw	r24, 0x01	; 1
 1de:	f1 f7       	brne	.-4      	; 0x1dc <delay_s+0x6>
 1e0:	fc cf       	rjmp	.-8      	; 0x1da <delay_s+0x4>

000001e2 <hex_to_dec>:
	while((m--)>=0)
	{
		wait_us(1000);
	}
}


/*--------------------------------------------------------------------------
* 把采集到的温度数据转化成十进制,采用12位精度,温度小数部分精确到小数点后一位,采用四舍五入。
*
*	0  cel_frac	 小数点后第二位  进位位
*	1	0625	    625		 	1
*	2	1250		250	
*	3	1875		875			3
*	4	2500		500			4
*	5	3125		125	
*	6	3750		750			6
*	7	4375		375	
*	8	5000		0	
*	9	5625		625			9
*	10	6250		250	
*	11	6875		875			11
*	12	7500		500			12
*	13	8125		125	
*	14	8750		750			14
*	15	9375		375	

*/
uint16_t hex_to_dec(uint16_t means)
{
 1e2:	cf 93       	push	r28
 1e4:	df 93       	push	r29
 1e6:	cd b7       	in	r28, 0x3d	; 61
 1e8:	de b7       	in	r29, 0x3e	; 62
 1ea:	28 97       	sbiw	r28, 0x08	; 8
 1ec:	0f b6       	in	r0, 0x3f	; 63
 1ee:	f8 94       	cli
 1f0:	de bf       	out	0x3e, r29	; 62
 1f2:	0f be       	out	0x3f, r0	; 63
 1f4:	cd bf       	out	0x3d, r28	; 61
 1f6:	fc 01       	movw	r30, r24
	uint16_t value;
	uint8_t cel; //温度整数部分
	uint8_t cel_frac; //温度小数部分
	uint8_t i;
	uint8_t need_rounding[]={1,3,4,6,9,11,12,14};
 1f8:	9e 01       	movw	r18, r28
 1fa:	2f 5f       	subi	r18, 0xFF	; 255
 1fc:	3f 4f       	sbci	r19, 0xFF	; 255
 1fe:	4a e6       	ldi	r20, 0x6A	; 106
 200:	50 e0       	ldi	r21, 0x00	; 0
 202:	88 e0       	ldi	r24, 0x08	; 8
 204:	da 01       	movw	r26, r20
 206:	0d 90       	ld	r0, X+
 208:	ad 01       	movw	r20, r26
 20a:	d9 01       	movw	r26, r18
 20c:	0d 92       	st	X+, r0
 20e:	9d 01       	movw	r18, r26
 210:	81 50       	subi	r24, 0x01	; 1
 212:	c1 f7       	brne	.-16     	; 0x204 <hex_to_dec+0x22>
	
	if (means & 0x8000) 	//温度为零下,把负数的补码转化成原码
 214:	f7 ff       	sbrs	r31, 7
 216:	06 c0       	rjmp	.+12     	; 0x224 <hex_to_dec+0x42>
	{
		f_t = 1;
 218:	81 e0       	ldi	r24, 0x01	; 1
 21a:	80 93 72 00 	sts	0x0072, r24
		means ^=0xffff; 	//取反
		means++;
 21e:	f0 95       	com	r31
 220:	e1 95       	neg	r30
 222:	ff 4f       	sbci	r31, 0xFF	; 255
	}
	cel=(uint8_t) (means>>4); 		//把整数部分由十六转成十进制
	cel_frac = (uint8_t) (means & 0x000f);
 224:	4e 2f       	mov	r20, r30
 226:	4f 70       	andi	r20, 0x0F	; 15
	value =cel_frac*625/1000; 		//如精确到两位除以100
 228:	24 2f       	mov	r18, r20
 22a:	33 27       	eor	r19, r19
 22c:	81 e7       	ldi	r24, 0x71	; 113
 22e:	92 e0       	ldi	r25, 0x02	; 2
 230:	bc 01       	movw	r22, r24
 232:	26 9f       	mul	r18, r22
 234:	c0 01       	movw	r24, r0
 236:	27 9f       	mul	r18, r23
 238:	90 0d       	add	r25, r0
 23a:	36 9f       	mul	r19, r22
 23c:	90 0d       	add	r25, r0
 23e:	11 24       	eor	r1, r1
 240:	68 ee       	ldi	r22, 0xE8	; 232
 242:	73 e0       	ldi	r23, 0x03	; 3
 244:	0e 94 b8 01 	call	0x370	; 0x370 <__divmodhi4>
	value +=cel*10;   				//如精确到两位乘以100
 248:	84 e0       	ldi	r24, 0x04	; 4
 24a:	f6 95       	lsr	r31
 24c:	e7 95       	ror	r30
 24e:	8a 95       	dec	r24
 250:	e1 f7       	brne	.-8      	; 0x24a <hex_to_dec+0x68>
 252:	8a e0       	ldi	r24, 0x0A	; 10
 254:	e8 9f       	mul	r30, r24
 256:	c0 01       	movw	r24, r0
 258:	11 24       	eor	r1, r1
 25a:	68 0f       	add	r22, r24
 25c:	79 1f       	adc	r23, r25
 25e:	fe 01       	movw	r30, r28
 260:	31 96       	adiw	r30, 0x01	; 1
 262:	9e 01       	movw	r18, r28
 264:	26 5f       	subi	r18, 0xF6	; 246
 266:	3f 4f       	sbci	r19, 0xFF	; 255
	
	for (i=0; i<=sizeof(need_rounding);i++)
	{
		if (cel_frac==need_rounding[i])
 268:	80 81       	ld	r24, Z
 26a:	48 17       	cp	r20, r24
 26c:	19 f4       	brne	.+6      	; 0x274 <hex_to_dec+0x92>
		{
			value++;
 26e:	6f 5f       	subi	r22, 0xFF	; 255
 270:	7f 4f       	sbci	r23, 0xFF	; 255
 272:	04 c0       	rjmp	.+8      	; 0x27c <hex_to_dec+0x9a>
			break;
 274:	31 96       	adiw	r30, 0x01	; 1
 276:	e2 17       	cp	r30, r18
 278:	f3 07       	cpc	r31, r19
 27a:	b1 f7       	brne	.-20     	; 0x268 <hex_to_dec+0x86>
		}
	}

	return value;
}
 27c:	cb 01       	movw	r24, r22
 27e:	28 96       	adiw	r28, 0x08	; 8
 280:	0f b6       	in	r0, 0x3f	; 63
 282:	f8 94       	cli
 284:	de bf       	out	0x3e, r29	; 62
 286:	0f be       	out	0x3f, r0	; 63
 288:	cd bf       	out	0x3d, r28	; 61
 28a:	df 91       	pop	r29
 28c:	cf 91       	pop	r28
 28e:	08 95       	ret

00000290 <init>:
 290:	8f ef       	ldi	r24, 0xFF	; 255
 292:	8a bb       	out	0x1a, r24	; 26
 294:	87 bb       	out	0x17, r24	; 23
 296:	1b ba       	out	0x1b, r1	; 27
 298:	88 bb       	out	0x18, r24	; 24
 29a:	81 bb       	out	0x11, r24	; 17
 29c:	82 bb       	out	0x12, r24	; 18
 29e:	0e 94 cb 00 	call	0x196	; 0x196 <init_USART>
 2a2:	0e 94 47 00 	call	0x8e	; 0x8e <DS18b20_config>
 2a6:	08 95       	ret

000002a8 <put_s>:
 2a8:	fc 01       	movw	r30, r24
 2aa:	04 c0       	rjmp	.+8      	; 0x2b4 <put_s+0xc>
 2ac:	5d 9b       	sbis	0x0b, 5	; 11
 2ae:	fe cf       	rjmp	.-4      	; 0x2ac <put_s+0x4>
 2b0:	31 96       	adiw	r30, 0x01	; 1
 2b2:	8c b9       	out	0x0c, r24	; 12
 2b4:	80 81       	ld	r24, Z
 2b6:	88 23       	and	r24, r24
 2b8:	c9 f7       	brne	.-14     	; 0x2ac <put_s+0x4>
 2ba:	08 95       	ret

000002bc <main>:


int main(void)
{
 2bc:	1f 93       	push	r17
 2be:	cf 93       	push	r28
 2c0:	df 93       	push	r29
	uint16_t tp;
	uint16_t m;
	uint8_t i;
	init();
 2c2:	0e 94 48 01 	call	0x290	; 0x290 <init>
	while(1)
	{
		uint8_t i;
		f_t = 0;
 2c6:	10 92 72 00 	sts	0x0072, r1
		
		m = 0x0000;
		covert_t();
 2ca:	0e 94 a2 00 	call	0x144	; 0x144 <covert_t>
 2ce:	10 e0       	ldi	r17, 0x00	; 0
		for (i=0;i<=35;i++)   //温度转化后一定要延时750ms后再读数据,否则为18b20内部自定义的85度 
		{
			display();
 2d0:	0e 94 d4 00 	call	0x1a8	; 0x1a8 <display>
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 2d4:	80 e2       	ldi	r24, 0x20	; 32
 2d6:	9e e4       	ldi	r25, 0x4E	; 78
 2d8:	01 97       	sbiw	r24, 0x01	; 1
 2da:	f1 f7       	brne	.-4      	; 0x2d8 <main+0x1c>
 2dc:	1f 5f       	subi	r17, 0xFF	; 255
 2de:	14 32       	cpi	r17, 0x24	; 36
 2e0:	b9 f7       	brne	.-18     	; 0x2d0 <main+0x14>
			_delay_ms(20);
		}
		m = read_t();
 2e2:	0e 94 ad 00 	call	0x15a	; 0x15a <read_t>
		i = m>>8;
 2e6:	29 2f       	mov	r18, r25
 2e8:	33 27       	eor	r19, r19
 2ea:	5d 9b       	sbis	0x0b, 5	; 11
 2ec:	fe cf       	rjmp	.-4      	; 0x2ea <main+0x2e>
 2ee:	2c b9       	out	0x0c, r18	; 12
 2f0:	5d 9b       	sbis	0x0b, 5	; 11
 2f2:	fe cf       	rjmp	.-4      	; 0x2f0 <main+0x34>
 2f4:	8c b9       	out	0x0c, r24	; 12
		put_c(i);
		i = m;
		put_c(i);

		tp = hex_to_dec(m);
 2f6:	0e 94 f1 00 	call	0x1e2	; 0x1e2 <hex_to_dec>
 2fa:	9c 01       	movw	r18, r24
		//tp = hex_to_dec( 0xfc90); 
		if (f_t)
 2fc:	80 91 72 00 	lds	r24, 0x0072
 300:	88 23       	and	r24, r24
 302:	21 f0       	breq	.+8      	; 0x30c <main+0x50>
		{
			led_seg[0]=0x40;
 304:	80 e4       	ldi	r24, 0x40	; 64
 306:	80 93 74 00 	sts	0x0074, r24
 30a:	02 c0       	rjmp	.+4      	; 0x310 <main+0x54>
		}
		else
		{
			led_seg[0]=0x00;
 30c:	10 92 74 00 	sts	0x0074, r1
 310:	44 e0       	ldi	r20, 0x04	; 4
 312:	c8 e7       	ldi	r28, 0x78	; 120
 314:	d0 e0       	ldi	r29, 0x00	; 0
		}
		
		for (i=4;i>0;i--)
		{
			led_seg[i]=led_8[tp%10];
 316:	c9 01       	movw	r24, r18
 318:	6a e0       	ldi	r22, 0x0A	; 10
 31a:	70 e0       	ldi	r23, 0x00	; 0
 31c:	0e 94 a4 01 	call	0x348	; 0x348 <__udivmodhi4>
 320:	fc 01       	movw	r30, r24
 322:	e0 5a       	subi	r30, 0xA0	; 160
 324:	ff 4f       	sbci	r31, 0xFF	; 255
 326:	80 81       	ld	r24, Z
 328:	88 83       	st	Y, r24
 32a:	21 97       	sbiw	r28, 0x01	; 1
			tp = tp/10;
 32c:	c9 01       	movw	r24, r18
 32e:	6a e0       	ldi	r22, 0x0A	; 10
 330:	70 e0       	ldi	r23, 0x00	; 0
 332:	0e 94 a4 01 	call	0x348	; 0x348 <__udivmodhi4>
 336:	9b 01       	movw	r18, r22
 338:	41 50       	subi	r20, 0x01	; 1
 33a:	69 f7       	brne	.-38     	; 0x316 <main+0x5a>
		}
		led_seg[3]=led_seg[3]+0x80;
 33c:	80 91 77 00 	lds	r24, 0x0077
 340:	80 58       	subi	r24, 0x80	; 128
 342:	80 93 77 00 	sts	0x0077, r24
 346:	bf cf       	rjmp	.-130    	; 0x2c6 <main+0xa>

00000348 <__udivmodhi4>:
 348:	aa 1b       	sub	r26, r26
 34a:	bb 1b       	sub	r27, r27
 34c:	51 e1       	ldi	r21, 0x11	; 17
 34e:	07 c0       	rjmp	.+14     	; 0x35e <__udivmodhi4_ep>

00000350 <__udivmodhi4_loop>:
 350:	aa 1f       	adc	r26, r26
 352:	bb 1f       	adc	r27, r27
 354:	a6 17       	cp	r26, r22
 356:	b7 07       	cpc	r27, r23
 358:	10 f0       	brcs	.+4      	; 0x35e <__udivmodhi4_ep>
 35a:	a6 1b       	sub	r26, r22
 35c:	b7 0b       	sbc	r27, r23

0000035e <__udivmodhi4_ep>:
 35e:	88 1f       	adc	r24, r24
 360:	99 1f       	adc	r25, r25
 362:	5a 95       	dec	r21
 364:	a9 f7       	brne	.-22     	; 0x350 <__udivmodhi4_loop>
 366:	80 95       	com	r24
 368:	90 95       	com	r25
 36a:	bc 01       	movw	r22, r24
 36c:	cd 01       	movw	r24, r26
 36e:	08 95       	ret

00000370 <__divmodhi4>:
 370:	97 fb       	bst	r25, 7
 372:	09 2e       	mov	r0, r25
 374:	07 26       	eor	r0, r23
 376:	0a d0       	rcall	.+20     	; 0x38c <__divmodhi4_neg1>
 378:	77 fd       	sbrc	r23, 7
 37a:	04 d0       	rcall	.+8      	; 0x384 <__divmodhi4_neg2>
 37c:	e5 df       	rcall	.-54     	; 0x348 <__udivmodhi4>
 37e:	06 d0       	rcall	.+12     	; 0x38c <__divmodhi4_neg1>
 380:	00 20       	and	r0, r0
 382:	1a f4       	brpl	.+6      	; 0x38a <__divmodhi4_exit>

00000384 <__divmodhi4_neg2>:
 384:	70 95       	com	r23
 386:	61 95       	neg	r22
 388:	7f 4f       	sbci	r23, 0xFF	; 255

0000038a <__divmodhi4_exit>:
 38a:	08 95       	ret

0000038c <__divmodhi4_neg1>:
 38c:	f6 f7       	brtc	.-4      	; 0x38a <__divmodhi4_exit>
 38e:	90 95       	com	r25
 390:	81 95       	neg	r24
 392:	9f 4f       	sbci	r25, 0xFF	; 255
 394:	08 95       	ret

⌨️ 快捷键说明

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