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

📄 18b20.lss

📁 温度传感器18B20(数码管显示)开发平台为WINAVR
💻 LSS
📖 第 1 页 / 共 2 页
字号:

18b20.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000043a  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000014  00800060  0000043a  000004ce  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000002  00800074  00800074  000004e2  2**0
                  ALLOC
  3 .noinit       00000000  00800076  00800076  000004e2  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  000004e2  2**0
                  CONTENTS
  5 .debug_aranges 00000014  00000000  00000000  000004e2  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_pubnames 000000e7  00000000  00000000  000004f6  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   00000527  00000000  00000000  000005dd  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 00000163  00000000  00000000  00000b04  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   0000037e  00000000  00000000  00000c67  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    000001a6  00000000  00000000  00000fe5  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26
   2:	2b c0       	rjmp	.+86     	; 0x5a
   4:	2a c0       	rjmp	.+84     	; 0x5a
   6:	29 c0       	rjmp	.+82     	; 0x5a
   8:	28 c0       	rjmp	.+80     	; 0x5a
   a:	27 c0       	rjmp	.+78     	; 0x5a
   c:	26 c0       	rjmp	.+76     	; 0x5a
   e:	25 c0       	rjmp	.+74     	; 0x5a
  10:	24 c0       	rjmp	.+72     	; 0x5a
  12:	23 c0       	rjmp	.+70     	; 0x5a
  14:	22 c0       	rjmp	.+68     	; 0x5a
  16:	21 c0       	rjmp	.+66     	; 0x5a
  18:	20 c0       	rjmp	.+64     	; 0x5a
  1a:	1f c0       	rjmp	.+62     	; 0x5a
  1c:	1e c0       	rjmp	.+60     	; 0x5a
  1e:	1d c0       	rjmp	.+58     	; 0x5a
  20:	1c c0       	rjmp	.+56     	; 0x5a
  22:	1b c0       	rjmp	.+54     	; 0x5a
  24:	1a c0       	rjmp	.+52     	; 0x5a

00000026 <__ctors_end>:
  26:	11 24       	eor	r1, r1
  28:	1f be       	out	0x3f, r1	; 63
  2a:	cf e5       	ldi	r28, 0x5F	; 95
  2c:	d4 e0       	ldi	r29, 0x04	; 4
  2e:	de bf       	out	0x3e, r29	; 62
  30:	cd bf       	out	0x3d, r28	; 61

00000032 <__do_copy_data>:
  32:	10 e0       	ldi	r17, 0x00	; 0
  34:	a0 e6       	ldi	r26, 0x60	; 96
  36:	b0 e0       	ldi	r27, 0x00	; 0
  38:	ea e3       	ldi	r30, 0x3A	; 58
  3a:	f4 e0       	ldi	r31, 0x04	; 4
  3c:	02 c0       	rjmp	.+4      	; 0x42

0000003e <.do_copy_data_loop>:
  3e:	05 90       	lpm	r0, Z+
  40:	0d 92       	st	X+, r0

00000042 <.do_copy_data_start>:
  42:	a4 37       	cpi	r26, 0x74	; 116
  44:	b1 07       	cpc	r27, r17
  46:	d9 f7       	brne	.-10     	; 0x3e

00000048 <__do_clear_bss>:
  48:	10 e0       	ldi	r17, 0x00	; 0
  4a:	a4 e7       	ldi	r26, 0x74	; 116
  4c:	b0 e0       	ldi	r27, 0x00	; 0
  4e:	01 c0       	rjmp	.+2      	; 0x52

00000050 <.do_clear_bss_loop>:
  50:	1d 92       	st	X+, r1

00000052 <.do_clear_bss_start>:
  52:	a6 37       	cpi	r26, 0x76	; 118
  54:	b1 07       	cpc	r27, r17
  56:	e1 f7       	brne	.-8      	; 0x50
  58:	10 c1       	rjmp	.+544    	; 0x27a

