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

📄 main.lss

📁 avr单片机操作温度传感器18B20的软件含仿真。
💻 LSS
📖 第 1 页 / 共 3 页
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000003f6  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         0000001e  00800060  000003f6  0000048a  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000002  0080007e  0080007e  000004a8  2**0
                  ALLOC
  3 .noinit       00000000  00800080  00800080  000004a8  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  000004a8  2**0
                  CONTENTS
  5 .stab         00001014  00000000  00000000  000004a8  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      0000088d  00000000  00000000  000014bc  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54
   4:	0c 94 45 00 	jmp	0x8a
   8:	0c 94 45 00 	jmp	0x8a
   c:	0c 94 45 00 	jmp	0x8a
  10:	0c 94 45 00 	jmp	0x8a
  14:	0c 94 45 00 	jmp	0x8a
  18:	0c 94 45 00 	jmp	0x8a
  1c:	0c 94 45 00 	jmp	0x8a
  20:	0c 94 45 00 	jmp	0x8a
  24:	0c 94 45 00 	jmp	0x8a
  28:	0c 94 45 00 	jmp	0x8a
  2c:	0c 94 45 00 	jmp	0x8a
  30:	0c 94 45 00 	jmp	0x8a
  34:	0c 94 45 00 	jmp	0x8a
  38:	0c 94 45 00 	jmp	0x8a
  3c:	0c 94 45 00 	jmp	0x8a
  40:	0c 94 45 00 	jmp	0x8a
  44:	0c 94 45 00 	jmp	0x8a
  48:	0c 94 45 00 	jmp	0x8a
  4c:	0c 94 45 00 	jmp	0x8a
  50:	0c 94 45 00 	jmp	0x8a

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	e6 ef       	ldi	r30, 0xF6	; 246
  68:	f3 e0       	ldi	r31, 0x03	; 3
  6a:	02 c0       	rjmp	.+4      	; 0x70

0000006c <.do_copy_data_loop>:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
  70:	ae 37       	cpi	r26, 0x7E	; 126
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c

00000076 <__do_clear_bss>:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	ae e7       	ldi	r26, 0x7E	; 126
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80

0000007e <.do_clear_bss_loop>:
  7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
  80:	a0 38       	cpi	r26, 0x80	; 128
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e
  86:	0c 94 c2 01 	jmp	0x384

0000008a <__bad_interrupt>:
  8a:	0c 94 00 00 	jmp	0x0

0000008e <DELAY_1ms>:
/**************************************************************************************/  
void DELAY_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<(unsigned int)(XTAL*143-2);i++);
  8e:	8f e1       	ldi	r24, 0x1F	; 31
  90:	96 e0       	ldi	r25, 0x06	; 6
  92:	04 97       	sbiw	r24, 0x04	; 4
  94:	97 ff       	sbrs	r25, 7
  96:	fd cf       	rjmp	.-6      	; 0x92
  98:	08 95       	ret

0000009a <DELAY_nms>:
  }
