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

📄 232toudp.lst

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0526 9029      LD	R2,Y+
    0527 BE2F      OUT	0x3F,R2
    0528 91F9      LD	R31,Y+
    0529 91E9      LD	R30,Y+
    052A 9199      LD	R25,Y+
    052B 9189      LD	R24,Y+
    052C 9029      LD	R2,Y+
    052D 9518      RETI
_Timer0:
  i                    --> R20
    052E 940E078B  CALL	push_lset
    0530 940E0768  CALL	push_gset1
(0272) //##############定时器中断0,串行数据流控制
(0273) void Timer0(void)
(0274) {uchar i=0;
    0532 2744      CLR	R20
(0275)  TIMSK=0x00;//关T0中断屏蔽
    0533 2422      CLR	R2
    0534 BE29      OUT	0x39,R2
(0276)  TCNT0=0x00;//
    0535 BE22      OUT	0x32,R2
(0277)  TCCR0=0x00;//T0停止计数
    0536 BE23      OUT	0x33,R2
(0278)  usart_number=usart_number-1;
    0537 91800388  LDS	R24,0x388
    0539 5081      SUBI	R24,1
    053A 93800388  STS	0x388,R24
(0279)  DateLen=usart_number-42;//
    053C 528A      SUBI	R24,0x2A
    053D 93800068  STS	0x68,R24
(0280)  if(Rec232[0]==0x04 && Rec232[1]==0x05 && Rec232[2]==0x06){
    053F 91800289  LDS	R24,0x289
    0541 3084      CPI	R24,4
    0542 F489      BNE	0x0554
    0543 9180028A  LDS	R24,0x28A
    0545 3085      CPI	R24,5
    0546 F469      BNE	0x0554
    0547 9180028B  LDS	R24,0x28B
    0549 3086      CPI	R24,6
    054A F449      BNE	0x0554
(0281)  					putchar(0x4F);putchar(0x4B);putchar(0x21);
    054B E40F      LDI	R16,0x4F
    054C 940E062D  CALL	_putchar
    054E E40B      LDI	R16,0x4B
    054F 940E062D  CALL	_putchar
    0551 E201      LDI	R16,0x21
    0552 940E062D  CALL	_putchar
(0282) 					}//连接成功回答OK!
(0283)  if(Rec232[0]==0x4c && Rec232[1]==0x48 && Rec232[2]==0x46){//是不是LHF,是则发送
    0554 91800289  LDS	R24,0x289
    0556 348C      CPI	R24,0x4C
    0557 F009      BEQ	0x0559
    0558 C047      RJMP	0x05A0
    0559 9180028A  LDS	R24,0x28A
    055B 3488      CPI	R24,0x48
    055C F009      BEQ	0x055E
    055D C042      RJMP	0x05A0
    055E 9180028B  LDS	R24,0x28B
    0560 3486      CPI	R24,0x46
    0561 F009      BEQ	0x0563
    0562 C03D      RJMP	0x05A0
(0284)  					for(i=3;i<15;i++)MACHead[i-3]=Rec232[i];
    0563 E043      LDI	R20,3
    0564 C00F      RJMP	0x0574
    0565 E889      LDI	R24,0x89
    0566 E092      LDI	R25,2
    0567 2FE4      MOV	R30,R20
    0568 27FF      CLR	R31
    0569 0FE8      ADD	R30,R24
    056A 1FF9      ADC	R31,R25
    056B 8020      LDD	R2,Z+0
    056C E686      LDI	R24,0x66
    056D E090      LDI	R25,0
    056E 2FE4      MOV	R30,R20
    056F 27FF      CLR	R31
    0570 0FE8      ADD	R30,R24
    0571 1FF9      ADC	R31,R25
    0572 8220      STD	Z+0,R2
    0573 9543      INC	R20
    0574 304F      CPI	R20,0xF
    0575 F378      BCS	0x0565
(0285)  					for(i=15;i<35;i++)IpHead[i-15]=Rec232[i];
    0576 E04F      LDI	R20,0xF
    0577 C00F      RJMP	0x0587
    0578 E889      LDI	R24,0x89
    0579 E092      LDI	R25,2
    057A 2FE4      MOV	R30,R20
    057B 27FF      CLR	R31
    057C 0FE8      ADD	R30,R24
    057D 1FF9      ADC	R31,R25
    057E 8020      LDD	R2,Z+0
    057F E688      LDI	R24,0x68
    0580 E090      LDI	R25,0
    0581 2FE4      MOV	R30,R20
    0582 27FF      CLR	R31
    0583 0FE8      ADD	R30,R24
    0584 1FF9      ADC	R31,R25
    0585 8220      STD	Z+0,R2
    0586 9543      INC	R20
    0587 3243      CPI	R20,0x23
    0588 F378      BCS	0x0578
(0286)  					for(i=35;i<usart_number+1;i++)UDPpacket[i-23]=Rec232[i];
    0589 E243      LDI	R20,0x23
    058A C00F      RJMP	0x059A
    058B E889      LDI	R24,0x89
    058C E092      LDI	R25,2
    058D 2FE4      MOV	R30,R20
    058E 27FF      CLR	R31
    058F 0FE8      ADD	R30,R24
    0590 1FF9      ADC	R31,R25
    0591 8020      LDD	R2,Z+0
    0592 E784      LDI	R24,0x74
    0593 E090      LDI	R25,0
    0594 2FE4      MOV	R30,R20
    0595 27FF      CLR	R31
    0596 0FE8      ADD	R30,R24
    0597 1FF9      ADC	R31,R25
    0598 8220      STD	Z+0,R2
    0599 9543      INC	R20
    059A 91800388  LDS	R24,0x388
    059C 5F8F      SUBI	R24,0xFF
    059D 1748      CP	R20,R24
    059E F360      BCS	0x058B
(0287)   					Transmit_Packets();}//发送数据
    059F DC9E      RCALL	_Transmit_Packets
(0288)  if(Rec232[0]==0x4d && Rec232[1]==0x41 && Rec232[2]==0x43){//是不是MAC 配置28J60
    05A0 91800289  LDS	R24,0x289
    05A2 348D      CPI	R24,0x4D
    05A3 F009      BEQ	0x05A5
    05A4 C045      RJMP	0x05EA
    05A5 9180028A  LDS	R24,0x28A
    05A7 3481      CPI	R24,0x41
    05A8 F009      BEQ	0x05AA
    05A9 C040      RJMP	0x05EA
    05AA 9180028B  LDS	R24,0x28B
    05AC 3483      CPI	R24,0x43
    05AD F009      BEQ	0x05AF
    05AE C03B      RJMP	0x05EA
(0289)  					for(i=3;i<15;i++)MACHead[i-3]=Rec232[i];
    05AF E043      LDI	R20,3
    05B0 C00F      RJMP	0x05C0
    05B1 E889      LDI	R24,0x89
    05B2 E092      LDI	R25,2
    05B3 2FE4      MOV	R30,R20
    05B4 27FF      CLR	R31
    05B5 0FE8      ADD	R30,R24
    05B6 1FF9      ADC	R31,R25
    05B7 8020      LDD	R2,Z+0
    05B8 E686      LDI	R24,0x66
    05B9 E090      LDI	R25,0
    05BA 2FE4      MOV	R30,R20
    05BB 27FF      CLR	R31
    05BC 0FE8      ADD	R30,R24
    05BD 1FF9      ADC	R31,R25
    05BE 8220      STD	Z+0,R2
    05BF 9543      INC	R20
    05C0 304F      CPI	R20,0xF
    05C1 F378      BCS	0x05B1
(0290)  					for(i=15;i<35;i++)IpHead[i-15]=Rec232[i];
    05C2 E04F      LDI	R20,0xF
    05C3 C00F      RJMP	0x05D3
    05C4 E889      LDI	R24,0x89
    05C5 E092      LDI	R25,2
    05C6 2FE4      MOV	R30,R20
    05C7 27FF      CLR	R31
    05C8 0FE8      ADD	R30,R24
    05C9 1FF9      ADC	R31,R25
    05CA 8020      LDD	R2,Z+0
    05CB E688      LDI	R24,0x68
    05CC E090      LDI	R25,0
    05CD 2FE4      MOV	R30,R20
    05CE 27FF      CLR	R31
    05CF 0FE8      ADD	R30,R24
    05D0 1FF9      ADC	R31,R25
    05D1 8220      STD	Z+0,R2
    05D2 9543      INC	R20
    05D3 3243      CPI	R20,0x23
    05D4 F378      BCS	0x05C4
(0291) 					ENC28J60_Initialize();
    05D5 DE3A      RCALL	_ENC28J60_Initialize
(0292) 					delay(50);
    05D6 E302      LDI	R16,0x32
    05D7 940E0617  CALL	_delay
(0293) 					putchar(0x4C);
    05D9 E40C      LDI	R16,0x4C
    05DA 940E062D  CALL	_putchar
(0294)  					putchar(0x48);
    05DC E408      LDI	R16,0x48
    05DD 940E062D  CALL	_putchar
(0295)  					putchar(0x46);//发送"LHF"通知上位机,
    05DF E406      LDI	R16,0x46
    05E0 940E062D  CALL	_putchar
(0296) 					for(i=0;i<12;i++)putchar(i);//配置成功则返回0,1,2,3,...11
    05E2 2744      CLR	R20
    05E3 C004      RJMP	0x05E8
    05E4 2F04      MOV	R16,R20
    05E5 940E062D  CALL	_putchar
    05E7 9543      INC	R20
    05E8 304C      CPI	R20,0xC
    05E9 F3D0      BCS	0x05E4
(0297) 					}
(0298) 					usart_number=0;
    05EA 2422      CLR	R2
    05EB 92200388  STS	0x388,R2
(0299)  }
    05ED 940E076B  CALL	pop_gset1
    05EF 940E07A2  CALL	pop_lset
    05F1 9518      RETI
