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

📄 main.lss

📁 atmega16L单片机串口使用范例
💻 LSS
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000024c  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         000000c8  00800060  0000024c  000002e0  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000013  00800128  00800128  000003a8  2**0
                  ALLOC
  3 .noinit       00000000  0080013b  0080013b  000003a8  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  000003a8  2**0
                  CONTENTS
  5 .debug_aranges 00000014  00000000  00000000  000003a8  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_pubnames 00000092  00000000  00000000  000003bc  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   00000180  00000000  00000000  0000044e  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 000000be  00000000  00000000  000005ce  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   00000205  00000000  00000000  0000068c  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    000000c8  00000000  00000000  00000891  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 5e 00 	jmp	0xbc
  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:	11 e0       	ldi	r17, 0x01	; 1
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	ec e4       	ldi	r30, 0x4C	; 76
  68:	f2 e0       	ldi	r31, 0x02	; 2
  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:	a8 32       	cpi	r26, 0x28	; 40
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c

00000076 <__do_clear_bss>:
  76:	11 e0       	ldi	r17, 0x01	; 1
  78:	a8 e2       	ldi	r26, 0x28	; 40
  7a:	b1 e0       	ldi	r27, 0x01	; 1
  7c:	01 c0       	rjmp	.+2      	; 0x80

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

00000080 <.do_clear_bss_start>:
  80:	ab 33       	cpi	r26, 0x3B	; 59
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e
  86:	0c 94 f7 00 	jmp	0x1ee

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

0000008e <put_c>:


void put_c(unsigned char c) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );        //等待发送缓冲器为空
  8e:	5d 9b       	sbis	0x0b, 5	; 11
  90:	fe cf       	rjmp	.-4      	; 0x8e
	UDR=c;                                  //将数据放入缓冲器,发送数据	
  92:	8c b9       	out	0x0c, r24	; 12
  94:	08 95       	ret

00000096 <put_s>:
}

void put_s(unsigned char *ptr)
{
  96:	cf 93       	push	r28
  98:	df 93       	push	r29
  9a:	ec 01       	movw	r28, r24
	while (*ptr)
	{
		put_c(*ptr++);
  9c:	88 81       	ld	r24, Y
  9e:	88 23       	and	r24, r24
  a0:	21 f0       	breq	.+8      	; 0xaa
  a2:	89 91       	ld	r24, Y+
  a4:	0e 94 47 00 	call	0x8e
  a8:	f9 cf       	rjmp	.-14     	; 0x9c
	}
	put_c(0x0D);
  aa:	8d e0       	ldi	r24, 0x0D	; 13
  ac:	0e 94 47 00 	call	0x8e
	put_c(0x0A);  //结尾发送回车换行
  b0:	8a e0       	ldi	r24, 0x0A	; 10
  b2:	0e 94 47 00 	call	0x8e
  b6:	df 91       	pop	r29
  b8:	cf 91       	pop	r28
  ba:	08 95       	ret

000000bc <__vector_11>:
}


SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
  bc:	1f 92       	push	r1
  be:	0f 92       	push	r0
  c0:	0f b6       	in	r0, 0x3f	; 63
  c2:	0f 92       	push	r0
  c4:	11 24       	eor	r1, r1
  c6:	2f 93       	push	r18
  c8:	3f 93       	push	r19
  ca:	4f 93       	push	r20
  cc:	5f 93       	push	r21
  ce:	6f 93       	push	r22
  d0:	7f 93       	push	r23
  d2:	8f 93       	push	r24
  d4:	9f 93       	push	r25
  d6:	af 93       	push	r26
  d8:	bf 93       	push	r27
  da:	ef 93       	push	r30
  dc:	ff 93       	push	r31
	PC_COMMAND=UDR;
  de:	8c b1       	in	r24, 0x0c	; 12
  e0:	80 93 39 01 	sts	0x0139, r24
	switch(PC_COMMAND)
  e4:	80 91 39 01 	lds	r24, 0x0139
  e8:	99 27       	eor	r25, r25
  ea:	81 33       	cpi	r24, 0x31	; 49
  ec:	91 05       	cpc	r25, r1
  ee:	69 f0       	breq	.+26     	; 0x10a
  f0:	82 33       	cpi	r24, 0x32	; 50
  f2:	91 05       	cpc	r25, r1
  f4:	1c f4       	brge	.+6      	; 0xfc
  f6:	c0 97       	sbiw	r24, 0x30	; 48
  f8:	21 f0       	breq	.+8      	; 0x102
  fa:	18 c0       	rjmp	.+48     	; 0x12c
  fc:	c2 97       	sbiw	r24, 0x32	; 50
  fe:	49 f0       	breq	.+18     	; 0x112
 100:	15 c0       	rjmp	.+42     	; 0x12c
	{
		case '0':	//0x30 ASCII '0'
			LED0_ON();
 102:	d8 98       	cbi	0x1b, 0	; 27
			put_s("用户输入0#指令");
 104:	80 e6       	ldi	r24, 0x60	; 96
 106:	90 e0       	ldi	r25, 0x00	; 0
 108:	13 c0       	rjmp	.+38     	; 0x130
			break;
		case '1':
			LED1_ON();
 10a:	d9 98       	cbi	0x1b, 1	; 27
			put_s("用户输入1#指令");
 10c:	8f e6       	ldi	r24, 0x6F	; 111
 10e:	90 e0       	ldi	r25, 0x00	; 0
 110:	0f c0       	rjmp	.+30     	; 0x130
			break;
		case '2':
			LED0_OFF();
 112:	d8 9a       	sbi	0x1b, 0	; 27
			LED1_OFF();
 114:	d9 9a       	sbi	0x1b, 1	; 27
			FLAG=!FLAG;
 116:	90 e0       	ldi	r25, 0x00	; 0
 118:	80 91 3a 01 	lds	r24, 0x013A
 11c:	88 23       	and	r24, r24
 11e:	09 f4       	brne	.+2      	; 0x122
 120:	91 e0       	ldi	r25, 0x01	; 1
 122:	90 93 3a 01 	sts	0x013A, r25
			put_s("用户输入2#指令");
 126:	8e e7       	ldi	r24, 0x7E	; 126
 128:	90 e0       	ldi	r25, 0x00	; 0
 12a:	02 c0       	rjmp	.+4      	; 0x130
			break;
		default:
			put_s("用户输入的指令无效!");
 12c:	8d e8       	ldi	r24, 0x8D	; 141
 12e:	90 e0       	ldi	r25, 0x00	; 0
 130:	0e 94 4b 00 	call	0x96
			break;
	}
	/*
	  注意,使用put_s函数发送数据需要一定的时间,如果输入数据的速度过高将会导致数据丢失
	  所以,一般建议中断服务程序的处理时间尽量的短,只做采集数据和设标志位,命令的处理交由主程序来完成
	  这里只是示范简单的命令处理
	*/
	
	RX_BUFFER[RX_index]=PC_COMMAND;		//保存数据到数组里面
 134:	80 91 38 01 	lds	r24, 0x0138
 138:	e8 2f       	mov	r30, r24
 13a:	ff 27       	eor	r31, r31
 13c:	e8 5d       	subi	r30, 0xD8	; 216
 13e:	fe 4f       	sbci	r31, 0xFE	; 254
 140:	80 91 39 01 	lds	r24, 0x0139
 144:	80 83       	st	Z, r24
	RX_index++;
 146:	80 91 38 01 	lds	r24, 0x0138
 14a:	8f 5f       	subi	r24, 0xFF	; 255
 14c:	80 93 38 01 	sts	0x0138, r24
	if (RX_index>=16) RX_index=0;		//防止数组溢出
 150:	80 91 38 01 	lds	r24, 0x0138
 154:	80 31       	cpi	r24, 0x10	; 16
 156:	10 f0       	brcs	.+4      	; 0x15c
 158:	10 92 38 01 	sts	0x0138, r1
 15c:	ff 91       	pop	r31
 15e:	ef 91       	pop	r30
 160:	bf 91       	pop	r27
 162:	af 91       	pop	r26
 164:	9f 91       	pop	r25
 166:	8f 91       	pop	r24
 168:	7f 91       	pop	r23
 16a:	6f 91       	pop	r22
 16c:	5f 91       	pop	r21
 16e:	4f 91       	pop	r20
 170:	3f 91       	pop	r19
 172:	2f 91       	pop	r18
 174:	0f 90       	pop	r0
 176:	0f be       	out	0x3f, r0	; 63
 178:	0f 90       	pop	r0
 17a:	1f 90       	pop	r1
 17c:	18 95       	reti

