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

📄 uart.c

📁 51的GPS开发的NMEA数据读取与解析.rar
💻 C
字号:
/*************************************************/
//项  目:水利数码通
//文件名:UART.C
//功  能: 串口0、1数据收发处理,软件串口处理
//作  者:杨世峰
//日  期:2004-03-13
/*************************************************/

//================包含文件=========================
#include "upsd3300.h"
#include "const.h"
#include "hardware.h"
#include "uart.h"
#include "GPRS_API.h"
#include "upsd3300_timer.h"
//=================宏定义==========================

//================变量定义=========================

extern	uint	idata	unInBufCntComm0;	//缓冲区计数
extern	uint	idata	unInBufCntComm1;	//缓冲区计数

extern 	uchar	xdata InBufComm0[];
extern	uint	idata	InHeadComm0;		//队列头
extern	uint	idata	InTailComm0;		//队列尾

extern	uchar	xdata InBufComm1[];
extern	uint	idata	InHeadComm1;		//队列头
extern	uint	idata	InTailComm1;		//队列尾
extern bit bSelectGPS;
//================函数定义=========================
//-------------------------------------------------
// serial0 initial  for hw006  
// bautrate :BAUT0            
// bautrate generator  timer2               
//-------------------------------------------------
void  Serial0_Init(uchar ucBaut)
{
	ulong ulTemp;

	ES0 = 0;
	SCON0 |= 0X50;  //mode 1 ,receive enable
   //T2CON	
   RCLK = 1;       //timer2 used for baut generator
   TCLK = 1;
   C_T2 = 0;       //TIMER
   EXEN2 = 0;     //disable the t2x
//UART Mode 1,3 Baud Rate =
//fOSC/(32 x [65536 – [RCAP2H, RCAP2L]))
	switch(ucBaut)
	{
		case 5:
			ulTemp=9600;				
			break;			
		case 6:
			ulTemp=19200;		
			break;			
		case 7:
			ulTemp=38400;		
			break;			
		case 8:
			ulTemp=57600;	
			break;			
		case 9:
			ulTemp=115200;		
			break;			
		default :
			ulTemp=9600;		
	}
   RCAP2 = - (uint)(22118400L/32/ulTemp);//FREQ_OSC IS KHZ
   TH2 = RCAP2H;
   TL2 = RCAP2L;
	P3SFS |= 0x03;//0,1:RXD0,TXD0,XXXXXX11,
   //pcon |= 0x80;//smod0 = 1;
   TR2 = 1;
	PS0 = 1;//priorty high
   ES0 = 1;
}

//--------------------------------------------------
// serial1 initial for gps 或GPRS
// bautrate :BAUT1             
// bautrate generator timer1                                                   
//--------------------------------------------------
void Serial1_Init(uchar ucBaut)
{
	ulong ulTemp;

   IEA &= 0xEF;	   //ES1 = 0
	TR1 = 0;          //stop timer1
	SCON1 = 0X50;  	//REN1 = 1,mode 1
   TMOD &= 0X0f;
   TMOD |= 0X20;  	//8bits auto load 

	PCON|=0X40;     //baut *2,smod1

//Mode 1,3 Baud Rate =
//(2^SMOD1 / 32) x (fOSC / (12 x [256 – (TH1)]))
	switch(ucBaut)
	{
		case 4://4800
			ulTemp = 9600;
			PCON&=0xbf;//波特率不加倍
			break;
		case 5:
			ulTemp=9600;
			break;			
		case 6:
			ulTemp=19200;
			break;			
		case 7:
			ulTemp=38400;
			break;			
		case 8:
			ulTemp=57600;
			break;			
		case 9:
			ulTemp=115200;
			break;			
		default:
			ulTemp=38400;
	}
	TH1 = - (char)(2*22118400L/32/12/ulTemp);
	TL1 = TH1;
	P1SFS0 |= 0x0C;//2,3:RXD1,TXD1, XXXX11XX
   P1SFS1 &= 0xF3;//XXXX00XX
	IPA |= 0x10;   //priority is high
	TR1 = 1;
	IEA |= 0x10;	//enable uart1
}