(0300) //##############################USART初始化程序###########################//
(0301) void usart_init(void)
(0302) {
(0303)  UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//允许发送和接收
_usart_init:
    05F2 E988      LDI	R24,0x98
    05F3 B98A      OUT	0x0A,R24
(0304)  UBRRL=(fosc/16/(bps+1))%256;
    05F4 E181      LDI	R24,0x11
    05F5 B989      OUT	0x09,R24
(0305)  UBRRH=(fosc/16/(bps+1))/256;
    05F6 2422      CLR	R2
    05F7 BC20      OUT	0x20,R2
(0306)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    05F8 E886      LDI	R24,0x86
    05F9 BD80      OUT	0x20,R24
(0307) } 
    05FA 9508      RET
(0308) //##############################系统初始化程序################################//
(0309) void AVR_Initialize(void)         //初始化
(0310) {
(0311)  DDRA=0xff;	 //
_AVR_Initialize:
    05FB EF8F      LDI	R24,0xFF
    05FC BB8A      OUT	0x1A,R24
(0312)  PORTA=0xff;
    05FD BB8B      OUT	0x1B,R24
(0313)  DDRB=0xff;	 //
    05FE BB87      OUT	0x17,R24
(0314)  PORTB=0xff;
    05FF BB88      OUT	0x18,R24
(0315)  DDRC=0xc3;	 //
    0600 EC83      LDI	R24,0xC3
    0601 BB84      OUT	0x14,R24
(0316)  PORTC=0x00; //
    0602 2422      CLR	R2
    0603 BA25      OUT	0x15,R2
(0317)  DDRD=0xf0;	 //
    0604 EF80      LDI	R24,0xF0
    0605 BB81      OUT	0x11,R24
(0318)  PORTD=0x7f;
    0606 E78F      LDI	R24,0x7F
    0607 BB82      OUT	0x12,R24
(0319) 
(0320)  SPCR=0b01010000;
    0608 E580      LDI	R24,0x50
    0609 B98D      OUT	0x0D,R24
(0321) //关中断(SPIE=0),使能SPI(SPE=1),MSB首先发送(DORD=0),选择微机为主机模式(MSTR=1)
(0322) //空闲时SCK为低电平(CPOL=0),在SCK的上升沿采样(CPHA=0)ENC28J60要求SPI工作在模式0
(0323) //SPR1=0和SPR0=0,SCK=fosc/4
(0324)  SPSR |=0x01;//SPI的速度加倍
    060A 9A70      SBI	0x0E,0
(0325) 	  
(0326)  MCUCR=0x0a;//设置外部中断的中断触发方式为下降沿触发
    060B E08A      LDI	R24,0xA
    060C BF85      OUT	0x35,R24
(0327)  GICR=0xc0;	//通用中断控制寄存器设置,打开中断INT0和INT1
    060D EC80      LDI	R24,0xC0
    060E BF8B      OUT	0x3B,R24
(0328)  SREG=0x80; //开全局中断
    060F E880      LDI	R24,0x80
    0610 BF8F      OUT	0x3F,R24
(0329) }
    0611 9508      RET