0000017e <init_USART>:
		
}

void init_USART(void)//USART 初始化
{

    //USART 9600 8, n,1  PC上位机软件(超级终端等)也要设成同样的设置才能通讯
    UCSRC = (1<<URSEL) | 0x06;
 17e:	86 e8       	ldi	r24, 0x86	; 134
 180:	80 bd       	out	0x20, r24	; 32
    //异步,8位数据,无奇偶校验,一个停止位,无倍速,00000110
    /*
    UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
    写访问
    当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
    若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
    
    读访问
    对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
    
    
    没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
    */
    
    //U2X=0时的公式计算
    UBRRL= (F_CPU/BAUDRATE/16-1)%256;
 182:	8f e2       	ldi	r24, 0x2F	; 47
 184:	89 b9       	out	0x09, r24	; 9
    UBRRH= (F_CPU/BAUDRATE/16-1)/256;
 186:	10 bc       	out	0x20, r1	; 32
    //U2X=1时的公式计算
    //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
    //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
    //也可根据数据手册的[波特率设置的例子]查得: UBRR = 47
    //UBRRL = 0x2F; //set baud rate lo
    //UBRRH = 0x00; //set baud rate hi
    UCSRA = 0x00;
 188:	1b b8       	out	0x0b, r1	; 11
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
 18a:	88 e9       	ldi	r24, 0x98	; 152
 18c:	8a b9       	out	0x0a, r24	; 10
 18e:	08 95       	ret

00000190 <pro_coammand>:
    //使能接收中断,使能接收,使能发送
}

void pro_coammand(void) //多字节命令的处理程序
{
 190:	cf 93       	push	r28
	unsigned char i;
	if (RX_index>=10) 
 192:	80 91 38 01 	lds	r24, 0x0138
 196:	8a 30       	cpi	r24, 0x0A	; 10
 198:	40 f1       	brcs	.+80     	; 0x1ea
	{
    	UCSRB&= ~(1<<RXCIE);	//关断USART接收中断
 19a:	57 98       	cbi	0x0a, 7	; 10
		put_c(0x0D);
 19c:	8d e0       	ldi	r24, 0x0D	; 13
 19e:	0e 94 47 00 	call	0x8e
		put_c(0x0A);  //发送回车换行
 1a2:	8a e0       	ldi	r24, 0x0A	; 10
 1a4:	0e 94 47 00 	call	0x8e
		put_s("Hello! 你之前输入的命令列表是:");
 1a8:	81 ea       	ldi	r24, 0xA1	; 161
 1aa:	90 e0       	ldi	r25, 0x00	; 0
 1ac:	0e 94 4b 00 	call	0x96
		for (i=0;i<RX_index;i++) put_c(RX_BUFFER[i]);
 1b0:	c0 e0       	ldi	r28, 0x00	; 0
 1b2:	80 91 38 01 	lds	r24, 0x0138
 1b6:	c8 17       	cp	r28, r24
 1b8:	48 f4       	brcc	.+18     	; 0x1cc
 1ba:	ec 2f       	mov	r30, r28
 1bc:	ff 27       	eor	r31, r31
 1be:	e8 5d       	subi	r30, 0xD8	; 216
 1c0:	fe 4f       	sbci	r31, 0xFE	; 254
 1c2:	80 81       	ld	r24, Z
 1c4:	0e 94 47 00 	call	0x8e
 1c8:	cf 5f       	subi	r28, 0xFF	; 255
 1ca:	f3 cf       	rjmp	.-26     	; 0x1b2
		put_c(0x0D);
 1cc:	8d e0       	ldi	r24, 0x0D	; 13
 1ce:	0e 94 47 00 	call	0x8e
		put_c(0x0A);
 1d2:	8a e0       	ldi	r24, 0x0A	; 10
 1d4:	0e 94 47 00 	call	0x8e
		put_c(0x0D);
 1d8:	8d e0       	ldi	r24, 0x0D	; 13
 1da:	0e 94 47 00 	call	0x8e
		put_c(0x0A);  //发送回车换行
 1de:	8a e0       	ldi	r24, 0x0A	; 10
 1e0:	0e 94 47 00 	call	0x8e
		RX_index=0;				//清零
 1e4:	10 92 38 01 	sts	0x0138, r1
    	UCSRB|= (1<<RXCIE);	//打开USART接收中断
 1e8:	57 9a       	sbi	0x0a, 7	; 10
 1ea:	cf 91       	pop	r28
 1ec:	08 95       	ret

000001ee <main>:
	}
}