//------------------------------------------------
//	function:void  comm0putchar(uchar ch)
//    send one char from comm0
//note: no interrupt
//------------------------------------------------
void  SendCharComm0(uchar ch)
{	
//	ES0 =0;
	SBUF0 = ch;
   while( TI == 0);
	TI = 0;
//   ES0 = 1;
}

//--------------------------------------------------- 
//	function:read one char from buff
//---------------------------------------------------
bit ReadCharComm0(uchar *ch)
{	
	if(unInBufCntComm0 == 0) return 0; //缓冲空

	*ch = InBufComm0[InHeadComm0++];
   InHeadComm0 %= INBUFLENCOMM0;        //读尽缓冲区,队列头返回0
   unInBufCntComm0--;

   return 1;    			
}

//--------------------------------------------------
//clearcomm0buff
//--------------------------------------------------
void ClearBuffComm0(void)
{	
	ES0 = 0;
	unInBufCntComm0 = 0;
	InTailComm0 = InHeadComm0 = 0;	//clear comm0 buff
	ES0 = 1;
//   unOutBufCntComm0 = 0;
//   OutTailComm0 = OutHeadComm0 = 0;
	
}
//--------------------------------------------------
//	SendBuffCommm0()
//  send sum chars from comm0
//--------------------------------------------------
/*
void  SendBuffComm0(uchar *pb,uint sum)
{	
   uint idata i;

   for(i=0;i<sum;i++)
	{		
       SendCharComm0(pb[i]);
	}
}

*/

//------------------------------------------------
//	function:void  comm1putchar(uchar ch)
//    send one char from comm1
//------------------------------------------------
void  SendCharComm1(uchar ch)
{
 //  IEA &= 0xef; 		//ES1 =0
	SBUF1 = ch;
	while(TI1 == 0); 	//TI1 != 1
	TI1 = 0;				//TI1 = 0
 //  IEA |= 0x10;		//ES1 = 1;
}

//--------------------------------------------------- 
//	function:read one char from buff1
//---------------------------------------------------
bit ReadCharComm1(uchar *ch)
{	
	if(unInBufCntComm1 == 0) return 0; //缓冲空

	*ch = InBufComm1[InHeadComm1++];
   InHeadComm1 %= INBUFLENCOMM1;        //读尽缓冲区,队列头返回0
   unInBufCntComm1--;

   return 1;    			
}
//-----------------------------------------------
//void 	ClearBuffComm0(void);
//-----------------------------------------------
void ClearBuffComm1(void)
{
   IEA &= 0xef; 		//ES1 =0
	unInBufCntComm1 = 0;
	InHeadComm1 = 0;
	InTailComm1 = 0;
//	unOutBufCntComm1 = 0;
//	OutHeadComm1 = 0;
//	OutTailComm1 = 0;
	IEA |= 0x10;	//enable uart1
}

//--------------------------------------------------
//	SendBuffCommm1()
//  send sum chars from comm1
//--------------------------------------------------
void  SendBuffComm1(uchar *pb,uint sum)
{	
   uint idata i;

   for(i=0;i<sum;i++)
	{		
      SendCharComm1(pb[i]);
	}
}
//--------------------------------------------------
//	CTSSendBuffCommm1()
//  send sum chars from comm1,check cts
//--------------------------------------------------
void  CTSSendBuffComm1(uchar *pb,uint sum)
{	
   uint idata i;

   for(i=0;i<sum;i++)
	{		
		while(GPRS_CTS_Statue());
      SendCharComm1(pb[i]);
	}
}
//========================================
//  END OF SOFTWAVE UART2 CODE
//========================================

⌨️ 快捷键说明

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