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
}