0000005a <__bad_interrupt>:
  5a:	d2 cf       	rjmp	.-92     	; 0x0

0000005c <spi_init>:

void spi_init(void)
{
	/* 设置MOSI 和SCK 为输出,其他为输入 */
	PORTB = (1<<PB3)|(1<<PB5);
  5c:	88 e2       	ldi	r24, 0x28	; 40
  5e:	88 bb       	out	0x18, r24	; 24
	/* 使能SPI 主机模式,设置时钟速率为fck/16 */
	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  60:	81 e5       	ldi	r24, 0x51	; 81
  62:	8d b9       	out	0x0d, r24	; 13
  64:	08 95       	ret

00000066 <spi_send>:
    //SPCR=0x76;//主机模式
    //SPSR=0X01;//时钟加位,Focs/2
}
    
void spi_send(uchar dd)
{
    /* 启动数据传输 */
	SPDR = dd;
  66:	8f b9       	out	0x0f, r24	; 15
	/* 等待传输结束 */
	//while(!(SPSR & 0x80));
	//SPDR=dd;
    while((SPSR&0X80) == 0);
  68:	77 9b       	sbis	0x0e, 7	; 14
  6a:	fe cf       	rjmp	.-4      	; 0x68
	SPSR &= 0X7F;
  6c:	77 98       	cbi	0x0e, 7	; 14
  6e:	08 95       	ret

00000070 <Init_R>:
	//PORTB &= ~0X01;  
}
	

/****************初始化I/O口************************************************/
void Init_R(void)
{
    DDRB=0xef;
  70:	8f ee       	ldi	r24, 0xEF	; 239
  72:	87 bb       	out	0x17, r24	; 23
    PORTB=0xFF;
  74:	8f ef       	ldi	r24, 0xFF	; 255
  76:	88 bb       	out	0x18, r24	; 24
    DDRC = 0XFF;
  78:	84 bb       	out	0x14, r24	; 20
    PORTC=0xFF; 
  7a:	85 bb       	out	0x15, r24	; 21
    DDRD = 0XFF;
  7c:	81 bb       	out	0x11, r24	; 17
    PORTD=0xFF;
  7e:	82 bb       	out	0x12, r24	; 18
	spi_init();
  80:	ed df       	rcall	.-38     	; 0x5c
  82:	08 95       	ret

00000084 <Init_DS18B20>:
}

/*-------------------------温度传感程序------------------------*/

