www.pudn.com > TCPmodbushy.rar > COMMU.C


/****************************************************************************** 
 * Project     : t_box 
 * Module Name : COMMU.C 
 * CPU Type    : C8051F340 
 * 
 * Description : 
 * 
 * History        Author     Version       Comment 
 * 2002.12.22       HY       V0.0         Original version 
 * 
 * Copyright (C) 2006 HY. All rights reserved. 
 ******************************************************************************/ 
#include	"o:\sysdef.h" 
#define		RS485		1 
#define		BAUDRATE19200	(256 - ( (OscFreq/4)/2 )/19200) 
#define		BAUDRATE9600	(256 - (OscFreq/4)/2/9600) 
#define		BAUDRATE4800	(256 - (OscFreq/12)/2/4800) 
#define		BAUDRATE38400	(256 - (OscFreq)/2/38400) 
#define		BAUDRATE57600	(256 - (OscFreq)/2/57600) 
#define		BAUDRATE115200	(256 - (OscFreq)/2/115200) 
static bit	data NeedParity,OddParity; 
static bit	data	Data8Bits;			// 1/0 : 8/7 bits data 
static bit	data	Stop2Bits;			// 1/0 : 2/1 stop bits 
 
/****************************************************************************** 
 *	功能: 初始化串行口 
 *****************************************************************************/ 
void InitCommuPort( ulong BaudRate, uchar Parity, uchar DataBits, uchar StopBits ) 
{ 
	uchar	bitlen; 
	uchar	tmp; 
//	ulong   fosc; 
	NeedParity =( Parity != ParityNone ); 
	OddParity  =( Parity == ParityOdd ); 
	Data8Bits = ( DataBits == DataBits_8 ); 
	Stop2Bits = ( StopBits == StopBits_2 ); 
 
		/*----------------------------------------------*/ 
		/*             初始化串行口                 	*/ 
		/*      数据长度9/8位,有/无校验,1位停止位  	*/ 
		/*----------------------------------------------*/ 
 
	bitlen = Data8Bits ? 8 : 7; 
	bitlen += NeedParity ? 1 : 0; 
	bitlen += Stop2Bits ? 1 : 0; 
	while(1) 
	{ 
		TR1 = OFF;		/* Stop Timer */ 
		TMOD = ( TMOD & 0x0F ) | 0x20;	/* WORKing mode */ 
		switch(BaudRate) 
		{ 
			case 19200: 
				TL1 = BAUDRATE19200;			 
				TH1 = BAUDRATE19200; 
				tmp = BAUDRATE19200; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON =(CKCON&0xF4)| 0x01; 
				break; 
			case 9600: 
				TL1 = BAUDRATE9600;			 
				TH1 = BAUDRATE9600; 
				tmp = BAUDRATE9600; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON =(CKCON&0xF4)| 0x01; 
				break; 
			case 4800: 
				TL1 = BAUDRATE4800;			 
				TH1 = BAUDRATE4800; 
				tmp = BAUDRATE4800; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON |= 0x00; 
				break; 
			case 38400: 
				TL1 = BAUDRATE38400;			 
				TH1 = BAUDRATE9600; 
				tmp = BAUDRATE9600; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON |= 0x08; 
				break; 
			case 57600: 
				TL1 = BAUDRATE57600;			 
				TH1 = BAUDRATE57600; 
				tmp = BAUDRATE57600; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON |= 0x08; 
				break; 
			case 115200: 
				TL1 = BAUDRATE115200;			 
				TH1 = BAUDRATE115200; 
				tmp = BAUDRATE115200; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON |= 0x08; 
				break; 
			default://19200 
				TL1 = BAUDRATE19200;			 
				TH1 = BAUDRATE19200; 
				tmp = BAUDRATE19200; 
				TR1 = ON;	/* Start Timer  */ 
				CKCON =(CKCON&0xF4)| 0x01; 
				break; 
		} 
		if( bitlen >=9 ) 
		{ 
			SCON0 = 0x90;		/* mode 3, 9位UART模式,波特率可变,允许从串行口接收数据 */ 
		} 
		else 
		{ 
			SCON0 = 0x10;		/* mode 1, 8位UART模式,波特率可变,允许从串行口接收数据 */ 
		}   
		/*	if(BaudRate >= 23437) 
		{ 
			fosc = SYS_FOSC; 
			tmp = 256 - (fosc/2)/BaudRate; 
			TL1 = tmp;			 
			TH1 = tmp; 
			CKCON |= 0x08; 
		} 
		else if(5859 <= BaudRate && BaudRate< 23437) 
		{ 
			fosc = SYS_FOSC/4; 
			tmp = 256 - (fosc/2)/BaudRate; 
			TL1 = tmp;			 
			TH1 = tmp; 
			CKCON =(CKCON&0xF4)| 0x01; 
		} 
		else 
		{ 
			fosc = SYS_FOSC/12; 
			tmp = 256 - (fosc/2)/BaudRate; 
			TL1 = tmp;			 
			TH1 = tmp; 
			CKCON |= 0x00; 
		}*/ 
	//	TL1 = 0x96; 
	//	TH1 = 0x96; 
	//	CKCON |= 0x00;		/*350  9600  12 fen pin*/  
	//	IP_LED = LED_OFF; 
		if( TH1 == tmp ) 
		{ 
			ES0 = YES; 
			return; 
		} 
		else	 
			RSTSRC |=0x10; 
	} 
} 
 
/****************************************************************************** 
 *	功能: 接收一个字节 
 *   OUT: Cy - 1  receive data OK 
 *		:    - 0			   NG 
 *		: *RxData - return data received 
 ******************************************************************************/ 
#pragma		NOAREGS 
bit  RxByte( uchar data *RxData )  
{ 
	ACC = SBUF0;			/* 从接收寄存器读回一个字节 */ 
	if(NeedParity) 
	{ 
		if( OddParity ) 
		{ 
			if( P == RB80 )  
			{			 
				CY = 0 ; 
				return( CY ); 
			} 
		} 
		else 
		{ 
			if( P != RB80 ) return( ERR ); 
		} 
	} 
	*RxData = ACC & 0xFF;		/* 从接收寄存器读回一个字节 */		/*** must AND 0xFF, mustn't delete it ***/ 
	CY = 1 ; 
	return( CY ); 
} 
#pragma		AREGS 
/****************************************************************************** 
 *	功能: 发送一个字节 
 *    IN: TxData - 待发送字节 
 ******************************************************************************/ 
#pragma		NOAREGS 
void TxByte( uchar TxData ) 
{ 
	ACC = TxData; 
	if(NeedParity) 
	{ 
		if( OddParity ) 
		{ 
			TB80 = !P;				/* 生成校验位(奇)*/ 
		} 
		else 
		{ 
			TB80 = P;				/* 生成校验位(偶)*/ 
		} 
	} 
	SBUF0 = ACC;			/* 将待发送字节装入发送寄存器 */ 
} 
#pragma		AREGS	 
 
/****************************************************************************** 
 *	功能: 通信中断服务程序 
 *	说明: 
 *****************************************************************************/ 
void CommuIntSrv( void ) interrupt 4 using UART_INT_BANK1 
{ 
	COM_LED = LED_ON; 
	if( RI0 ) 
	{ 
		RI0 = OFF; 
		CommuRcv_INT(); 
	} 
	else 
	{ 
		TI0 = OFF; 
		CommuSnd_INT(); 
	} 
} 
 
/****************************************************************************** 
 *	功能: 开始接受 
 *  说明: RS-485通信时:控制RS-485 数据使能 为接受数据 
 ******************************************************************************/ 
#pragma		NOAREGS 
void StartRx( void ) 
{ 
#ifdef	RS485 
	DE = DE_EnableReceive;			// enable receive ( RS-485 ) 
#endif 
} 
#pragma		AREGS 
 
/****************************************************************************** 
 *	功能: 开始发送 
 *  说明: RS-485通信时:控制RS-485 数据使能 为发送数据 
 ******************************************************************************/ 
void StartTx( void ) 
{ 
#ifdef	RS485 
	DE = DE_EnableTransmite;		// enable transmition ( RS-485 ) 
#endif 
}