📄 uart_sub.lst
字号:
__start:
__text_start:
47 EFCF LDI R28,0xFF
48 E1D0 LDI R29,0x10
49 BFCD OUT 0x3D,R28
4A BFDE OUT 0x3E,R29
4B 51CE SUBI R28,0x1E
4C 40D0 SBCI R29,0
4D EA0A LDI R16,0xAA
4E 8308 STD Y+0,R16
4F 2400 CLR R0
50 E0E2 LDI R30,2
51 E0F1 LDI R31,1
52 E011 LDI R17,1
53 30E2 CPI R30,2
54 07F1 CPC R31,R17
55 F011 BEQ 0x0058
56 9201 ST R0,Z+
57 CFFB RJMP 0x0053
58 8300 STD Z+0,R16
59 E8EC LDI R30,0x8C
5A E0F0 LDI R31,0
5B E0A0 LDI R26,0
5C E0B1 LDI R27,1
5D E010 LDI R17,0
5E E000 LDI R16,0
5F BF0B OUT 0x3B,R16
60 38EE CPI R30,0x8E
61 07F1 CPC R31,R17
62 F021 BEQ 0x0067
63 95C8 LPM
64 9631 ADIW R30,1
65 920D ST R0,X+
66 CFF9 RJMP 0x0060
67 940E 00A3 CALL _main
_exit:
69 CFFF RJMP _exit
FILE: D:\16实验程序\串口通信\单片机间通信\从机\uart2.h
(0001) #define uchar unsigned char
(0002) uchar rx_data=0,rx_lab=0;
(0003)
(0004) //端口初始化
(0005) void port_init(void)
(0006) {
(0007) PORTA = 0x00;
_port_init:
6A 2422 CLR R2
6B BA2B OUT 0x1B,R2
(0008) DDRA = 0x00;
6C BA2A OUT 0x1A,R2
(0009) PORTB = 0x00;
6D BA28 OUT 0x18,R2
(0010) DDRB = 0x00;
6E BA27 OUT 0x17,R2
(0011) PORTC = 0x00; //m103 output only
6F BA25 OUT 0x15,R2
(0012) DDRC = 0x00;
70 BA24 OUT 0x14,R2
(0013) PORTD = 0xFF;
71 EF8F LDI R24,0xFF
72 BB82 OUT 0x12,R24
(0014) DDRD = 0xFF;
73 BB81 OUT 0x11,R24
74 9508 RET
(0015) }
(0016)
(0017) //串行口初始化
(0018) void uart0_init(void)
(0019) {
(0020) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
75 2422 CLR R2
76 B82A OUT 0x0A,R2
(0021) UCSRA = 0x00;
77 B82B OUT 0x0B,R2
(0022) UCSRC = BIT(URSEL) | 0x06;
78 E886 LDI R24,0x86
79 BD80 OUT 0x20,R24
(0023) UBRRL = 0x19; //set baud rate lo
7A E189 LDI R24,0x19
7B B989 OUT 0x09,R24
(0024) UBRRH = 0x00; //set baud rate hi
7C BC20 OUT 0x20,R2
(0025) UCSRB = 0x98;
7D E988 LDI R24,0x98
7E B98A OUT 0x0A,R24
7F 9508 RET
(0026) }
(0027)
(0028) //call this routine to initialize all peripherals
(0029) void init_devices(void)
(0030) {
(0031) //stop errant interrupts until set up
(0032) CLI(); //disable all interrupts
_init_devices:
80 94F8 BCLR 7
(0033) port_init();
81 DFE8 RCALL _port_init
(0034) uart0_init();
82 DFF2 RCALL _uart0_init
(0035)
(0036) MCUCR = 0x00;
83 2422 CLR R2
84 BE25 OUT 0x35,R2
(0037) GICR = 0x00;
85 BE2B OUT 0x3B,R2
(0038) TIMSK = 0x00; //timer interrupt sources
86 BE29 OUT 0x39,R2
(0039) SEI(); //re-enable interrupts
87 9478 BSET 7
88 9508 RET
(0040) //all peripherals are now initialized
(0041) }
(0042)
(0043) //发送一个字节数据
(0044) void uart_tx(uchar txc) //send a uchar data
(0045) {
(0046) while(!(UCSRA&(1<<UDRE))); //check send enable
_uart_tx:
txc --> R16
89 9B5D SBIS 0x0B,5
8A CFFE RJMP _uart_tx
(0047) UDR=txc;
8B B90C OUT 0x0C,R16
8C 9508 RET
_uart0_rx_isr:
8D 922A ST R2,-Y
8E 938A ST R24,-Y
8F B62F IN R2,0x3F
90 922A ST R2,-Y
(0048) }
(0049)
(0050) //中断接收
(0051) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0052) void uart0_rx_isr(void)
(0053) {
(0054) rx_data=UDR;
91 B02C IN R2,0x0C
92 9220 0100 STS rx_data,R2
(0055) rx_lab=0x15;
94 E185 LDI R24,0x15
95 9380 0101 STS rx_lab,R24
97 9029 LD R2,Y+
98 BE2F OUT 0x3F,R2
99 9189 LD R24,Y+
9A 9029 LD R2,Y+
9B 9518 RETI
FILE: D:\16实验程序\串口通信\单片机间通信\从机\uart_sub.c
(0001) //串口通信从机程序
(0002) //收到主机发来的数据后发回给主机,并用led显示接收的数据
(0003) #define uint unsigned int
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include "uart2.h"
(0007)
(0008) //延时
(0009) s_ms(uint aa)
(0010) {
(0011) for(;aa>0;aa--);
_s_ms:
aa --> R16
9C C002 RJMP 0x009F
9D 5001 SUBI R16,1
9E 4010 SBCI R17,0
9F 3000 CPI R16,0
A0 0701 CPC R16,R17
A1 F7D9 BNE 0x009D
A2 9508 RET
(0012) }
(0013)
(0014) //主函数
(0015) main()
(0016) {
(0017) init_devices(); //初始化
_main:
A3 DFDC RCALL _init_devices
(0018) DDRD=0xff;
A4 EF8F LDI R24,0xFF
A5 BB81 OUT 0x11,R24
(0019) PORTD=0x00;
A6 2422 CLR R2
A7 BA22 OUT 0x12,R2
(0020) s_ms(60000);
A8 E600 LDI R16,0x60
A9 EE1A LDI R17,0xEA
AA DFF1 RCALL _s_ms
AB C010 RJMP 0x00BC
(0021) while(1)
(0022) {
(0023) if(rx_lab==0x15)//中断标志
AC 9180 0101 LDS R24,rx_lab
AE 3185 CPI R24,0x15
AF F461 BNE 0x00BC
(0024) {
(0025) PORTD=~rx_data<<2; //数码管低两位用于串口通信指示
B0 9020 0100 LDS R2,rx_data
B2 9420 COM R2
B3 0C22 LSL R2
B4 0C22 LSL R2
B5 BA22 OUT 0x12,R2
(0026) uart_tx(rx_data); //向主机发回收到的数据
B6 9100 0100 LDS R16,rx_data
B8 DFD0 RCALL _uart_tx
(0027) rx_lab=0;
FILE: <library>
B9 2422 CLR R2
BA 9220 0101 STS rx_lab,R2
BC CFEF RJMP 0x00AC
BD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -