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

📄 main.c

📁 串口服务器KEIL C51原代码,单片机采用STC89C58RD+,网络控制器采用RTL8019,经过三层交换机测试,可以直接应用在产品,串口波特率576
💻 C
字号:
#include "uip\uip.h"
#include "uip\uip_arp.h"
#include "rtl8019\rtl8019dev.h"
#include "serial.h"
#include <LCD\LCD.h>
#include <R8051.H>
#include "c51iic.h"
//#include "isd51.h"
sbit DebugPin=P1^3;
//------------parameters-----------------
// UIP_IPADDR: The IP address of this uIP node.    默认IP地址
UBYTE data UIP_IPADDR0 =     192;
UBYTE data UIP_IPADDR1 =     168;
UBYTE data UIP_IPADDR2 =     0;
UBYTE data UIP_IPADDR3 =     100;

// UIP_NETMASK: The netmask.                       默认子网掩码
UBYTE data UIP_NETMASK0 =    255;
UBYTE data UIP_NETMASK1 =    0;
UBYTE data UIP_NETMASK2 =    0;
UBYTE data UIP_NETMASK3 =    0;

// UIP_DRIPADDR: IP address of the default router. 默认网关地址 
UBYTE data UIP_DRIPADDR0 =   192;
UBYTE data UIP_DRIPADDR1 =   168;
UBYTE data UIP_DRIPADDR2 =   0;
UBYTE data UIP_DRIPADDR3 =   199;

// UIP_ETHADDR: The Ethernet address.              默认Mac码 
UBYTE data UIP_ETHADDR0  =   0x00; //'O'
UBYTE data UIP_ETHADDR1  =   0xe0; //'F'
UBYTE data UIP_ETHADDR2  =   0x4c; //'F'
UBYTE data UIP_ETHADDR3  =   0x03; //'I'
UBYTE data UIP_ETHADDR4  =   0x1d; //'C'
UBYTE data UIP_ETHADDR5  =   0x8e; //'E'

#if UIP_ACTIVE_OPEN
UWORD data REMOTE_IP[2]={0xc0a8,0x0008};          //默认远程主机IP地址
UWORD data REMOTE_PORT=1180;                      //默认端口号
#endif
//UWORD data APPport= 1180;
UBYTE data BaudRate= 0;
//port;
//-------------------------------------
//sbit SDA=P1^1;
sbit Wdog=P1^1;
sbit LED_RED  = P3 ^ 3;	
sbit LED_GRE  = P3 ^ 4; 
unsigned char count1=0;
bit active_connect=0;
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
#define WatchDog() Wdog=~Wdog
//-------------------------------------
void InitTimer0(void) 
{
                        // TMOD=TMOD&0xF0;
     TMOD=TMOD|0x01;    //模式1(16位定时器),仅受TR0控制
                        //TH0=0x7d;    //Tick=100/s, 10ms evrey time
                        //TL0=0xcb;    //OS_CPU_A.ASM  和  OS_TICKS_PER_SEC
                        //TH0=0x3c;    //Tick, 15ms(40M) evrey time
                        //TL0=0xb0;    //OS_CPU_A.ASM  和  OS_TICKS_PER_SEC
     TH0=0x2a;          //Tick, 20ms(32.768) evrey time
     TL0=0xab; 
     ET0=1;             //允许T0中断
     TR0=1;
}
//-------------------------------------
void TcpIp_Init()
{
     uip_init();
     myapp_init();
     uip_arp_init();
     RTL8019dev_init();
}
//-------------------------------------
void main(void)
{ 
     UBYTE i;
	 AUXR = 0x00 ;	 
     SCONF=0X03;
	 ES=0;
     Wdog=0;
//   LCD_Initial();
//   LCD_print("MCU-WEB");
//	 ISDinit ();        // initialize uVision2 Debugger and continue program run 
//	 ISDwait ();        // wait for connection to uVision2 Debugger
//--------------------------------------------
// 	 WatchDog();
     if(!DebugPin)goto xxxx;           //如果S3 OPEN,读取1161J-42中的设置信息

	 SubAddr=32;
	 Number=5;//20;
	 while( !IRcvStr(&Rec_data[0]) )  //读IP参数
  	      {
		    for(i=0;i<200;i++);
		    for(i=0;i<200;i++);
		    for(i=0;i<200;i++);
		    for(i=0;i<200;i++);
	      }
	 if((Rec_data[0]==0x55)&&(Rec_data[1]==0xaa))
	   {
	     SubAddr=0;
	     Number=26;//20;
	     while( !IRcvStr(&Rec_data[0]) )  //读IP参数
	          { 
	        	for(i=0;i<200;i++);
	        	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
	          }
	    //  InitSerial_0();
  	    UIP_IPADDR0   = Rec_data[0];
	    UIP_IPADDR1   = Rec_data[1];
	    UIP_IPADDR2   = Rec_data[2];
	    UIP_IPADDR3   = Rec_data[3];
	    UIP_NETMASK0  = Rec_data[4];
	    UIP_NETMASK1  = Rec_data[5];
	    UIP_NETMASK2  = Rec_data[6];
	    UIP_NETMASK3  = Rec_data[7];
	    UIP_DRIPADDR0 = Rec_data[8];      //网关地址
	    UIP_DRIPADDR1 = Rec_data[9];
	    UIP_DRIPADDR2 = Rec_data[10];
	    UIP_DRIPADDR3 = Rec_data[11]; 
	    UIP_ETHADDR0  = Rec_data[12]; //'O'  //MAC
	    UIP_ETHADDR1  = Rec_data[13]; //'F'
	    UIP_ETHADDR2  = Rec_data[14]; //'F'
	    UIP_ETHADDR3  = Rec_data[15]; //'I'
	    UIP_ETHADDR4  = Rec_data[16]; //'C'
	    UIP_ETHADDR5  = Rec_data[17]; //'E'
	    *( (UBYTE *)(&APPport)   )= Rec_data[18];      //本地端口
	    *( (UBYTE *)(&APPport)+1 )= Rec_data[19];
        #if UIP_ACTIVE_OPEN
	    *( (UBYTE *)(REMOTE_IP)   )= Rec_data[20];     //远端IP
	    *( (UBYTE *)(REMOTE_IP)+1 )= Rec_data[21];
	    *( (UBYTE *)(REMOTE_IP)+2 )= Rec_data[22];
	    *( (UBYTE *)(REMOTE_IP)+3 )= Rec_data[23];
	    *( (UBYTE *)(&REMOTE_PORT)   )= Rec_data[24];  //远端PORT
	    *( (UBYTE *)(&REMOTE_PORT)+1 )= Rec_data[25];
        #endif
       }
     else         //如果S3 SHORT,读取默认的设置信息
       {
        xxxx:
        Rec_data[0]=	UIP_IPADDR0;
        Rec_data[1]=	UIP_IPADDR1 ;
        Rec_data[2]=	UIP_IPADDR2 ;
        Rec_data[3]=	UIP_IPADDR3 ;
        Rec_data[4]=   UIP_NETMASK0 ;
        Rec_data[5]=	UIP_NETMASK1; 
        Rec_data[6]=	UIP_NETMASK2 ;
	    Rec_data[7]=   UIP_NETMASK3 ;
        Rec_data[8]=  	UIP_DRIPADDR0 ;    //网关地址
        Rec_data[9]=	UIP_DRIPADDR1 ;
        Rec_data[10]=	UIP_DRIPADDR2;
        Rec_data[11]=	UIP_DRIPADDR3  ; 
        Rec_data[12]=	UIP_ETHADDR0 ; //'O'  //MAC
        Rec_data[13]=	UIP_ETHADDR1  ; //'F'
        Rec_data[14]=	UIP_ETHADDR2  ; //'F'
        Rec_data[15]=	UIP_ETHADDR3 ; //'I'
        Rec_data[16]=	UIP_ETHADDR4 ; //'C'
        Rec_data[17]= 	UIP_ETHADDR5; //'E'
        Rec_data[18]=	*( (UBYTE *)(&APPport)   ); //本地端口
        Rec_data[19]=	*( (UBYTE *)(&APPport)+1 );
        #if UIP_ACTIVE_OPEN
        Rec_data[20]=*( (UBYTE *)(REMOTE_IP)   ); //远端IP
        Rec_data[21]=	*( (UBYTE *)(REMOTE_IP)+1 );
        Rec_data[22]=	*( (UBYTE *)(REMOTE_IP)+2 );
	    Rec_data[23]=*( (UBYTE *)(REMOTE_IP)+3 );
	    Rec_data[24]=*( (UBYTE *)(&REMOTE_PORT)   ); //远端PORT
	    Rec_data[25]=*( (UBYTE *)(&REMOTE_PORT)+1 );
        #endif
	    SubAddr=0;
	    Number=16;
  	    while( !ISendStr(&Rec_data[0]) )  //写IP参数
	         {
	        	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
	         }
	    SubAddr=16;
	    Number=10;
        while( !ISendStr(&Rec_data[16]) )  //写IP参数
	         {
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
	         } 
       Rec_data[0]=0x55;
       Rec_data[1]=0xaa;
	   SubAddr=32;
	   Number=5;
       while( !ISendStr(&Rec_data[0]) )  //写IP参数
	        {
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
		    	for(i=0;i<200;i++);
	    	    for(i=0;i<200;i++);
	        } 
       }
//-----------------------------------------------*/
	 WatchDog();
//--------------------------------------------
     InitSerial_0();
     //Uart0_printR(&Rec_data[0],26);
     //Uart0_print("start\n");
     TcpIp_Init();
     //LCD_print("main start\n");
     //Uart0_print("main start\n");
     InitTimer0();
     EA=1;
     WatchDog();
     InitSerial_0();
	 Rec_len=0;
     uip_connected=0;
	 Rec_len=0;
          dataRec_timecount=0;
          data_Rec=0;
		  active_connect=0;
     while(1)
     {   
	 // uip_ipaddr(REMOTE_IP, 192,168,1,8);
     // uip_connect(REMOTE_IP, 4096);
     //	uip_connect(REMOTE_IP, REMOTE_PORT); //建立TCP连接
	    WatchDog();
        uip_len = RTL8019dev_poll();
		if(uip_len)
		  {
      		 if(BUF->type == htons(UIP_ETHTYPE_IP))
       		 {
	           uip_arp_ipin();
	           uip_process(UIP_DATA);	           
	           if(uip_len > 0) // transmit a packet, if one is ready
	             {
	               uip_arp_out();
	               RTL8019dev_send();
	             }
      		 }     
     		 else if(BUF->type == htons(UIP_ETHTYPE_ARP))// process an ARP packet
		         {
		           uip_arp_arpin();     
		           if(uip_len > 0) // transmit a packet, if one is ready
		             RTL8019dev_send();
		         }
		  }
//----------------time out------------------------------------
		WatchDog();
	    if(count1>=50)  //50*20ms=1s;//cccc20
	      {
			count1=0;
			//	Uart0_print("TimT\n");
	        for(i = 0; i < UIP_CONNS; ++i)
		    {
		       uip_periodic(i);
		       if(uip_len > 0)
	             {
	               uip_arp_out();
	               RTL8019dev_send();
	             }
	        }
	      }
//----------------end of time out----------------------------
//----------------uart2tcp-----------------------------------
		WatchDog();
        //dataRec_timecount=21;
        if(dataRec_timecount>=5)  //20*20ms=400ms//cccc2
	      {
            if(uip_connected) //判断连接状态
			  {
            	count1=0;
	        	for(i = 0; i < UIP_CONNS; ++i)
		    	   {
		       		uip_periodic(i); //组织数据
		       		if(uip_len > 0)
	            	  {   
                        WatchDog();
	               		uip_arp_out();
	               		RTL8019dev_send();  //发送
	            	  }
	        	    } 
            	Rec_len=0;
            	dataRec_timecount=0;
            	data_Rec=0;
				active_connect=0;
	   		  }
			else if(dataRec_timecount>100) //100*20ms=2s
			  {
                //Uart0_print("disc\n");
            	Rec_len=0;
            	dataRec_timecount=0;
            	data_Rec=0;
				active_connect=0;
			  }
			else
			  {
				#if UIP_ACTIVE_OPEN
                    if(!active_connect)
					   {
                         //Uart0_print("connect\n");
						 active_connect=1;
						 uip_connect(REMOTE_IP, REMOTE_PORT); //建立TCP连接
		       			 uip_periodic(0);  //only one connect!
		       			 if(uip_len > 0)
	            		   {
                             //Uart0_print("sendsyn\n");
	               			 uip_arp_out();
	               			 RTL8019dev_send();
	            		   }
					   }
				#else
            		Rec_len=0;
            		dataRec_timecount=0;
            		data_Rec=0;
					active_connect=0;
				#endif
			  }
	      }
     }//while(1);
}
//-----------------------------------------------------------
void Timer0(void)  interrupt 1
{
     TR0=0;
	 TH0=0x2a;    //Tick, 20ms(32.768) evrey time
	 TL0=0xab;
     TR0=1;
	 count1++;
	 if(data_Rec) dataRec_timecount++;
}

⌨️ 快捷键说明

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