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

📄 sim232.c

📁 单片机与GPS的通讯
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
/*fosc=11.0592MHZ*/


#define RECBUFSIZE  12
//----------------------------------------------------------------------
sbit RXD2 = P1^6;
sbit TXD2 = P1^7;

//----------------------------------------------------------------------


//-------------------------------------------------------------
void delay(unsigned int ms);

//-------------------------------------------------------------

bit   sendflag;

unsigned char TMR_COUNT;

unsigned char RecBuffer1[RECBUFSIZE];
unsigned char RecBuffer2[RECBUFSIZE];

unsigned char  RecBuf1_In,RecBuf1_Out,RecBuf2_In,RecBuf2_Out;

#define  PURGEBUFFER1		{RecBuf1_In = RecBuf1_Out ; } 
#define  PURGEBUFFER2		{RecBuf1_In = RecBuf1_Out ; } 


int InitCommPort(void);
unsigned char  ReceiveByte(unsigned char * val );
unsigned char  SendByte(unsigned char val);
void  simSendchar(unsigned char val);
unsigned char simrecchar(unsigned char * val);

void SimSendStrFrame(char * kindstr,char *  infostr);

unsigned char   Infostr[9];

unsigned char   DEVICEID[9];

#define    GPSEAST 0
#define    GPSNORTH 1
#define    DEVICESPEED 2
#define    GPSDATE 3
#define    GPSTIME 4

//unsigned char   GPSEast[9];
//unsigned char   GPSNorth[9];
//unsigned char   DeviceSpeed[6];
//unsigned char  GPSDate[7];
//unsigned char  GPSTime[7];

void  PutSimRecBuffer(unsigned char  recval);
unsigned char GetSimReceiveByte(unsigned char * val);


unsigned char CheckSimUartCMD(void);
unsigned char  GetGPSData(unsigned char kind);

void main(void)
{
		unsigned char temp1;
		
		InitCommPort();

      while(1)
      {

				if ( simrecchar(&temp1) ==1 ) PutSimRecBuffer(temp1);
            if (CheckSimUartCMD()==1)
            {

//infostr ascii
//unsigned char   DEVICEID[9];
						SimSendStrFrame('A', DEVICEID);
//unsigned char   GPSEast[9];
						GetGPSData(GPSEAST);
						SimSendStrFrame('E',Infostr);
//unsigned char   GPSNorth[9];
						GetGPSData(GPSNORTH);
			
						SimSendStrFrame('N',Infostr);
//unsigned char   DeviceSpeed[6];
						
						GetGPSData(DEVICESPEED);
						SimSendStrFrame('S',Infostr);
//unsigned char  GPSDate[7];
						GetGPSData(GPSDATE);
						SimSendStrFrame('D',Infostr);
//unsigned char  GPSTime[7];
						GetGPSData(GPSTIME);
						SimSendStrFrame('T',Infostr);
            }
     	}
} 



int InitCommPort(void)
{
	  RecBuf1_In=0; RecBuf1_Out=0;
	  RecBuf2_In=0; RecBuf2_Out=0;

	 TMR_COUNT = 0;
	 sendflag =0;

/*Timer 1 is being used to generate baud rates.*/
     SCON = 0X50;

     TMOD = 0X21;
    	
	  TH1= 0xfa ;
	  TL1= 0xfa	;                	//4800 , n, 8, 1

  	  TH0=0xdb;
	  TL0=0xff;                         /*10ms timer*/
     
     
	  TR0=0;
	  TR1 =1;


	  PS=1;
	  ES=1;
	  ET0=0;
	  EA=1;
 	  RI = 0;              
	  return 0;
}


void  Serial_vector(void) interrupt 4  using 1
{
	unsigned char aTempVal;
 
	 if(RI)
	 {
		 aTempVal=SBUF;  RI=0;
		 RecBuffer1[RecBuf1_In]=aTempVal;
		 if(++RecBuf1_In==RECBUFSIZE) RecBuf1_In=0;
	 }
	 else
	 {
	 	TI =0;
	 	sendflag = 0;
	 }
	 

}
 
void Timer0_vector(void)interrupt 1 using 2			//10ms interrupt
{
 	 TH0=0xdb;
	 TL0=0xff;

	 TMR_COUNT++;

	
}

unsigned char  SendByte(unsigned char val)
{
	while (sendflag==1);
	
		SBUF = val ;
		sendflag	 = 1;
		return 1;
}


