www.pudn.com > EP26_Bulk.zip > Serial.c


#include "fx2.h" 
#include "fx2regs.h" 
#include "io.h" 
#include "serial.h" 
#include "fx2sdly.h"      
 
 
#define BAUDRATE       9600        //ÉèÖò¨ÌØÂÊÎ 
/************************** 
²¨ÌØÂʼÆË㹫ʽ£¨T1×÷Ϊ²¨ÌØÂÊ·¢ÉúÆ÷£©£º 
ÈôT1M = 0£ºBaud Rate = 2^SMODx  * CLKOUT / (32*12*(256-TH1)) 
		   TH1 = 256-2^SMODx * CLKOUT /(384 * Baud Rate)	 
ÈôT1M = 1£ºBaud Rate = 2^SMODx  * CLKOUT / (32*4*(256-TH1)) 
		   TH1 = 256-2^SMODx * CLKOUT /(128 * Baud Rate)		 
**************************/ 
#if BAUDRATE == 1200 
#define   T1_VALUE   0x30 
#elif BAUDRATE == 2400 
#define   T1_VALUE   0x98 
#elif BAUDRATE == 4800 
#define   T1_VALUE   0x64 
#elif BAUDRATE == 9600 
#define   T1_VALUE   0xB2 
#elif BAUDRATE == 19200 
#define   T1_VALUE   0xD9 
#elif BAUDRATE == 38400 
#define   T1_VALUE   0xEC 
#elif BAUDRATE == 57600 
#define   T1_VALUE   0xF3 
#elif BAUDRATE == 115200 
#define   T1_VALUE   0x00 
#elif BAUDRATE == 230400 
#define   T1_VALUE   0x00 
#endif 
 
BYTE  xdata ReceiveBuf0[ReceiveMaxLength];     //½ÓÊÕ»º³åÇø 
WORD  ReceiveCount0;   //½ÓÊÕ¸öÊý 
 
BYTE  xdata ReceiveBuf1[ReceiveMaxLength];     //½ÓÊÕ»º³åÇø 
WORD  ReceiveCount1;   //½ÓÊÕ¸öÊý 
 
extern WORD   EndPoint6_MaxInLength; 
 
/***************************************** 
	ÉèÖô®¿Ú³õʼ»¯ 
*****************************************/ 
void SerialPort_Init() 
{ 
	TMOD = (TMOD & 0x0F) | 0x20;     // ÉèÖö¨Ê±Æ÷1¹¤×÷·½Ê½2£¬×Ô¶¯ÖØÔØ·½Ê½   
	if(BAUDRATE <= 2400)   
	{ 
		CKCON &= 0xEF;           //T1M = CLKOUT/12 
	  	PCON |= 0x80 ;                // ÉèÖÃSMOD0=1£¬²¨ÌØÂʼӱ¶ 
    	EICON |= 0x80;                // ÉèÖÃSMOD1=1£¬²¨ÌØÂʼӱ¶   
	} 
	else if(BAUDRATE <= 57600) 
	{ 
		CKCON |= 0x10;           //T1M = CLKOUT/4 
	  	PCON |= 0x80 ;                // ÉèÖÃSMOD0=1£¬²¨ÌØÂʼӱ¶ 
	   	EICON |= 0x80;                // ÉèÖÃSMOD1=1£¬²¨ÌØÂʼӱ¶   
	} 
	else if(BAUDRATE == 115200)       //¿ìËÙ²¨ÌØÂÊģʽ 
	{ 
		UART230 |= 3; 
		PCON &= 0x7F ;                // ÉèÖÃSMOD0=0£¬ 
	   	EICON &= 0x7F;                // ÉèÖÃSMOD1=0£¬ 
	} 
	else if(BAUDRATE == 230400)      //¿ìËÙ²¨ÌØÂÊģʽ 
	{ 
		UART230 |= 3; 
		PCON |= 0x80 ;                // ÉèÖÃSMOD0=1£¬²¨ÌØÂʼӱ¶ 
	   	EICON |= 0x80;                // ÉèÖÃSMOD1=1£¬²¨ÌØÂʼӱ¶   
	}	 
  	SCON0 = 0x50;             // ÉèÖô®ÐпÚ0¹¤×÷·½Ê½1£¬10λÒì²½ÊÕ·¢£¬REN=0£¬ÔÊÐí½ÓÊÕ¡£RI=0£¬TI=0  
	SCON1 = 0x50; 			  // ÉèÖô®ÐпÚ1¹¤×÷·½Ê½1£¬10λÒì²½ÊÕ·¢£¬REN=0£¬ÔÊÐí½ÓÊÕ¡£RI1=0£¬TI1=0  
  	TH1  = T1_VALUE ;           // ÉèÖö¨Ê±Æ÷1µÄ³õÖµ        
  	TL1  = T1_VALUE;  
	ES0 = 1;          //ÔÊÐí´®¿Ú0ÖÐ¶Ï 
	ES1 = 1;          //ÔÊÐí´®¿Ú1ÖÐ¶Ï 
  	TR1 = 1; 
	ReceiveCount0 = 0; 
	ReceiveCount1 = 0; 
	EA = 1; 
} 
 
 
 
/******************************************** 
	·¢ËÍÒ»¸ö×Ö·û 
********************************************/ 
void Serial_SendChar(BYTE source, BYTE flag) 
{ 
	if(flag == 0) 
	{ 
		SBUF0 = source; 
		while(TI == 0); 
		TI = 0; 
	} 
	else 
	{ 
		SBUF1 = source; 
		while(TI1 == 0); 
		TI1 = 0; 
	} 
} 
 
/******************************************** 
	·¢ËÍÒ»´®×Ö·û  
********************************************/ 
void Serial_SendString(BYTE xdata *point, WORD length, BYTE flag) 
{ 
	WORD i; 
 
	for(i = 0; i < length; i++) 
	{ 
		Serial_SendChar(*(point+i),flag); 
	} 
} 
 
 
/********************************************* 
	´®¿Ú0ÖжϷþÎñ³ÌÐò 
*********************************************/ 
void Serial_Interrupt0() interrupt COM0_VECT 
{ 
	BYTE  temp_data; 
	 
 	if(RI == 1)      
 	{ 
 		RI = 0; 
		temp_data = SBUF0; 
		if(!(EP2468STAT&0x20)) 
		{ 
			EP6FIFOBUF[ReceiveCount0++] = temp_data; 
			if((ReceiveCount0 == EndPoint6_MaxInLength)||(temp_data == 0x0A)) 
			{ 
				EP6BCH = ReceiveCount0>>8;	 
				SYNCDELAY; 
				EP6BCL = ReceiveCount0; 
				if(temp_data == 0x0A) 
				{ 
					if(ReceiveCount0 == EndPoint6_MaxInLength) 
					{ 
						if(!(EP2468STAT&0x20)) 
						{ 
							 SYNCDELAY; 
							 EP6BCH = 0; 
							 SYNCDELAY; 
							 EP6BCL = 0; 
						} 
					} 
				} 
				ReceiveCount0 = 0; 
			} 
		} 
	} 
}       
 
/********************************************* 
	´®¿Ú1ÖжϷþÎñ³ÌÐò 
*********************************************/ 
void Serial_Interrupt1() interrupt COM1_VECT 
{ 
	BYTE  temp_data; 
	 
 	if(RI1 == 1) 
 	{ 
 		RI1 = 0; 
		temp_data = SBUF1; 
		if(ReceiveCount1 < ReceiveMaxLength)    //Êý¾ÝδÂú 
		{ 
			ReceiveBuf1[ReceiveCount1++] = temp_data; 
		} 
	} 
}