void Init_DS18B20(void)//初始化ds1820
{
	unsigned char x = 0;
	DDRC |= 0X01;
  84:	a0 9a       	sbi	0x14, 0	; 20
	PORTC |= 0X01; // DQO = 1;    //DQ复位
  86:	a8 9a       	sbi	0x15, 0	; 21
		__ticks = 1;
	else if (__tmp > 255)
		__ticks = 0;	/* i.e. 256 */
	else
		__ticks = (uint8_t)__tmp;
  88:	80 e1       	ldi	r24, 0x10	; 16
  8a:	8a 95       	dec	r24
  8c:	f1 f7       	brne	.-4      	; 0x8a
	_delay_us(50); // Time_Delay(8);  //稍做延时

	PORTC &= 0XFE; // DQO = 0;    //单片机将DQ拉低
  8e:	a8 98       	cbi	0x15, 0	; 21
		__ticks = 1;
	else if (__tmp > 255)
		__ticks = 0;	/* i.e. 256 */
	else
		__ticks = (uint8_t)__tmp;
  90:	80 ea       	ldi	r24, 0xA0	; 160
  92:	8a 95       	dec	r24
  94:	f1 f7       	brne	.-4      	; 0x92
	_delay_us(480); //Time_Delay(80); //精确延时 大于 480us

	PORTC |= 0X01; //DQO = 1;    //拉高总线
  96:	a8 9a       	sbi	0x15, 0	; 21
		__ticks = 1;
	else if (__tmp > 255)
		__ticks = 0;	/* i.e. 256 */
	else
		__ticks = (uint8_t)__tmp;
  98:	84 e1       	ldi	r24, 0x14	; 20
  9a:	8a 95       	dec	r24
  9c:	f1 f7       	brne	.-4      	; 0x9a
	_delay_us(60);//Time_Delay(14);
	
	DDRC &= 0XFE;
  9e:	a0 98       	cbi	0x14, 0	; 20
	x = PINC&0X01;//DQI;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  a0:	83 b3       	in	r24, 0x13	; 19
		__ticks = 1;
	else if (__tmp > 255)
		__ticks = 0;	/* i.e. 256 */
	else
		__ticks = (uint8_t)__tmp;
  a2:	88 e2       	ldi	r24, 0x28	; 40
  a4:	8a 95       	dec	r24
  a6:	f1 f7       	brne	.-4      	; 0xa4
  a8:	08 95       	ret

000000aa <read_ds18b20>:
    _delay_us(120);//Time_Delay(20);
}
/*--------------------------------------------------------*/
unsigned char read_ds18b20(void)//读一个字节
{
	unsigned char i = 0;
  aa:	90 e0       	ldi	r25, 0x00	; 0
	unsigned char dat = 0;

	for (i = 8; i > 0; i--)
  ac:	78 e0       	ldi	r23, 0x08	; 8
  ae:	61 e0       	ldi	r22, 0x01	; 1
  b0:	24 e1       	ldi	r18, 0x14	; 20
  b2:	30 e0       	ldi	r19, 0x00	; 0
  b4:	40 e0       	ldi	r20, 0x00	; 0
  b6:	50 e0       	ldi	r21, 0x00	; 0
	{    
	    DDRC |= 0X01;
  b8:	a0 9a       	sbi	0x14, 0	; 20
  		PORTC &= 0XFE; //DQO = 0; // 给脉冲信号
  ba:	a8 98       	cbi	0x15, 0	; 21
*/
static __inline__ void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  bc:	86 2f       	mov	r24, r22
  be:	8a 95       	dec	r24
  c0:	f1 f7       	brne	.-4      	; 0xbe
		_delay_us(1);//1us
  		dat >>= 1;
  c2:	96 95       	lsr	r25
  		PORTC |= 0X01; //DQO = 1; // 给脉冲信号
  c4:	a8 9a       	sbi	0x15, 0	; 21
  		DDRC &= 0XFE;
  c6:	a0 98       	cbi	0x14, 0	; 20
*/
static __inline__ void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  c8:	86 2f       	mov	r24, r22
  ca:	8a 95       	dec	r24
  cc:	f1 f7       	brne	.-4      	; 0xca
		_delay_us(2);//2us
  		if((PINC&0X01) == 1)
  ce:	98 99       	sbic	0x13, 0	; 19
  			dat |= 0x80;
  d0:	90 68       	ori	r25, 0x80	; 128
*/
static __inline__ void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  d2:	82 2f       	mov	r24, r18
  d4:	8a 95       	dec	r24
  d6:	f1 f7       	brne	.-4      	; 0xd4
  d8:	71 50       	subi	r23, 0x01	; 1
  da:	71 f7       	brne	.-36     	; 0xb8
  		_delay_us(60);//Time_Delay(4);
	}

	return (dat);
}
  dc:	89 2f       	mov	r24, r25
  de:	99 27       	eor	r25, r25
  e0:	08 95       	ret

000000e2 <write_ds18b20>:

/**********************************************************************************/
void write_ds18b20(unsigned char dat)//写一个字节
{
  e2:	98 2f       	mov	r25, r24
	unsigned char i = 0;
	for (i = 8; i > 0; i--)
  e4:	68 e0       	ldi	r22, 0x08	; 8
  e6:	2a e0       	ldi	r18, 0x0A	; 10
  e8:	30 e0       	ldi	r19, 0x00	; 0
  ea:	40 e0       	ldi	r20, 0x00	; 0
  ec:	50 e0       	ldi	r21, 0x00	; 0
	{   
	    DDRC |= 0X01;
  ee:	a0 9a       	sbi	0x14, 0	; 20
  		PORTC &= 0XFE; //DQO = 0;
  f0:	a8 98       	cbi	0x15, 0	; 21
  		PORTC = dat&0x01; //DQO = dat&0x01;
  f2:	89 2f       	mov	r24, r25
  f4:	81 70       	andi	r24, 0x01	; 1
  f6:	85 bb       	out	0x15, r24	; 21
*/
static __inline__ void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  f8:	82 2f       	mov	r24, r18
  fa:	8a 95       	dec	r24
  fc:	f1 f7       	brne	.-4      	; 0xfa
  		_delay_us(30);//Time_Delay(5);
  		PORTC |= 0X01; //DQO = 1;
  fe:	a8 9a       	sbi	0x15, 0	; 21
  		dat>>=1;
 100:	96 95       	lsr	r25
 102:	61 50       	subi	r22, 0x01	; 1
 104:	a1 f7       	brne	.-24     	; 0xee
 106:	08 95       	ret

00000108 <read_temperature>:
	}
}