(0330) //##################################主程序####################################//
(0331) void main()
(0332) {delay(5);
_main:
    0612 E005      LDI	R16,5
    0613 940E0617  CALL	_delay
(0333)  AVR_Initialize();               //I/O口及中断初始化
    0615 DFE5      RCALL	_AVR_Initialize
(0334)  usart_init();
(0335)  //ENC28J60_Initialize();
(0336)  }
    0616 CFDB      RJMP	_usart_init
_delay:
  i                    --> R20
  k                    --> R16
    0617 940E0768  CALL	push_gset1
FILE: H:\小玩意制作\232转UDP\程序\ENC28j60.c
(0001) #include "ENC28j60.h"	
(0002) uchar PHY_H=0;
(0003) uchar PHY_L=0;
(0004) //################################延时程序################################//
(0005) void delay(uchar k)//
(0006) {uint i=0;
    0619 2744      CLR	R20
    061A 2755      CLR	R21
    061B C009      RJMP	0x0625
(0007)  while(k--){for(i=0;i<8000;i++);}
    061C 2744      CLR	R20
    061D 2755      CLR	R21
    061E C002      RJMP	0x0621
    061F 5F4F      SUBI	R20,0xFF
    0620 4F5F      SBCI	R21,0xFF
    0621 3440      CPI	R20,0x40
    0622 E1EF      LDI	R30,0x1F
    0623 075E      CPC	R21,R30
    0624 F3D0      BCS	0x061F
    0625 2E20      MOV	R2,R16
    0626 2433      CLR	R3
    0627 5001      SUBI	R16,1
    0628 2022      TST	R2
    0629 F791      BNE	0x061C
(0008)  }
    062A 940E076B  CALL	pop_gset1
    062C 9508      RET
(0009) //##########################串行通信##########################//
(0010) void putchar(uchar c)
(0011) {while(!(UCSRA&(1<<UDRE)));//判断上次发送有没有完成
_putchar:
  c                    --> R16
    062D 9B5D      SBIS	0x0B,5
    062E CFFE      RJMP	_putchar
(0012)  UDR=c;}
    062F B90C      OUT	0x0C,R16
    0630 9508      RET
(0013) //##############################选通SPI器件###############################//
(0014) void Set_CS(uchar level)          //
(0015) {if(level)    PORTB |=0x10;        //
_Set_CS:
  level                --> R16
    0631 2300      TST	R16
    0632 F011      BEQ	0x0635
    0633 9AC4      SBI	0x18,4
    0634 C003      RJMP	0x0638
(0016)  else         PORTB &=0xef;        //

⌨️ 快捷键说明

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