int main(void)
{
 1ee:	cf e5       	ldi	r28, 0x5F	; 95
 1f0:	d4 e0       	ldi	r29, 0x04	; 4
 1f2:	de bf       	out	0x3e, r29	; 62
 1f4:	cd bf       	out	0x3d, r28	; 61

    //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
    PORTB =0xFF;										//不用的管脚使能内部上拉电阻。
 1f6:	9f ef       	ldi	r25, 0xFF	; 255
 1f8:	98 bb       	out	0x18, r25	; 24
    PORTC =0xFF;
 1fa:	95 bb       	out	0x15, r25	; 21
    DDRA  =(1<<LED2)|(1<<LED1)|(1<<LED0);				//输出
 1fc:	8b e0       	ldi	r24, 0x0B	; 11
 1fe:	8a bb       	out	0x1a, r24	; 26
    PORTA =((1<<LED2)|(1<<LED1)|(1<<LED0));			//高电平,灯灭
 200:	8b bb       	out	0x1b, r24	; 27
    DDRD  =(1<<PIN_TXD);								//TXD为输出
 202:	82 e0       	ldi	r24, 0x02	; 2
 204:	81 bb       	out	0x11, r24	; 17
    PORTD =0xFF;
 206:	92 bb       	out	0x12, r25	; 18

    FLAG=0;
 208:	10 92 3a 01 	sts	0x013A, r1
	init_USART();
 20c:	0e 94 bf 00 	call	0x17e
	put_s("你好!");
 210:	81 ec       	ldi	r24, 0xC1	; 193
 212:	90 e0       	ldi	r25, 0x00	; 0
 214:	0e 94 4b 00 	call	0x96
	put_s("这是一个简单的串口实验程序");
 218:	88 ec       	ldi	r24, 0xC8	; 200
 21a:	90 e0       	ldi	r25, 0x00	; 0
 21c:	0e 94 4b 00 	call	0x96
	put_s("你可以在电脑上的超级终端程按下[0][1][2]按键,模拟用户板上的按键操作");
 220:	83 ee       	ldi	r24, 0xE3	; 227
 222:	90 e0       	ldi	r25, 0x00	; 0
 224:	0e 94 4b 00 	call	0x96
    sei();					//使能全局中断
 228:	78 94       	sei
    while (1)
    {
        while (FLAG==0) pro_coammand();
 22a:	80 91 3a 01 	lds	r24, 0x013A
 22e:	88 23       	and	r24, r24
 230:	19 f4       	brne	.+6      	; 0x238
 232:	0e 94 c8 00 	call	0x190
 236:	f9 cf       	rjmp	.-14     	; 0x22a
        LED2_ON();			//如果FLAG不加volatile限定(即has_volatile=0),程序将永远都运行不到这里。
 238:	db 98       	cbi	0x1b, 3	; 27
        while (FLAG!=0) pro_coammand();
 23a:	80 91 3a 01 	lds	r24, 0x013A
 23e:	88 23       	and	r24, r24
 240:	19 f0       	breq	.+6      	; 0x248
 242:	0e 94 c8 00 	call	0x190
 246:	f9 cf       	rjmp	.-14     	; 0x23a
        LED2_OFF();
 248:	db 9a       	sbi	0x1b, 3	; 27
 24a:	ef cf       	rjmp	.-34     	; 0x22a

⌨️ 快捷键说明

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