void read_temperature(void)
{
 108:	ff 92       	push	r15
 10a:	0f 93       	push	r16
 10c:	1f 93       	push	r17
 10e:	cf 93       	push	r28
 110:	df 93       	push	r29
	float tt = 0;
	uchar temp,a,b,dot;
	uchar data=0;
	
	Init_DS18B20();
 112:	b8 df       	rcall	.-144    	; 0x84
	write_ds18b20(0xCC); // 跳过读序号列号的操作
 114:	8c ec       	ldi	r24, 0xCC	; 204
 116:	e5 df       	rcall	.-54     	; 0xe2
	write_ds18b20(0x44); // 启动温度转换
 118:	84 e4       	ldi	r24, 0x44	; 68
 11a:	e3 df       	rcall	.-58     	; 0xe2

	Init_DS18B20();
 11c:	b3 df       	rcall	.-154    	; 0x84
	write_ds18b20(0xCC); //跳过读序号列号的操作
 11e:	8c ec       	ldi	r24, 0xCC	; 204
 120:	e0 df       	rcall	.-64     	; 0xe2
	write_ds18b20(0xBE); //读取温度寄存器
 122:	8e eb       	ldi	r24, 0xBE	; 190
 124:	de df       	rcall	.-68     	; 0xe2
	
	temperature_low = read_ds18b20();	//先读取低字节
 126:	c1 df       	rcall	.-126    	; 0xaa
 128:	80 93 75 00 	sts	0x0075, r24
	temperature_high= read_ds18b20();	//后读取高字节
 12c:	be df       	rcall	.-132    	; 0xaa
 12e:	80 93 74 00 	sts	0x0074, r24

	temp=temperature_high<<4;				//取高字节的低四位
 132:	f8 2e       	mov	r15, r24
 134:	ff 0c       	add	r15, r15
 136:	ff 0c       	add	r15, r15
 138:	ff 0c       	add	r15, r15
 13a:	ff 0c       	add	r15, r15
	temp+=temperature_low>>4;				//取低字节的高四位再相加得温度计数的整数部分数值
 13c:	80 91 75 00 	lds	r24, 0x0075
 140:	98 2f       	mov	r25, r24
 142:	92 95       	swap	r25
 144:	9f 70       	andi	r25, 0x0F	; 15
 146:	f9 0e       	add	r15, r25
	dot = temperature_low&0x0f;				//取低字节的低四位得小数部分的相对值
 148:	8f 70       	andi	r24, 0x0F	; 15
 14a:	99 27       	eor	r25, r25
	
	
	if(temp>0x80)//负数
 14c:	20 e8       	ldi	r18, 0x80	; 128
 14e:	2f 15       	cp	r18, r15
 150:	d0 f4       	brcc	.+52     	; 0x186
	{	
		tt=((~(dot-1))&0x0f)*0.0625;		//求相对值的原码再*0.0625得小数部分的真实值
 152:	90 95       	com	r25
 154:	81 95       	neg	r24
 156:	9f 4f       	sbci	r25, 0xFF	; 255
 158:	8f 70       	andi	r24, 0x0F	; 15
 15a:	90 70       	andi	r25, 0x00	; 0
 15c:	aa 27       	eor	r26, r26
 15e:	97 fd       	sbrc	r25, 7
 160:	a0 95       	com	r26
 162:	ba 2f       	mov	r27, r26
 164:	bc 01       	movw	r22, r24
 166:	cd 01       	movw	r24, r26
 168:	ad d0       	rcall	.+346    	; 0x2c4
 16a:	dc 01       	movw	r26, r24
 16c:	cb 01       	movw	r24, r22
 16e:	20 e0       	ldi	r18, 0x00	; 0
 170:	30 e0       	ldi	r19, 0x00	; 0
 172:	40 e8       	ldi	r20, 0x80	; 128
 174:	5d e3       	ldi	r21, 0x3D	; 61
 176:	bc 01       	movw	r22, r24
 178:	cd 01       	movw	r24, r26
 17a:	ee d0       	rcall	.+476    	; 0x358
 17c:	ec 01       	movw	r28, r24
 17e:	db 01       	movw	r26, r22
		temp=~temp;
 180:	f0 94       	com	r15
		DISP_BUFFER[0] = 10; //Write_Data( '-' );	//bit0为负,显示'-'
 182:	8a e0       	ldi	r24, 0x0A	; 10
 184:	18 c0       	rjmp	.+48     	; 0x1b6
	}
	else
	{
		tt=dot*0.0625;						//求相对值的原码再*0.0625得小数部分的真实值
 186:	aa 27       	eor	r26, r26
 188:	97 fd       	sbrc	r25, 7
 18a:	a0 95       	com	r26
 18c:	ba 2f       	mov	r27, r26
 18e:	bc 01       	movw	r22, r24
 190:	cd 01       	movw	r24, r26
 192:	98 d0       	rcall	.+304    	; 0x2c4
 194:	dc 01       	movw	r26, r24
 196:	cb 01       	movw	r24, r22
 198:	20 e0       	ldi	r18, 0x00	; 0
 19a:	30 e0       	ldi	r19, 0x00	; 0
 19c:	40 e8       	ldi	r20, 0x80	; 128
 19e:	5d e3       	ldi	r21, 0x3D	; 61
 1a0:	bc 01       	movw	r22, r24
 1a2:	cd 01       	movw	r24, r26
 1a4:	d9 d0       	rcall	.+434    	; 0x358
 1a6:	ec 01       	movw	r28, r24
 1a8:	db 01       	movw	r26, r22
		data=temp/100;
 1aa:	8f 2d       	mov	r24, r15
 1ac:	64 e6       	ldi	r22, 0x64	; 100
 1ae:	25 d1       	rcall	.+586    	; 0x3fa
		if(data==1)
 1b0:	81 30       	cpi	r24, 0x01	; 1
 1b2:	09 f0       	breq	.+2      	; 0x1b6
			DISP_BUFFER[0] = data;//Write_Data( flash_array[ data ] );	//bit0,如果最高位为1则显示
		else
			DISP_BUFFER[0] = 11;//Write_Data( ' '  );				//bit0,如果最高位为0则消隐
 1b4:	8b e0       	ldi	r24, 0x0B	; 11
 1b6:	80 93 60 00 	sts	0x0060, r24
	}
	//小数部分
	tt = tt*1000;							//放大一1000位
 1ba:	20 e0       	ldi	r18, 0x00	; 0
 1bc:	30 e0       	ldi	r19, 0x00	; 0

⌨️ 快捷键说明

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