unsigned char ReceiveByte(unsigned char * val)
{
     if (RecBuf1_Out==RecBuf1_In) return 0 ;
     *val = RecBuffer1[RecBuf1_Out];
     if (++RecBuf1_Out==RECBUFSIZE) RecBuf1_Out=0;
     return 1;
}

unsigned char  GetGPSData(unsigned char kind)
{
//  ask Gps module  
	switch ( kind)
	{
		case GPSEAST  :	
								break;
								
		case  GPSNORTH :
								break;
		case  DEVICESPEED:
							   break;
		case  GPSDATE :
								break;
		case GPSTIME :		
								break;
	}

//  must check time out


	return 0;
}


unsigned char CheckSimUartCMD(void)
{

	data  short int temp_RecBuf2_Out ;
	unsigned char i,val,tempstr[4];
	
	bit   findcmd ;
	tempstr[0]='G';
	tempstr[1]='C';
	tempstr[2]='P';
	tempstr[3]='M';
		
	findcmd = 0;	
	temp_RecBuf2_Out = RecBuf2_Out	;			//check 'GCPM' in  RecBuffer2[RECBUFSIZE];

	i=0;
   while  (1)
	{
		if (GetSimReceiveByte(&val)== 1)
		{
			if ( i<4) 
			{
				if (val !=tempstr[i])
					temp_RecBuf2_Out = RecBuf2_Out;	
			}	
			else		
			if (val =='#' ) 
			{
				findcmd = 1;
				break;
			}
		}
		else    break;
		i++;
	}

	RecBuf2_Out = temp_RecBuf2_Out	;		
	
//---------------------------	
//mp rec data

	
//---------------------------	
	if (findcmd == 1 )	return 1 ;
	else  	return 0;
}


void  PutSimRecBuffer(unsigned char  recval)
{
	
		 RecBuffer2[RecBuf2_In]=recval;
		 if(++RecBuf2_In==RECBUFSIZE) RecBuf2_In=0;
}
unsigned char GetSimReceiveByte(unsigned char * val)
{
     if (RecBuf2_Out==RecBuf2_In) return 0 ;
     *val = RecBuffer2[RecBuf2_Out];
     if (++RecBuf2_Out==RECBUFSIZE) RecBuf2_Out=0;
     return 1;
}




void SimSendStrFrame(char * kindstr,char *  infostr)
{
	while ( *kindstr>0)
	{
		simSendchar(*kindstr);
		kindstr++;
	}
	
	while ( *infostr>0)
	{
		simSendchar(*infostr);
		infostr++;
	}
	
}


#define  delaynop10m()   { 	TL0=0x1c;	TH0=0xfd; TR0=1;   	TF0=0;   	while(TF0==0) ; TR0=0 ;}
#define  delaynop03m()   { 	TL0=0x00;	TH0=0xff; TR0=1;   	TF0=0;   	while(TF0==0) ; TR0=0 ;}

 //1200,n,8,1
void  simSendchar(unsigned char val)
{
		short int  i =8;
		EA=0;	
		TXD2 = 0;
			delaynop10m()

		for (i = 0; i<8 ;i++)
		{
			if(( val>>i)&0x1) 		TXD2 = 1;
			else TXD2 = 0;
			delaynop10m()
		}
		TXD2 = 1;
		delaynop10m()
		TXD2 = 1;
		EA=1;						
}

unsigned char simrecchar(unsigned char * val)
{
	unsigned char  aa;
	short int  i =8;

	if  (RXD2 ==1 )   return 0;
	delaynop03m()
	if  (RXD2 ==1 )   return 0;
	delaynop03m()
	if  (RXD2 ==1 )   return 0;
	
	for ( ; i>0; i--)
	{
		delaynop10m()
		aa=(aa>>1)&0x7f;			
		if   (RXD2 ==1 )  aa  |=0x80;
		}
	delaynop10m()
	if  (RXD2 ==0 )   return 0;
	*val =aa;
	return  1;
		
}



void delay(unsigned int ms)
{
  	unsigned int  i;
  	TMOD|=0x01;                     
  	TR0=1;
  	if(ms>=10) 
  	{
    	i=ms/10;
    	ms%=10;
    	for( ; i>0; i--) 
    	{
      	TL0=0x00;
      	TH0=0xdc;
      	TF0=0;
      	while(TF0==0) ;
    	}
  	}
  	for( ; ms>0; ms--) 
  	{
    	TL0=0x67;
    	TH0=0xfc;
    	TF0=0;
    	while(TF0==0) ;
  	 }
}







⌨️ 快捷键说明

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