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

📄 232toudp.lst

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    01C0 E5CF      LDI	R28,0x5F
    01C1 E0D4      LDI	R29,4
    01C2 BFCD      OUT	0x3D,R28
    01C3 BFDE      OUT	0x3E,R29
    01C4 51C0      SUBI	R28,0x10
    01C5 40D0      SBCI	R29,0
    01C6 EA0A      LDI	R16,0xAA
    01C7 8308      STD	Y+0,R16
    01C8 2400      CLR	R0
    01C9 E8EB      LDI	R30,0x8B
    01CA E0F3      LDI	R31,3
    01CB E013      LDI	R17,3
    01CC 38EB      CPI	R30,0x8B
    01CD 07F1      CPC	R31,R17
    01CE F011      BEQ	0x01D1
    01CF 9201      ST	R0,Z+
    01D0 CFFB      RJMP	0x01CC
    01D1 8300      STD	Z+0,R16
    01D2 E5E4      LDI	R30,0x54
    01D3 E0F0      LDI	R31,0
    01D4 E6A0      LDI	R26,0x60
    01D5 E0B0      LDI	R27,0
    01D6 E013      LDI	R17,3
    01D7 37EF      CPI	R30,0x7F
    01D8 07F1      CPC	R31,R17
    01D9 F021      BEQ	0x01DE
    01DA 95C8      LPM
    01DB 9631      ADIW	R30,1
    01DC 920D      ST	R0,X+
    01DD CFF9      RJMP	0x01D7
    01DE 940E0612  CALL	_main
_exit:
    01E0 CFFF      RJMP	_exit
_CreateCrc:
  H                    --> R22
  temp                 --> R20
  L                    --> R10
  i                    --> R12
  CRCL                 --> Y+10
  CRCH                 --> Y+8
  num                  --> R18
  p                    --> R16
    01E1 940E0787  CALL	push_gset4
