⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用51单片机扩展的一个多串口程序
💻 C
字号:
#include "KeyHead.h"
#include "main.h"

void main()
{
	DelayTime(100, 100);
	InitSys();
			
	for(;;)
	{		
		if( Flag5ms )
		{
			Flag5ms = 0;
			Trans552DataToMain();
			TransMainDataTo552();
		}

		if( Flag250ms )
		{
			Flag250ms = 0;
			WatchDogBit=(~WatchDogBit);
		}
		
		if(MainDataFlag)
		{
			MainDataFlag = 0;
			RecMainSioData();
		}
		Rec552SioData();		
	}
}

void Timer0Int(void) interrupt 1
{
	MICRO_Timer0Load( TH0_PARAM, TL0_PARAM );

	Flag5ms = 1;
	
	T250msCounter++;
	if(T250msCounter<50)
		return ;

	Flag250ms = 1;
	T250msCounter = 0;	
			
	T1Second++ ;
	if( T1Second<4 )
		return;
	T1Second = 0 ;
	
	T2Second++;
	if(T2Second>=2)
	{
		T2Second=0 ;
		Flag2Second = 1;
	}
}



void InitSys()
{
	unsigned int  i;
	
		
	TransPort=0;
	
	P1 = 0;
	
	for(i=0; i< TRANS_TAL; i++)
	{
		TransBufRP[i] = 0;
		TransBufWP[i] = 0;
		TransBufTal[i] = 0;

		TransTo552BufRP[i] = 0;
		TransTo552BufWP[i] = 0;
		TransTo552BufTal[i] = 0;

		DelayByteTime[i] = 0;
	}

	Flag5ms = 0;
	Flag250ms = 0;
	Flag2Second = 0;
	MainDataFlag = 0;

	MainSioData = 0;
	
	
	T250msCounter = 0;
	T1Second=0, T2Second=0;
	
	AddrSio[0] = 0x8008;
	AddrSio[1] = 0x8000;
	AddrSio[2] = 0x9000;
	AddrSio[3] = 0x9008;
	Init552Sio();
		
	TMOD = 0x21; //定时器T1用于串口,定时器T0用于16位定时器。
	MICRO_Timer0Load(TH0_PARAM, TL0_PARAM);

	TL1 = 0xf4; TH1 = 0xf4; //11.0592M  2400bps	模式0
	TR1 = 1; //允许T1计数位
	SCON=0x40;  PCON=0x00;  TI=1 ; //串口数据发送中断标志位
	RI = 0; //串口数据接收中断标志位
	REN = 1;
	
	TR0 = 1;   //允许T0计数位,T0开始计数

	IP = 0x10;
	IE = 0x92;    //开放中断,允许T0中断,允许ES中断
}
//**************************************************************
//延时程序,通过参数传入的值改变延时时长
//在延时的过程中继续看门狗操作,防止复位
//典型延时参数:  (12M   875MS:  100, 100)
//**************************************************************
void DelayTime(int Delay1Value, int Deay2Value )
{
	int  xdata Delay1, Delay2, Delay3;
	
	for(Delay1=0; Delay1<Delay1Value; Delay1++)
	{
		for(Delay2=0; Delay2<Deay2Value; Delay2++)
		{
			Delay3 = Delay1*Delay2;
			WatchDogBit = ~WatchDogBit;
		}
	}	
}

void RecMainSioData(void)
{
	MICRO_SendToBuf(TransTo552Buf[0][TransTo552BufWP[0]], MainSioData, 
		TransTo552BufWP[0], TransTo552BufTal[0], TRANS_BUF_SIZE );		

	MICRO_SendToBuf(TransTo552Buf[1][TransTo552BufWP[1]], MainSioData, 
		TransTo552BufWP[1], TransTo552BufTal[1], TRANS_BUF_SIZE );		

	MICRO_SendToBuf(TransTo552Buf[2][TransTo552BufWP[2]], MainSioData, 
		TransTo552BufWP[2], TransTo552BufTal[2], TRANS_BUF_SIZE );		

	MICRO_SendToBuf(TransTo552Buf[3][TransTo552BufWP[3]], MainSioData, 
		TransTo552BufWP[3], TransTo552BufTal[3], TRANS_BUF_SIZE );		
}

void Rec552SioData(void) 
{
	unsigned char data i, RecData;
	unsigned int data Addr552;
	
	for(i=0; i<SIO_TAL; i++)
	{
		Addr552 = AddrSio[i];
		if ( (XBYTE[Addr552+UC_552_LSR]) & 1 )
		{
			RecData = XBYTE[Addr552+UC_552_RHR];
			
			MICRO_SendToBuf(TransBuf[i][TransBufWP[i]], RecData, 
					TransBufWP[i], TransBufTal[i], TRANS_BUF_SIZE );
		}
	}
}

void TransMainDataTo552(void)
{
	unsigned char data i, TransData;
	unsigned int data Addr552,FramRP,FramTal;

	for(i=0; i<TRANS_TAL; i++)
	{
		if( TransTo552BufTal[i]==0 )
			continue;
		Addr552 = AddrSio[i];
		if(XBYTE[Addr552+UC_552_LSR] & 0x20)
		{
			FramRP = TransTo552BufRP[i];
			FramTal = TransTo552BufTal[i];
			MICRO_GetFromBuf(TransTo552Buf[i][FramRP], TransData, 
					FramRP, FramTal, TRANS_BUF_SIZE );
			if(TransData == 0xc0)
			{
				DelayByteTime[i]++;
				if(DelayByteTime[i]<3)
					continue;
				DelayByteTime[i] = 0;
			}
			
			TransTo552BufRP[i] = FramRP;
			TransTo552BufTal[i] = FramTal;
			XBYTE[Addr552+UC_552_THR] = TransData;
		
		}
	} 
}

void Trans552DataToMain(void)
{       
	unsigned char TransData;

	if( TransBufTal[TransPort]>0 )
	{
		MICRO_GetFromBuf(TransBuf[TransPort][TransBufRP[TransPort]], TransData, 
				TransBufRP[TransPort], TransBufTal[TransPort], TRANS_BUF_SIZE );

		SBUF = TransData;
		NoDataTimes = 0;
	}
	else
	{
		NoDataTimes++;
		if( NoDataTimes<3 )
			return;

		NoDataTimes = 0;
		TransPort++;
		if( TransPort>=TRANS_TAL )
			TransPort=0;
	}
}


void Init552Sio(void)
{
	unsigned char data i;
	unsigned int data Addr552;

	for(i=0; i<SIO_TAL; i++)
	{
		Addr552 = AddrSio[i];
		XBYTE[Addr552 + UC_552_LCR] = 0x80;//配置波特率
		XBYTE[Addr552 + UC_552_DLL] = BAUD_RATE_2400L;//波特率参数=FRQ / 波特率*16
		XBYTE[Addr552 + UC_552_DLM] = BAUD_RATE_2400H;	
		XBYTE[Addr552 + UC_552_FCR] = 0x00;//没用FIFO
		XBYTE[Addr552 + UC_552_LCR] = 0x03;//8位数据,无校验,1位停止位
		XBYTE[Addr552 + UC_552_IER] = 0x00;	
	}	
}

void SerialRecMainDataInt(void) interrupt 4
{
	if(TI)
		TI = 0;
	if(RI)
	{
		RI = 0;
		MainSioData = SBUF;
		MainDataFlag = 1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -