www.pudn.com > zhiyonglou311.rar > Main.c


//--------------------------------------------------------------------------- 
// Net MAIN.C 
// 
// 8051 Web Server project 
// See Makefile for build notes  
// Written for Keil C51 V5.1 compiler, notes: 
//   It uses big endian order, which is the same as the 
//   network byte order, unlike x86 systems. 
//   Use OPTIMIZE(2)or higher so that automatic variables get shared 
//   between functions, to stay within the 256 bytes idata space 
//--------------------------------------------------------------------------- 
 
#include  
#include  
#include "C8051f.h" 
#include "net.h" 
#include "eth.h" 
#include "serial.h" 
#include "timer.h" 
#include "analog.h" 
#include "arp.h" 
#include "tcp.h" 
#include "http.h" 
#include "ip.h" 
 
 
// Global variables 
UINT volatile event_word; 
char xdata text[20];   
UCHAR idata debug; 
UCHAR idata rcve_buf_allocated; 
 
 
// This sets my hardware address to 00:01:02:03:04:05 
UCHAR code my_hwaddr[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};  
 
// Hardware addr to send a broadcast 
UCHAR code broadcast_hwaddr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
 
// This sets my IP address to 192.168.0.10 
ULONG code  my_ipaddr = 0xC0A8000AL; 
 
// This sets my subnet mask to 255.255.255.0 
ULONG code my_subnet = 0xFFFFFF00L; 
 
// Set to 0 if no gateway is present on network 
ULONG code gateway_ipaddr = 0; 
 
//-------------------------------------------------------------------------- 
// Initialize the memory management routines 
// Initialize variables declared in main 
//-------------------------------------------------------------------------- 
 
unsigned int Count1msInc; 
unsigned char Count1ms,Count10ms,Count1s; 
unsigned char TimeSecond,TimeMinute; 
 
void init_main(void) 
{ 
	// Start the memory pool for incoming and outgoing Ethernet 
	// frames at 1000, with length = 1500 bytes. Memory below 500 
	// is used for program variables 
	init_mempool((void xdata *)1000, 1500); 
	memset(text, 0, sizeof(text)); 
	event_word = 0; 
	rcve_buf_allocated = FALSE; 
	debug = FALSE; 
} 
 
void PORT_Init (void) 
{ 
   XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0 
   XBR1    = 0x00; 
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups 
   EMI0TC  = 0x21; 
   P74OUT  = 0xFF; 
   P0MDOUT = 0x15; 
} 
 
void SPI0_Init (void) 
{ 
   SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge 
                                       // 8-bit data words 
   SPI0CFG|=0xC0;	//CKPOL =1; 
 
   SPI0CN = 0x03;                      // Master mode; SPI enabled; flags 
                                       // cleared 
   SPI0CKR = SYSCLK/2/8000000-1;       // SPI clock <= 8MHz (limited by  
                                       // EEPROM spec.) 
} 
 
void Timer0_Init (void) 
{ 
   	CKCON|=0x8; 
   	TMOD|=0x1;    	//16Bit 
	Count10ms=10; 
	Count1s=0; 
   	TR0 = 0;                         	// STOP Timer0 
   	TH0 = (-SYSCLK/1000) >> 8;    		// set Timer0 to overflow in 1ms 
   	TL0 = -SYSCLK/1000; 
   	TR0 = 1;   	// START Timer0 
   	IE|= 0x2;  
} 
void SYSCLK_Init (void) 
{ 
   int i;                              // delay counter 
   OSCXCN = 0x67;                      // start external oscillator with 
                                       // 18.432MHz crystal 
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up 
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle 
   OSCICN = 0x88;                      // select external oscillator as SYSCLK 
                                       // source and enable missing clock 
                                       // detector 
//	OSCICN = 0x07;   //interal 16MHZ 
} 
void Timer0_ISR (void) interrupt 1  //1ms 
{ 
	TH0 = (-SYSCLK/1000) >> 8;   
   	TL0 = -SYSCLK/1000; 
	if (Count1ms) Count1ms--; 
	Count1msInc++; 
	if (Count10ms) Count10ms--; 
	else 
	{ 
		Count10ms=10;    			//10ms 
		if (Count1s) Count1s--; 
		else 
		{ 
			Count1s=100;			//1s 
			TimeSecond++; 
			if (TimeSecond>=60) 
			{ 
				TimeSecond=0;		//1min 
				TimeMinute++; 
				if	(TimeMinute==60)	TimeMinute=0; 
			} 
		} 
	} 
} 
 
 
void Delay1ms(unsigned char T) 
{ 
	Count1ms=T; 
	while (Count1ms); 
} 
 
