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

📄 uart_sub.lst

📁 ATmega16单片机的实验程序
💻 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 + -