/**************************************************************************************/
//函数名	    :main
//属性		:私有
//功能		:主函数
//输入参数	:
//输出参数	:
//返回值	:
//修改日期	:
//修改人	:
/**************************************************************************************/  
void DELAY_nms(unsigned int n)       //N ms延时函数
  {
  9a:	cf 93       	push	r28
  9c:	df 93       	push	r29
   unsigned int i=0;
   for (i=0;i<n;i++)
  9e:	00 97       	sbiw	r24, 0x00	; 0
  a0:	29 f0       	breq	.+10     	; 0xac
  a2:	ec 01       	movw	r28, r24
   DELAY_1ms();
  a4:	0e 94 47 00 	call	0x8e
  a8:	21 97       	sbiw	r28, 0x01	; 1
  aa:	e1 f7       	brne	.-8      	; 0xa4
  ac:	df 91       	pop	r29
  ae:	cf 91       	pop	r28
  b0:	08 95       	ret

000000b2 <ds18b20_config>:
*  配置(使能)AVR与DS18B20的接口 
*/ 
void ds18b20_config(void) 
{ 
    DDRD  &= ~DQ_18B20;   // 输入模式(上电时为高电平) 
  b2:	8b 98       	cbi	0x11, 3	; 17
    PORTD &= ~DQ_18B20;   // 输出锁存器写0,以后不再更改 
  b4:	93 98       	cbi	0x12, 3	; 18
  b6:	08 95       	ret

000000b8 <ds18b20_reset>:
} 

/*------------------------------------------------------- 
*    复位1-wire总线,并探测是否有温度芯片DS18B20(TO-92 
*  封装)挂在总线上,有返回SUCC,没有返回FAIL 
*/ 
unsigned char ds18b20_reset(void) 
{ 
    unsigned char bus_flag; 

    DQ_TO_0();      // 设置1-wire总线为低电平(占领总线)... 
  b8:	8b 9a       	sbi	0x11, 3	; 17
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
  ba:	83 e7       	ldi	r24, 0x73	; 115
  bc:	97 e0       	ldi	r25, 0x07	; 7
	__asm__ volatile (
  be:	01 97       	sbiw	r24, 0x01	; 1
  c0:	f1 f7       	brne	.-4      	; 0xbe
       把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。 
     */ 
    wait_us(690);   // 490us 

    cli();          // 下面这段时间要求比较严格,为保险起见,关中断 
  c2:	f8 94       	cli
    DQ_TO_1();      // 设置1-wire总线为高电平(释放总线) 
  c4:	8b 98       	cbi	0x11, 3	; 17
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
  c6:	81 ef       	ldi	r24, 0xF1	; 241
  c8:	90 e0       	ldi	r25, 0x00	; 0
	__asm__ volatile (
  ca:	01 97       	sbiw	r24, 0x01	; 1
  cc:	f1 f7       	brne	.-4      	; 0xca
     */ 
    wait_us(87.5);  // 最佳时间: 60us+7.5us!(忙延时,只是一种策略) 
     
    // 探测总线上是否有器件     
    if(DQ_status()) bus_flag=FAIL;   // 复位单总线但没有发现有器件在线 
  ce:	83 9b       	sbis	0x10, 3	; 16
  d0:	02 c0       	rjmp	.+4      	; 0xd6
  d2:	20 e0       	ldi	r18, 0x00	; 0
  d4:	01 c0       	rjmp	.+2      	; 0xd8
    else bus_flag=SUCC;              // 复位单总线并发现有器件在线 
  d6:	21 e0       	ldi	r18, 0x01	; 1
     
    sei();          // 退出临界代码区(开中断) 
  d8:	78 94       	sei
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
  da:	81 e8       	ldi	r24, 0x81	; 129
  dc:	96 e0       	ldi	r25, 0x06	; 6
	__asm__ volatile (
  de:	01 97       	sbiw	r24, 0x01	; 1
  e0:	f1 f7       	brne	.-4      	; 0xde
     */ 
    wait_us(690-87.5);   // 490-67.5us 

    return(bus_flag); 
} 
  e2:	82 2f       	mov	r24, r18
  e4:	99 27       	eor	r25, r25
  e6:	08 95       	ret

000000e8 <ds18b20_write>:

/*-------------------------------------------------------- 
*  写命令或数据到温度芯片DS18B20(发送一个字节) 
*/ 
void ds18b20_write(unsigned char dat) 
{ 
  e8:	28 2f       	mov	r18, r24
  ea:	37 e0       	ldi	r19, 0x07	; 7
    unsigned char count; 

    // 每个字节共8位,一次发一位 
    for(count=0; count<8; count++) { 
        cli();                   // 保证绝对不会发生中断! 
  ec:	f8 94       	cli
        DQ_TO_0();               // 设置1-wire总线为低电平 
  ee:	8b 9a       	sbi	0x11, 3	; 17
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
  f0:	8b e0       	ldi	r24, 0x0B	; 11
  f2:	90 e0       	ldi	r25, 0x00	; 0
	__asm__ volatile (
  f4:	01 97       	sbiw	r24, 0x01	; 1
  f6:	f1 f7       	brne	.-4      	; 0xf4
        cli();                   // 保证绝对不会发生中断! 
        DQ_TO_0();               // 设置1-wire总线为低电平 
        wait_us(4);              // about 2us 
         
        if(dat&0x01) DQ_TO_1();  // 并串转换,先低位后高位 
  f8:	20 ff       	sbrs	r18, 0
  fa:	02 c0       	rjmp	.+4      	; 0x100
  fc:	8b 98       	cbi	0x11, 3	; 17
  fe:	01 c0       	rjmp	.+2      	; 0x102
        else DQ_TO_0(); 
 100:	8b 9a       	sbi	0x11, 3	; 17
        dat >>= 1;               // 下一位做好准备 
 102:	26 95       	lsr	r18
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
 104:	82 ee       	ldi	r24, 0xE2	; 226
 106:	90 e0       	ldi	r25, 0x00	; 0
	__asm__ volatile (
 108:	01 97       	sbiw	r24, 0x01	; 1
 10a:	f1 f7       	brne	.-4      	; 0x108
         
        // 60us~120us(实际不能到120us, 因为其它语句也用时间了!) 
        wait_us(82);             // 62us 
         
        DQ_TO_1(); 
 10c:	8b 98       	cbi	0x11, 3	; 17
        sei();                   // 恢复系统中断 
 10e:	78 94       	sei
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
 110:	8b e0       	ldi	r24, 0x0B	; 11
 112:	90 e0       	ldi	r25, 0x00	; 0
	__asm__ volatile (
 114:	01 97       	sbiw	r24, 0x01	; 1
 116:	f1 f7       	brne	.-4      	; 0x114
{ 
    unsigned char count; 

    // 每个字节共8位,一次发一位 
    for(count=0; count<8; count++) { 
 118:	31 50       	subi	r19, 0x01	; 1
 11a:	37 ff       	sbrs	r19, 7
 11c:	e7 cf       	rjmp	.-50     	; 0xec
 11e:	08 95       	ret

00000120 <ds18b20_read>:
        cli();                   // 保证绝对不会发生中断! 
        DQ_TO_0();               // 设置1-wire总线为低电平 
        wait_us(4);              // about 2us 
         
        if(dat&0x01) DQ_TO_1();  // 并串转换,先低位后高位 
        else DQ_TO_0(); 
        dat >>= 1;               // 下一位做好准备 
         
        // 60us~120us(实际不能到120us, 因为其它语句也用时间了!) 
        wait_us(82);             // 62us 
         
        DQ_TO_1(); 
        sei();                   // 恢复系统中断 
        wait_us(4);              // 2us 
		} 
} 

/*--------------------------------------------------------- 
*  从温度芯片DS18B20读配置或数据(接收一个字节) 
*/ 
unsigned char ds18b20_read(void) 
{ 
    unsigned char count,dat; 

    dat = 0x00;       // 数据接收准备 
 120:	20 e0       	ldi	r18, 0x00	; 0
 122:	37 e0       	ldi	r19, 0x07	; 7
     
    // 每个字节共8位,一次收一位 
    for(count=0; count<8; count++) { 
        cli();        // 保证绝对不会发生中断! 
 124:	f8 94       	cli
         
        // 从总线拉低到读总线状态,不能大于15us! 
        DQ_TO_0();    // 设置1-wire总线为低电平(拉低总线以同步) 
 126:	8b 9a       	sbi	0x11, 3	; 17
    milliseconds can be achieved.
 */
static __inline__ void
_delay_loop_2(uint16_t __count)
{
 128:	8b e0       	ldi	r24, 0x0B	; 11
 12a:	90 e0       	ldi	r25, 0x00	; 0
	__asm__ volatile (
 12c:	01 97       	sbiw	r24, 0x01	; 1
 12e:	f1 f7       	brne	.-4      	; 0x12c
         
        // 从总线拉低到读总线状态,不能大于15us! 
        DQ_TO_0();    // 设置1-wire总线为低电平(拉低总线以同步) 
        wait_us(4);   // 2us 

⌨️ 快捷键说明

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