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

📄 tcp.c

📁 利用51单片机实现TCP协议。提供已经调试的原程序代码.
💻 C
字号:


#include  <c8051F020.h>                      // AT89S52
#include  <absacc.h>                     // Absolute address access
#include  <string.h>                     // Related to the string
#include  <ctype.h>                     
#include  <stdio.h>                      // Standard input or output
                    



#define uchar unsigned char
#define uint unsigned int

/*#define P0MDIN 0xF1; 
#define P0MDOUT 0xA4; 
#define P1MDOUT 0xA5;
#define P2MDOUT 0xA6;
#define P3MDOUT 0xA7;
#define XBR0 0xE1; 
#define XBR1 0xE2; 
#define XBR2 0xE3; 
#define OSCXCN 0xB1; 
#define OSCICL 0xB3; 
#define OSCICN 0xB2; 
#define FLSCL 0xB6;
#define PSCTL 0x8F;
#define EMI0CN 0xAF;
#define EMI0TC 0xA1;
#define EMI0CF  0xA3;*/

sbit r1=P0^7 ;
sbit r2=P0^6;
   uchar gs0_rx_base,gs1_rx_base,gs2_rx_base, gs3_rx_base;
   uchar gs0_rx_mask,gs1_rx_mask,gs2_rx_mask,gs3_rx_mask;
   uchar gs0_tx_base, gs1_tx_base, gs2_tx_base, gs3_tx_base;
   uchar gs0_tx_mask,gs1_tx_mask,gs2_tx_mask,gs3_tx_mask;
   uchar  data2[]={0};
   uchar data1[]={'A'};

   	void s0_init(void);
	void send(void);
	void Flash_init()
    {  FLSCL=0x81;     
       PSCTL=0x03;   
     }


   void Power_init(void)
     {   PCON=0x00;
     }

    void Osci_init(void)
     {  OSCICN=0x84;    
     }

   void Oscx_init(void)
     {  OSCXCN=0x80;    //晶体振荡器正在运行并且工作稳定.关闭 XTAL1 引脚内部接地
     }

   void Emio_init(void)
      {  EMI0CN=0x00;     //0x0000 -- 0x00FF
         EMI0CF=0x18;
         EMI0TC=0x97;    //地址建立时间=0个SYSCLK周期./WR和/RD脉冲宽度=1个 SYSCLK周期.地址保持时间 = 0  个 SYSCLK周期
       }

   void Xbr_init( void)
       {  
        XBR0=0x00;
        XBR1=0x00;
        XBR2=0x02;
        }

    void Pn_init(void)
        {  
        P0MDOUT=0xFF;
        P1MDOUT=0xFF;
        P2MDOUT=0xFF;
        P3MDOUT=0xFF;
         }
        delay()
        {   
		int d;
     	for(d=0;d<10;d++);
        }
   
       void Wrcmd(j,k,l)
     { 
        r1=0;
        P1=j;
        P2=k;
        P3=l;
        r1=1;
     } 
      
	   Recmd(x,y)
       {
	   int z;
	   r2=0;
	   P1=x;
	   P2=y;
       z=P3;
	   r2=1;
  	   return z;
     	}

      void Send(void)
      {     int t1,t2,t,sn,sn1,sn2,k,a1,a2,a3,a4;
	  		int c1;
			uint  sendsize=10;
 			uchar getoffset,getstartaddress,upsize,leftsize,get_start_address;
   			t1=Recmd(0x04,0x20);
			t2=Recmd(0x04,0x21);
    		t=(t1<<8)||t2;
			if(t<sendsize)
			{
	     		send();
			}
			else 
			sn1=Recmd(0x04,0x24);
			sn2=Recmd(0x04,0x25);
   			sn1=sn1<<8;
			sn=sn1||sn2;
    		getoffset=sn&&gs0_tx_mask;
 			getstartaddress=gs0_tx_base+getoffset;
	        if((getoffset+sendsize)>(gs0_tx_mask+1))
          {
			upsize=gs0_tx_mask+1-getoffset;
		 	for(k=0;k<upsize;k++)
               {  
			   a1=getstartaddress&&0x00FF;
	           a2=(getstartaddress>>8)&&0x00FF;
	           Wrcmd(a2,a1,data1[k]);
        	   if(a1==0xFF)
			     { 
		             a2++; 
					 a1=0x00;
					 }
		  		else a1++;
                        }
			leftsize=sendsize-upsize;
            a3=gs0_rx_base&&0x00FF;
	        a4=(gs0_rx_base>>8)&&0x00FF;
            Wrcmd(a4,a3,data1[k++]);
	        if(a3==0xFF)
			  { 
		        a4++;
				a3=0x00;
				}
		    else a3++;
			}
        else
            { 
		    for(k=0;k<sendsize;k++)
               {  
			   a1=get_start_address&&0x00FF;
	           a2=(get_start_address>>8)&&0x00FF;
	            Wrcmd(a4,a3,data1[k++]);
                if(a1==0xFF)
				{  a2++; 
				a1=0x00;
				}
                else a1++;
                        }
	    	Wrcmd(0x04,0x01,0x20);
            c1=Recmd(0x04,0x03);
		    if(c1==0x1c)
            Wrcmd(0x04,0x01,0x08);
            else
		    if(c1==0x00)
	        Wrcmd(0x04,0x01,0x10);
             }	
         	}																
     
		    void recieve()
      {    
	    int r,d,rz;
        uchar getoffset,get_start_address,leftsize,sn,sn1,sn2,upsize,a1,a2,a3,a4;
        uint k,h=0;
		r=Recmd(0x04,0x26);
	    d=Recmd(0x04,0x27);
        r=r<<8;
        rz=r||d;
        sn1=Recmd(0x04,0x28);
     	sn2=Recmd(0x04,0x29);
        sn1=sn1<<8;
        sn=sn1||sn2;
        getoffset=sn&&gs0_rx_mask;
	    get_start_address=gs0_rx_base+getoffset;
	   if((getoffset+rz)>(gs0_rx_mask+1))
        	{   
		    upsize=gs0_rx_mask+1-getoffset;
            for(k=0;k<upsize;k++)
               {  
			   a1=get_start_address&&0x00FF;
	           a2=(get_start_address>>8)&&0x00FF;
	           data2[h++]=Recmd(a2,a1);
               if(a1==0xFF)
			   {  
			   a2++; 
			   a1=0x00;
			   }
	          else a1++;
                        }
		      leftsize=rz-upsize;
              a3=gs0_rx_base&&0x00FF;
	          a4=(gs0_rx_base>>8)&&0x00FF;
              data2[h]=Recmd(a4,a3);
	          if(a3==0xFF)
			  {  
			  a4++;
			  a3=0x00;
			  }
	           else a3++;
                         }
           else
              {	   
			  for(k=0;k<rz;k++)
               { 
			   a1=get_start_address&&0x00FF;
	           a2=(get_start_address>>8)&&0x00FF;
	           data2[h++]=Recmd(a2,a1);
               if(a1==0xFF)
			   {  
			   a2++; 
			   a1=0x00;
			   }
                else a1++;
                        }
		   sn+=rz;
	      Wrcmd(0x04,0x01,0x40);
                 }
		 } 

		void connect(void)
          {    
		  int c,r,d;
          c=Recmd(0x04,0x03);
       	  while(c==0x17)
         	{ 
			r=Recmd(0x04,0x26);
	        d=Recmd(0x04,0x27);
         	while(r!=0||d!=0)
      	recieve();

            	}
				}

						
     	void  listen(void)
    {    
	    uint li;
     	Wrcmd(0x04,0x01,0x02);
     	delay();
	    li=Recmd(0x04,0x03);
     	if(li!=0x14)
     	{  
		Wrcmd(0x04,0x01,0x10);
	    s0_init();
       	}
    	else connect();
	}
         
      
		void s0_init(void)
     {   int n;   
       	 Wrcmd(0x04,0x00,0x01); 
     	 Wrcmd(0x04,0x04,0x13);
	  	 Wrcmd(0x04,0x05,0x88);
	 	 Wrcmd(0x04,0x01,0x01);
	 	 n=Recmd(0x04,0x03);
		if(n!=0x13)
  		{
		Wrcmd(0x04,0x01,0x10);
		s0_init();
                  }
		else listen();
	}
	


      void W5100_init(void)
	{   

    Wrcmd(0x00,0x00,0x00);
    Wrcmd(0x00,0x01,0xC0);
    Wrcmd(0x00,0x02,0xA8);
    Wrcmd(0x00,0x03,0x01);
	Wrcmd(0x00,0x04,0x01);
	Wrcmd(0x00,0x05,0xFF);
	Wrcmd(0x00,0x06,0xFF);
	Wrcmd(0x00,0x07,0xFF);
	Wrcmd(0x00,0x08,0x00);
	Wrcmd(0x00,0x09,0x00);
	Wrcmd(0x00,0x0A,0x08);
	Wrcmd(0x00,0x0B,0xDC);
	Wrcmd(0x00,0x0C,0x01);
	Wrcmd(0x00,0x0D,0x02);
	Wrcmd(0x00,0x0E,0x03);
   	Wrcmd(0x00,0x0F,0xC0);
	Wrcmd(0x00,0x10,0xA8);
	Wrcmd(0x00,0x11,0x01);
	Wrcmd(0x00,0x12,0x88);
	Wrcmd(0x00,0x16,0xC0);
	Wrcmd(0x00,0x17,0x0F);
	Wrcmd(0x00,0x18,0xA0);
	Wrcmd(0x00,0x19,0x08);
	Wrcmd(0x00,0x1A,0x55);
	gs0_rx_base=0x6000;
 	gs0_rx_mask=0x7FF;
	gs1_rx_base=0x6800;
 	gs1_rx_mask=0x7FF;
	gs2_rx_base=0x7000;
 	gs2_rx_mask=0x7FF;
	gs3_rx_base=0x7800;
 	gs3_rx_mask=0x7FF;
	Wrcmd(0x00,0x1B,0x55);
    gs0_tx_base=0x4000;
 	gs0_tx_mask=0x7FF;
	gs1_tx_base=0x4800;
 	gs1_tx_mask=0x7FF;
	gs2_tx_base=0x5000;
 	gs2_tx_mask=0x7FF;
	gs3_tx_base=0x5800;
 	gs3_tx_mask=0x7FF;
    s0_init();
              }
   	
    void main(void)
{  
 
   WDTCN = 0x07;
   WDTCN = 0xDE;   
   WDTCN = 0xAD;
   Osci_init();
   Oscx_init();
   Flash_init();
   Power_init();
   Xbr_init();
   Emio_init();
   Pn_init();
   W5100_init();
   Send();
   }
            
            
     

⌨️ 快捷键说明

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