/*通过SPI发送一字节*/ 
#define CHIP595_SELECT 		P5 &= ~(0x10); 			// P54  
#define CHIP_NOSELECT 		P5 |= 0xf8; 			// P53-57  
 
void SendSPIByte(unsigned char ch) 
{ 
		SPIF = 0; 
		SPI0DAT = ch; 
		while (SPIF == 0);	 // wait for data transfer to be completed   				       	 
}  
 
void LightONOFF(bit b) 
{ 
	CHIP_NOSELECT;	 
	CHIP595_SELECT; 
	SendSPIByte(0x0); 
	if (b) 
	{ 
		SendSPIByte(0x01); 
	} 
	else 
	{ 
		SendSPIByte(0x00); 
	} 
	CHIP_NOSELECT;	 
} 
 
 
void main (void) 
{ 
	UINT j, event_word_copy; 
	UCHAR xdata * inbuf; 
                    	 
  	WDTCN = 0xDE;              // Disable watchdog timer 
	WDTCN = 0xAD; 
 
	EMI0CF =0x24;						// share low 4K XRAM 
	SYSCLK_Init ();                     // initialize oscillator 
	Timer0_Init(); 
	PORT_Init ();                       // initialize crossbar and GPIO 
	SPI0_Init ();                       // initialize SPI0 
 
	init_main(); 
	init_tcp(); 
	init_http(); 
 
	EA=1; 
	init_serial(); 
	SendCommString("Init OK\r\n"); 
 
	init_adc(); 
	init_timer2(); 
	init_arp(); 
	init_8019(); 
    
	 
 
	j = 0; 
	ET2 = 1;		            // Enable timer 2 interrupt 
	   	 
   // The code below is a priority based RTOS.  The event 
   // handlers are in priority order - highest priority first. 
	while (1) 
   { 
      // Query CS8900A to see if Ethernet frame has arrived 
      // If so, set EVENT_ETH_ARRIVED bit in event_word 
      query_8019(); 
       
      // Use a copy of event word to avoid interference 
      // with interrupts 
		EA = 0; 
		event_word_copy = event_word; 
		EA = 1; 
       
      // See if an Ethernet frame has arrived       
      if (event_word_copy & EVENT_ETH_ARRIVED) 
      { 
         EA = 0; 
         event_word &= (~EVENT_ETH_ARRIVED); 
         EA = 1; 
          
         // Allocate a buffer and read frame from CS8900A 
         inbuf = rcve_frame(); 
         if (inbuf != NULL) 
         { 
            // Process the received Ethernet frame  
            eth_rcve(inbuf);  
          
            // If the memory allocated for the rcve message has 
            // not already been freed then free it now 
            if (rcve_buf_allocated) 
            { 
               free(inbuf); 
               rcve_buf_allocated = FALSE; 
            } 
         } 
      } 
       
      // See if TCP retransmit timer has expired            	        
      else if (event_word_copy & EVENT_TCP_RETRANSMIT) 
      { 
         EA = 0; 
         event_word &= (~EVENT_TCP_RETRANSMIT); 
         EA = 1; 
         tcp_retransmit(); 
 		} 
 
      // See if TCP inactivity timer has expired 
      else if (event_word_copy & EVENT_TCP_INACTIVITY) 
      { 
         EA = 0; 
         event_word &= (~EVENT_TCP_INACTIVITY); 
         EA = 1; 
         tcp_inactivity(); 
 		} 
 
      // See if ARP retransmit timer has expired 
 		else if (event_word_copy & EVENT_ARP_RETRANSMIT) 
      { 
         EA = 0; 
         event_word &= (~EVENT_ARP_RETRANSMIT); 
         EA = 1; 
         arp_retransmit(); 
		} 
 
      // See if it is time to age the ARP cache 
      else if (event_word_copy & EVENT_AGE_ARP_CACHE) 
      { 
         EA = 0; 
         event_word &= (~EVENT_AGE_ARP_CACHE); 
			EA = 1; 
         age_arp_cache(); 
		} 
 
		// See if it is time to read the analog inputs 
		else if (event_word_copy & EVENT_READ_ANALOG) 
      { 
         EA = 0; 
         event_word &= (~EVENT_READ_ANALOG); 
         EA = 1; 
			// Read one of the 3 analog inputs each time 
			read_analog_inputs(); 
      } 
 
		// See if an RS232 message has arrived.  It is 
      // not handled - RS232 is used for sending only 
		else if (event_word_copy & EVENT_RS232_ARRIVED) 
      { 
         EA = 0; 
         event_word &= (~EVENT_RS232_ARRIVED); 
         EA = 1; 
      } 
   } 
}