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 &amt; 0x0F) | 0x20; // ÉèÖö¨Ê±Æ÷1¹¤×÷·½Ê½2£¬×Ô¶¯ÖØÔØ·½Ê½
if(BAUDRATE <= 2400)
{
CKCON &amt;= 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 &amt;= 0x7F ; // ÉèÖÃSMOD0=0£¬
EICON &amt;= 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&amt;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&amt;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;
}
}
}