📄 uart_main.lst
字号:
__start:
__text_start:
46 EFCF LDI R28,0xFF
47 E1D0 LDI R29,0x10
48 BFCD OUT 0x3D,R28
49 BFDE OUT 0x3E,R29
4A 51CE SUBI R28,0x1E
4B 40D0 SBCI R29,0
4C EA0A LDI R16,0xAA
4D 8308 STD Y+0,R16
4E 2400 CLR R0
4F E0E0 LDI R30,0
50 E0F1 LDI R31,1
51 E011 LDI R17,1
52 30E1 CPI R30,1
53 07F1 CPC R31,R17
54 F011 BEQ 0x0057
55 9201 ST R0,Z+
56 CFFB RJMP 0x0052
57 8300 STD Z+0,R16
58 E8EC LDI R30,0x8C
59 E0F0 LDI R31,0
5A E0A0 LDI R26,0
5B E0B1 LDI R27,1
5C E010 LDI R17,0
5D E000 LDI R16,0
5E BF0B OUT 0x3B,R16
5F 38EC CPI R30,0x8C
60 07F1 CPC R31,R17
61 F021 BEQ 0x0066
62 95C8 LPM
63 9631 ADIW R30,1
64 920D ST R0,X+
65 CFF9 RJMP 0x005F
66 940E 0098 CALL _main
_exit:
68 CFFF RJMP _exit
FILE: D:\16实验程序\串口通信\单片机间通信\主机\uart1.h
(0001) #define uchar unsigned char
(0002) uchar rx_data;
(0003)
(0004) //端口初始化
(0005) void port_init(void)
(0006) {
(0007) PORTA = 0x00;
_port_init:
69 2422 CLR R2
6A BA2B OUT 0x1B,R2
(0008) DDRA = 0x00;
6B BA2A OUT 0x1A,R2
(0009) PORTB = 0x00;
6C BA28 OUT 0x18,R2
(0010) DDRB = 0x00;
6D BA27 OUT 0x17,R2
(0011) PORTC = 0x00; //m103 output only
6E BA25 OUT 0x15,R2
(0012) DDRC = 0x00;
6F BA24 OUT 0x14,R2
(0013) PORTD = 0x00;
70 BA22 OUT 0x12,R2
(0014) DDRD = 0x00;
71 BA21 OUT 0x11,R2
72 9508 RET
(0015) }
(0016)
(0017) //串行口初始化
(0018) void uart0_init(void)
(0019) {
(0020) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
73 2422 CLR R2
74 B82A OUT 0x0A,R2
(0021) UCSRA = 0x00;
75 B82B OUT 0x0B,R2
(0022) UCSRC = BIT(URSEL) | 0x06;
76 E886 LDI R24,0x86
77 BD80 OUT 0x20,R24
(0023) UBRRL = 0x19; //set baud rate lo
78 E189 LDI R24,0x19
79 B989 OUT 0x09,R24
(0024) UBRRH = 0x00; //set baud rate hi
7A BC20 OUT 0x20,R2
(0025) UCSRB = 0x18;
7B E188 LDI R24,0x18
7C B98A OUT 0x0A,R24
7D 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:
7E 94F8 BCLR 7
(0033) port_init();
7F DFE9 RCALL _port_init
(0034) uart0_init();
80 DFF2 RCALL _uart0_init
(0035)
(0036) MCUCR = 0x00;
81 2422 CLR R2
82 BE25 OUT 0x35,R2
(0037) GICR = 0x00;
83 BE2B OUT 0x3B,R2
(0038) TIMSK = 0x00; //timer interrupt sources
84 BE29 OUT 0x39,R2
(0039) SEI(); //re-enable interrupts
85 9478 BSET 7
86 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
87 9B5D SBIS 0x0B,5
88 CFFE RJMP _uart_tx
(0047) UDR=txc;
89 B90C OUT 0x0C,R16
8A 9508 RET
(0048) }
(0049)
(0050) //查询接收
(0051) uchar rx_c()
(0052) {
(0053) PORTC|=(1<<2);
_rx_c:
8B 9AAA SBI 0x15,2
(0054) while(!(UCSRA&(1<<RXC)));
8C 9B5F SBIS 0x0B,7
8D CFFE RJMP 0x008C
(0055) PORTC|=(1<<3);
8E 9AAB SBI 0x15,3
(0056) return UDR;
8F B10C IN R16,0x0C
90 9508 RET
FILE: D:\16实验程序\串口通信\单片机间通信\主机\uart_main.c
(0001) //串口通信的主机程序
(0002) //发送数据并等待接收数据,收到数据与发送数据对比,正确继续,错误闪烁
(0003) //led显示数据
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include "uart1.h"
(0007) #define uint unsigned int
(0008)
(0009) ms(uint aa)
(0010) {
(0011) for(;aa>0;aa--);
_ms:
aa --> R16
91 C002 RJMP 0x0094
92 5001 SUBI R16,1
93 4010 SBCI R17,0
94 3000 CPI R16,0
95 0701 CPC R16,R17
96 F7D9 BNE 0x0092
97 9508 RET
(0012) }
(0013)
(0014) main()
(0015) {
(0016) uchar i=0,rx_temp;
_main:
rx_temp --> R12
i --> R10
98 24AA CLR R10
(0017) init_devices(); //初始化
99 DFE4 RCALL _init_devices
(0018) DDRD=0xff;
9A EF8F LDI R24,0xFF
9B BB81 OUT 0x11,R24
(0019) PORTD=0x00;
9C 2422 CLR R2
9D BA22 OUT 0x12,R2
(0020) ms(60000);
9E E600 LDI R16,0x60
9F EE1A LDI R17,0xEA
A0 DFF0 RCALL _ms
A1 C033 RJMP 0x00D5
(0021) while(1)
(0022) {
(0023) uart_tx(i); //发送数据i
A2 2D0A MOV R16,R10
A3 DFE3 RCALL _uart_tx
(0024) rx_temp=rx_c(); //查询接收
A4 DFE6 RCALL _rx_c
A5 2EC0 MOV R12,R16
(0025) if(rx_temp==i) //验证发送接收是否正确
A6 150A CP R16,R10
A7 F561 BNE 0x00D4
(0026) {
(0027) i++;
A8 94A3 INC R10
(0028) PORTD=~i<<2;
A9 2C2A MOV R2,R10
AA 9420 COM R2
AB 0C22 LSL R2
AC 0C22 LSL R2
AD BA22 OUT 0x12,R2
(0029) ms(60000);
AE E600 LDI R16,0x60
AF EE1A LDI R17,0xEA
B0 DFE0 RCALL _ms
(0030) ms(60000);
B1 E600 LDI R16,0x60
B2 EE1A LDI R17,0xEA
B3 DFDD RCALL _ms
(0031) ms(60000);
B4 E600 LDI R16,0x60
B5 EE1A LDI R17,0xEA
B6 DFDA RCALL _ms
(0032) ms(60000);
B7 E600 LDI R16,0x60
B8 EE1A LDI R17,0xEA
B9 DFD7 RCALL _ms
(0033) ms(60000);
BA E600 LDI R16,0x60
BB EE1A LDI R17,0xEA
BC DFD4 RCALL _ms
(0034) }
BD C017 RJMP 0x00D5
(0035) else //通信错误
(0036) {
(0037) while(1)
(0038) {
(0039) PORTD=0x00;
BE 2422 CLR R2
BF BA22 OUT 0x12,R2
(0040) ms(60000);
C0 E600 LDI R16,0x60
C1 EE1A LDI R17,0xEA
C2 DFCE RCALL _ms
(0041) ms(60000);
C3 E600 LDI R16,0x60
C4 EE1A LDI R17,0xEA
C5 DFCB RCALL _ms
(0042) ms(60000);
C6 E600 LDI R16,0x60
C7 EE1A LDI R17,0xEA
C8 DFC8 RCALL _ms
(0043) PORTD=0xff;
C9 EF8F LDI R24,0xFF
CA BB82 OUT 0x12,R24
(0044) ms(60000);
CB E600 LDI R16,0x60
CC EE1A LDI R17,0xEA
CD DFC3 RCALL _ms
(0045) ms(60000);
CE E600 LDI R16,0x60
CF EE1A LDI R17,0xEA
D0 DFC0 RCALL _ms
(0046) ms(60000);
FILE: <library>
D1 E600 LDI R16,0x60
D2 EE1A LDI R17,0xEA
D3 DFBD RCALL _ms
D4 CFE9 RJMP 0x00BE
D5 CFCC RJMP 0x00A2
D6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -