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

📄 main.lst

📁 51单片机上实现tcp/ip的源代码
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  05/27/2008 11:02:09 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\RUN\main.obj
COMPILER INVOKED BY: D:\Keil7_06\C51\BIN\C51.EXE main.c OBJECT(.\RUN\main.obj)

stmt level    source

   1          /*********************************************************************
   2          *            Copright(c) 2004,张会福 湖南科技大学计算机学院 
   3          *                                               All rights reserved.
   4          *
   5          *文件名称:      main.c
   6          *文件标识: 
   7          *摘    要: 主程序,  串口工作在中断方式的接收和发送,可通过串口显示相关信息以及输入信息
   8          *
   9          *当前版本: V1.0
  10          *完成日期: 2004.4.1
  11          *
  12          *
  13          *********************************************************************/
  14          
  15          /**********************************************************************************************/
  16          
  17          #include "net_cfg.h"
  18          //#include "global.c"           //全局变量以及以太网底层驱动程序
  19          //#include "uart.c"     //串口相关的程序
  20          //#include "arp.c"              //地址解析程序
  21          //#include "udp.c"              //
  22          //#include "icmp.c"             //ping操作的程序
  23          //#include "tcp.c"              //
  24          //#include "input.c"            //串口服务器数据接收程序
  25          //=============================================================================================
  26          
  27          sfr ckcon=0x8f;
  28          
  29          
  30          main()
  31          {
  32   1              unsigned char i;
  33   1              ckcon=0x01;
  34   1              AUXR = 0x00;            //使能P89C668的外部数据区
  35   1              RESET=0;
  36   1              Delay_MS(60);
  37   1              RESET=1;
  38   1              Delay_MS(60);
  39   1              RESET=0;
  40   1              /*********************************************************************************
  41   1              用户可在下面的程序中修改IP地址,只要输入您要设定的IP地址和网关地址分别代替下面程序中
  42   1              字符串的值即可
  43   1              *********************************************************************************/                              
  44   1              My_Ip_Address.dwords = IP_SETTING;//函数的参数就是IP地址,可以直接设定       
  45   1              Gateway_Ip_Address.dwords = GATEWAY_SETTING;    //可在此设置合适的网关值
  46   1              Mask_Ip_Address.dwords=IP_MARK_SETTING;                 //255.255.255.0,子网掩码
  47   1              
  48   1              /********************************************************************************/
  49   1              
  50   1              initial_system();
  51   1              
  52   1              Printf_String("\r\n**********欢迎来到单片网络验世界***************");
  53   1              Printf_String("\r\n当前的 IP = ");
  54   1              Printf_IPStr(My_Ip_Address);
  55   1              Printf_String("\r\n网关的 IP = ");
C51 COMPILER V7.06   MAIN                                                                  05/27/2008 11:02:09 PAGE 2   

  56   1              Printf_IPStr(Gateway_Ip_Address);
  57   1              Printf_String("\r\n子网掩码 Mask= ");
  58   1              Printf_IPStr(Mask_Ip_Address);
  59   1              Printf_String("\r\n");
  60   1              
  61   1              while(1)
  62   1              {
  63   2                      //超时处理把Tcp_Timeout清零Tcp_Timeout每10ms由定时器置位
  64   2                      if(Tcp_Timeout)Process_Tcp_Timeout();//处理TCP超时,Tcp_Timeout标志在中断中置位
  65   2                      //Process_Tcp_Timeout()每10ms处理一次
  66   2                      if(BiSecond)
  67   2                      { //两秒处理一次
  68   3                              BiSecond=0;
  69   3                              if(TCP1024.State==0)    //本地机处于监听状态
  70   3                                      process_command();      //处理串口输入,可引发本地发起通讯
  71   3                              Process_Ping();
  72   3                              Process_Udp_Command();  //
  73   3                              Gateway_Arp_Request();  //对网关的IP进行解析
  74   3                      }
  75   2                      
  76   2                      for(i=0;i<5;i++)
  77   2                      {//检查是否有新的数据包收到,如果有将置位have_new_packet,并将数据包接收进由RxdNetBuff指向的缓冲区
  78   3                              if(Rec_NewPacket())
  79   3                              {
  80   4                                      if(RxdNetBuff.EtherFrame.NextProtocal==0x0806)          //表示收到一个arp请求包
  81   4                                      {
  82   5                                              if(RxdNetBuff.ArpFrame.Operation==0x0001)               //表示收到的数据包是一个ARP请求报文
  83   5                                              {
  84   6                                                      Arp_Answer();
  85   6                                              }       //对ARP请求报文进行回答
  86   5                                              else if( RxdNetBuff.ArpFrame.Operation==0x0002) //表示收到的数据包是一个ARP回答报文
  87   5                                              {
  88   6                                                      Arp_Process();
  89   6                                              }//对ARP回答报文进行处理        
  90   5                                      }
  91   4                                      else if(RxdNetBuff.EtherFrame.NextProtocal==0x0800)     //表示收到的数据包是一个IP数据报
  92   4                                              if((RxdNetBuff.IpFrame.VerandIphLen&0xf0)==0x40)        //表示收到的IP数据报是IPv4版本
  93   4                                                      if(VerifyIpHeadCrc())   //IP首部校验和正确
  94   4                                                      {                                       //这时表示正确地接收到一个ip包,下面按照IP的下层协议类型进行相应处理
  95   5                                                              switch(RxdNetBuff.IpFrame.NextProtocal)
  96   5                                                              {
  97   6                                                              case 1:                 //表示收到的IP数据报为ICMP查询报文(本程序仅对PING操作进行处理)
  98   6                                                                      if(RxdNetBuff.IcmpFrame.type==8)                //表示收到的ICMP报文是一个ping的请求包
  99   6                                                                      {
 100   7                                                                              Ping_Answer();
 101   7                                                                      }                                       //PING回答
 102   6                                                                      else if(RxdNetBuff.IcmpFrame.type==0)   //表示收到的ICMP报文是一个ping的应答包
 103   6                                                                      {
 104   7                                                                              Ping_Echo();
 105   7                                                                      }                                               //PING操作的信息在本地回显,本程序通过串口实现
 106   6                                                                      break;
 107   6                                                              case 6:                 //IPFrame的下层协议字段为6表示下层协议为TCP,表示收到TCP报文
 108   6                                                                      Process_Tcp();
 109   6                                                                      break;
 110   6                                                              case 0x11:              //IPFrame的下层协议字段为17表示下层协议UDP,表示收到UDP报文
 111   6                                                                      Process_Udp();
 112   6                                                                      break;
 113   6                                                              default:;
 114   6                                                              }
 115   5                                                      }
 116   4                              }
 117   3                      }
C51 COMPILER V7.06   MAIN                                                                  05/27/2008 11:02:09 PAGE 3   

 118   2              }
 119   1      }
 120          
 121          /**********************************************************************
 122          **函数原型:     void    timer0() interrupt 1
 123          **入口参数:     无
 124          **出口参数:     无
 125          **返 回 值:     无
 126          **说    明:     中断函数,10ms中断一次,进行ARP老化处理,设置TCP超时
 127          ************************************************************************/
 128          void timer0() interrupt 1
 129          {
 130   1              //工作在16位定时模式,中断时间为10毫秒中断一次,误差小于千分之1,晶振使用22.1184Mhz
 131   1              tl0=9;
 132   1              th0=184;
 133   1              Msec++;
 134   1              Tcp_Timeout=1;  //置位TCP超时标志
 135   1              if(Msec==100)
 136   1              {       //100分频,就是1秒一次
 137   2                      Msec=0;
 138   2                      Sec++;
 139   2                      BiSecond=1;             //置位两秒标志
 140   2                      if(Sec==60)
 141   2                      {
 142   3                              Sec=0;  //每分钟一次
 143   3                              Min++;
 144   3                              if(Min==60)Min=0;
 145   3                              //网关和PING操作对象主机的以太网地址生存时间每秒减一,实际上是ARP老化操作简单处理
 146   3                              if(Gateway_IP_TTL>0)Gateway_IP_TTL=Gateway_IP_TTL-1;
 147   3                              if(Ping_IP_TTL>0)Ping_IP_TTL=Ping_IP_TTL-1;
 148   3                      }
 149   2                      
 150   2              }
 151   1      }
 152          
 153          /**********************************************************************
 154          **函数原型:     void    serial(void) interrupt 4
 155          **入口参数:     无
 156          **出口参数:     无
 157          **返 回 值:     无
 158          **说    明:     串口中断函数:中断函数在接收中断处理中将接收数据放到接收缓冲区
 159          **                :     接收缓冲区ComRxdBuf大小可根据需要进行调整,由两个指针管理
 160          ComRxdWrite和ComRxdRead进行管理;在发送中断处理中将数据由发送
 161          缓冲区输出到串口,输出缓冲区由指针ComTxdRead和ComTxdWrite管理.
 162          在global.c定义了一组对缓冲区进行操作的程序.
 163          ************************************************************************/
 164          void serial(void) interrupt 4
 165          {
 166   1              unsigned char temp;
 167   1              if(ti) 
 168   1              {       //串口发送中断处理
 169   2                      ti=0;
 170   2                      if(ComTxdRead!=ComTxdWrite)//发缓区有数据,继续发送数据
 171   2                      {
 172   3                              sbuf=ComTxdBuf[ComTxdRead];
 173   3                              ComTxdRead++;
 174   3                              if(ComTxdRead==COM_TXD_BUFF_SIZE)
 175   3                                      ComTxdRead=0;
 176   3                              ComTxdBufempty=0;
 177   3                      }
 178   2                      else 
 179   2                      {
C51 COMPILER V7.06   MAIN                                                                  05/27/2008 11:02:09 PAGE 4   

 180   3                              ComTxdBufempty=1;
 181   3                      }
 182   2              }
 183   1              if (ri)
 184   1              {       //串口接收中断处理
 185   2                      ri=0;
 186   2                      temp=sbuf;
 187   2                      ComRxdBuf[ComRxdWrite]=temp;
 188   2                      if(!TcpConnected)
 189   2                      {
 190   3                              Printf_Char(temp);
 191   3                      }
 192   2                      ComRxdWrite++;
 193   2                      if(ComRxdWrite==COM_TXD_BUFF_SIZE)
 194   2                              ComRxdWrite=0;
 195   2                      if(temp==0x0d)
 196   2                      {
 197   3                              if(!TcpConnected)
 198   3                              {
 199   4                                      Printf_Char(0x0a);
 200   4                              }
 201   3                      }
 202   2              }
 203   1      }
 204          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    603    ----
   CONSTANT SIZE    =    126    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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