FILE: H:\小玩意制作\232转UDP\程序\main.c
(0001) /*##############################################################################
(0002) 功能:232toUDP
(0003) 作者:LHF
(0004) 时间:2006-09
(0005) 版本:V1.0
(0006) ################################################################################
(0007) 资源分配:	PORTC.2~5:JTAG
(0008) ##############################################################################*/
(0009) //##############################################################################
(0010) #include "ENC28j60.h"	
(0011) #pragma interrupt_handler INT0_16:2 //定义INT0的中断服务程序
(0012) #pragma interrupt_handler INT1_17:3 //定义INT1的中断服务程序
(0013) #pragma interrupt_handler Usart_receive:12 //定义接收中断服务程序
(0014) #pragma interrupt_handler Timer0:10 //定义定时计数器0的中断服务程序
(0015) uchar EIR=0;//存放中断请求标志寄存器的值
(0016) uchar Receive_Status[6]={0x00};//存放接收状态向量
(0017) uchar EPKTCNT=0x00;//还没处理的数据包个数,当它为0时才能使PKTIF自动清0以响应下次接收中断
(0018) uchar DateLen=18;//有效数据长度,这里最大不超过203个字节
(0019) uchar MACHead[14]={0x00,0xe0,0x4c,0xc7,0x1b,0x4c,//目标MAC地址
(0020)                    0x11,0x22,0x33,0x44,0x55,0x66,//源MAC地址
(0021)                    0x08,0x00};//上层协议为IP协议
(0022) uchar IpHead[20]={0x45,0x00,
(0023) 	  			  0x00,0x00,//总长度
(0024) 				  0x12,0x34,//标识
(0025) 				  0x40,0x00,//分段偏移量
(0026) 				  0x80,//生存时间
(0027) 				  0x11,//上层协议0x11表示是UDP
(0028) 	  			  0x00,0x00,//IP校验和
(0029) 	  			  0xc0,0xa8,0x01,0x68,//源IP地址,在此修改源IP地址
(0030) 				  0xc0,0xa8,0x01,0x64};//目标IP地址,在此修改目标IP地址
(0031) uchar UDPpacket[255]={0x00,0x00,0x00,0x00,//源IP地址
(0032)                    0xc0,0x00,0x00,0x00,//目标IP地址
(0033) 				   0x00,0x11,//未定义
(0034) 				   0x00,0x00,//UDP报长度为26字节8+18=26//到此都是伪报头共12字节
(0035) 				   
(0036) 				   0x04,0x00,//源端口号1024
(0037) 	               0x04,0x00,//目标端口号1024
(0038) 				   0x00,0x00,//UDP报长度
(0039) 				   0x00,0x00,//UDP校验和//UDP报头共8字节
(0040) 				   
(0041)  				   };//数据部分
(0042) uchar Rec_packet[255]={0x00};//接收到的帧,考虑到M16只有1KRAM,所以这里设定,最大帧不能超过255
(0043) uchar Rec232[255]={0x00};//串口接收到的数据
(0044) uchar usart_number=0;	
(0045) //#######################IP报头校验和计算#######################//
(0046) void CreateCrc(uchar *p,uchar num,uchar CRCH,uchar CRCL)
(0047) //必需先附IpHead值后再校验,CRCH表示数组存放校验和的位置高8位,CRCL表示数组存放校验和的位置低8位
(0048) //num表示数组中元数的个数,如IP包头数组个数为20个
(0049) {uchar i=0;
    01E3 24CC      CLR	R12
(0050)  uchar temp=0,L=0,H=0;
    01E4 2744      CLR	R20
    01E5 24AA      CLR	R10
    01E6 2766      CLR	R22
(0051)  p[CRCH]=0x00;p[CRCL]=0x00;//先将存放校验和的位置那位清0
    01E7 85E8      LDD	R30,Y+8
    01E8 27FF      CLR	R31
    01E9 0FE0      ADD	R30,R16
    01EA 1FF1      ADC	R31,R17
    01EB 2422      CLR	R2
    01EC 8220      STD	Z+0,R2
    01ED 85EA      LDD	R30,Y+10
    01EE 27FF      CLR	R31
    01EF 0FE0      ADD	R30,R16
    01F0 1FF1      ADC	R31,R17
    01F1 8220      STD	Z+0,R2
(0052)  for(i=1;i<num+1;i=i+2){temp=temp+p[i];
    01F2 24CC      CLR	R12
    01F3 94C3      INC	R12
    01F4 C011      RJMP	0x0206
    01F5 2DEC      MOV	R30,R12
    01F6 27FF      CLR	R31
    01F7 0FE0      ADD	R30,R16
    01F8 1FF1      ADC	R31,R17
    01F9 8020      LDD	R2,Z+0
    01FA 0D42      ADD	R20,R2
(0053) 		             if(temp<p[i])L++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
    01FB 2DEC      MOV	R30,R12
    01FC 27FF      CLR	R31
    01FD 0FE0      ADD	R30,R16
    01FE 1FF1      ADC	R31,R17
    01FF 8020      LDD	R2,Z+0
    0200 1542      CP	R20,R2
    0201 F408      BCC	0x0203
    0202 94A3      INC	R10
    0203 2D8C      MOV	R24,R12
    0204 5F8E      SUBI	R24,0xFE
    0205 2EC8      MOV	R12,R24
    0206 2F82      MOV	R24,R18
    0207 5F8F      SUBI	R24,0xFF
    0208 16C8      CP	R12,R24
    0209 F358      BCS	0x01F5
(0054)  for(i=0;i<num;i=i+2){L=L+p[i];
    020A 24CC      CLR	R12
    020B C011      RJMP	0x021D
    020C 2DEC      MOV	R30,R12
    020D 27FF      CLR	R31
    020E 0FE0      ADD	R30,R16
    020F 1FF1      ADC	R31,R17
    0210 8020      LDD	R2,Z+0
    0211 0CA2      ADD	R10,R2
(0055) 		             if(L<p[i])H++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1   
    0212 2DEC      MOV	R30,R12
    0213 27FF      CLR	R31
    0214 0FE0      ADD	R30,R16
    0215 1FF1      ADC	R31,R17
    0216 8020      LDD	R2,Z+0
    0217 14A2      CP	R10,R2
    0218 F408      BCC	0x021A
    0219 9563      INC	R22
    021A 2D8C      MOV	R24,R12
    021B 5F8E      SUBI	R24,0xFE
    021C 2EC8      MOV	R12,R24
    021D 16C2      CP	R12,R18
    021E F368      BCS	0x020C
(0056)  temp=temp+H;//把高出16位的结果与低16位相加
    021F 0F46      ADD	R20,R22
(0057)  if(temp<H){L++;//把高出16位的结果与低16位相加,如果有溢出,则再向高位进位
    0220 1746      CP	R20,R22
    0221 F418      BCC	0x0225
    0222 94A3      INC	R10
(0058)             if(L==0)temp++;}//如果高位再溢出,再加到低位
    0223 F409      BNE	0x0225
    0224 9543      INC	R20
(0059)  p[CRCH]=0xff-L;//结果取反
    0225 2C2A      MOV	R2,R10
    0226 2433      CLR	R3
    0227 EF8F      LDI	R24,0xFF
    0228 E090      LDI	R25,0
    0229 1982      SUB	R24,R2
    022A 0993      SBC	R25,R3
    022B 85E8      LDD	R30,Y+8
    022C 27FF      CLR	R31
    022D 0FE0      ADD	R30,R16
    022E 1FF1      ADC	R31,R17
    022F 8380      STD	Z+0,R24
(0060)  p[CRCL]=0xff-temp;//结果取反
    0230 2E24      MOV	R2,R20
    0231 2433      CLR	R3
    0232 EF8F      LDI	R24,0xFF
    0233 E090      LDI	R25,0
    0234 1982      SUB	R24,R2
    0235 0993      SBC	R25,R3
    0236 85EA      LDD	R30,Y+10
    0237 27FF      CLR	R31
    0238 0FE0      ADD	R30,R16
    0239 1FF1      ADC	R31,R17
    023A 8380      STD	Z+0,R24
(0061) }
    023B 940E0765  CALL	pop_gset4
    023D 9508      RET
_Transmit_Packets:
  i                    --> R20
    023E 940E0768  CALL	push_gset1
    0240 9723      SBIW	R28,3
(0062) 
(0063) //##########################发送UDP数据包##########################//
(0064) void Transmit_Packets(void)
(0065) {uchar i=0;
    0241 2744      CLR	R20
(0066)  enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
    0242 2700      CLR	R16
    0243 940E06F4  CALL	_enc28j60SetBank
(0067)  
(0068)  Write_Control_Register(0x02,0x00);//EWRPTL
    0245 2722      CLR	R18
    0246 E002      LDI	R16,2
    0247 940E0667  CALL	_Write_Control_Register
(0069)  Write_Control_Register(0x03,0x00);//EWRPTH
    0249 2722      CLR	R18
    024A E003      LDI	R16,3
    024B 940E0667  CALL	_Write_Control_Register
(0070)  Write_Control_Register(0x04,0x00);//ETXSTL
    024D 2722      CLR	R18
    024E E004      LDI	R16,4
    024F 940E0667  CALL	_Write_Control_Register
(0071)  Write_Control_Register(0x05,0x00);//ETXSTH
    0251 2722      CLR	R18
    0252 E005      LDI	R16,5
    0253 940E0667  CALL	_Write_Control_Register
(0072)   
(0073)  Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
    0255 E820      LDI	R18,0x80
    0256 E10E      LDI	R16,0x1E
    0257 940E06C8  CALL	_Bit_Field_Set
(0074) 
(0075)  for(i=0;i<8;i++)UDPpacket[i]=IpHead[i+12];//给UDP伪报头部分附IP值
    0259 C00F      RJMP	0x0269
    025A E883      LDI	R24,0x83
    025B E090      LDI	R25,0
    025C 2FE4      MOV	R30,R20
    025D 27FF      CLR	R31
    025E 0FE8      ADD	R30,R24
    025F 1FF9      ADC	R31,R25
    0260 8020      LDD	R2,Z+0
    0261 E88B      LDI	R24,0x8B
    0262 E090      LDI	R25,0
    0263 2FE4      MOV	R30,R20
    0264 27FF      CLR	R31
    0265 0FE8      ADD	R30,R24
    0266 1FF9      ADC	R31,R25
    0267 8220      STD	Z+0,R2
    0268 9543      INC	R20
    0269 3048      CPI	R20,0x8
    026A F378      BCS	0x025A
(0076)  IpHead[3]=DateLen+28;//IP包长度
    026B 91800068  LDS	R24,0x68
    026D 5E84      SUBI	R24,0xE4
    026E 9380007A  STS	0x7A,R24
(0077)  UDPpacket[11]=DateLen+8;//UDP包长度,伪报头,不发送部分
    0270 91800068  LDS	R24,0x68
    0272 5F88      SUBI	R24,0xF8
    0273 93800096  STS	0x96,R24
(0078)  UDPpacket[17]=DateLen+8;//UDP包长度,UDP报头
    0275 91800068  LDS	R24,0x68
    0277 5F88      SUBI	R24,0xF8
    0278 9380009C  STS	0x9C,R24
(0079)  CreateCrc(IpHead,20,10,11);//校验前要对数组中其它元素先附好值
    027A E08B      LDI	R24,0xB
    027B 838A      STD	Y+2,R24
    027C E08A      LDI	R24,0xA
    027D 8388      STD	Y+0,R24
    027E E124      LDI	R18,0x14
    027F E707      LDI	R16,0x77
    0280 E010      LDI	R17,0
    0281 DF5F      RCALL	_CreateCrc
(0080)  CreateCrc(UDPpacket,DateLen+20,18,19);//UDP校验
    0282 E183      LDI	R24,0x13
    0283 838A      STD	Y+2,R24
    0284 E182      LDI	R24,0x12
    0285 8388      STD	Y+0,R24
    0286 91200068  LDS	R18,0x68
    0288 5E2C      SUBI	R18,0xEC
    0289 E80B      LDI	R16,0x8B
    028A E010      LDI	R17,0
    028B DF55      RCALL	_CreateCrc
(0081) Set_CS(0);//使能SPI器件
    028C 2700      CLR	R16
    028D 940E0631  CALL	_Set_CS
(0082)  Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
    028F E70A      LDI	R16,0x7A
    0290 940E06A9  CALL	_Write_Buffer_Memory_date
(0083)  Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
    0292 E00E      LDI	R16,0xE
    0293 940E06A9  CALL	_Write_Buffer_Memory_date
(0084)  
(0085)  for(i=0;i<14;i++)Write_Buffer_Memory_date(MACHead[i]);//MAC首部14字节  
    0295 2744      CLR	R20
    0296 C00A      RJMP	0x02A1
    0297 E689      LDI	R24,0x69
    0298 E090      LDI	R25,0
    0299 2FE4      MOV	R30,R20
    029A 27FF      CLR	R31
    029B 0FE8      ADD	R30,R24
    029C 1FF9      ADC	R31,R25
    029D 8100      LDD	R16,Z+0
    029E 940E06A9  CALL	_Write_Buffer_Memory_date
    02A0 9543      INC	R20
    02A1 304E      CPI	R20,0xE
    02A2 F3A0      BCS	0x0297
(0086)  for(i=0;i<20;i++)Write_Buffer_Memory_date(IpHead[i]);//IP首部20字节
    02A3 2744      CLR	R20
    02A4 C00A      RJMP	0x02AF
    02A5 E787      LDI	R24,0x77
    02A6 E090      LDI	R25,0
    02A7 2FE4      MOV	R30,R20
    02A8 27FF      CLR	R31
    02A9 0FE8      ADD	R30,R24
    02AA 1FF9      ADC	R31,R25
    02AB 8100      LDD	R16,Z+0
    02AC 940E06A9  CALL	_Write_Buffer_Memory_date
    02AE 9543      INC	R20
    02AF 3144      CPI	R20,0x14
    02B0 F3A0      BCS	0x02A5
(0087)  for(i=12;i<DateLen+20;i++)Write_Buffer_Memory_date(UDPpacket[i]);//UDP层去掉伪报头 
    02B1 E04C      LDI	R20,0xC
    02B2 C00A      RJMP	0x02BD
    02B3 E88B      LDI	R24,0x8B
    02B4 E090      LDI	R25,0
    02B5 2FE4      MOV	R30,R20
    02B6 27FF      CLR	R31
    02B7 0FE8      ADD	R30,R24
    02B8 1FF9      ADC	R31,R25
    02B9 8100      LDD	R16,Z+0
    02BA 940E06A9  CALL	_Write_Buffer_Memory_date
    02BC 9543      INC	R20
    02BD 91800068  LDS	R24,0x68
    02BF 5E8C      SUBI	R24,0xEC
    02C0 1748      CP	R20,R24
    02C1 F388      BCS	0x02B3

⌨️ 快捷键说明

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