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

📄 remoter.c

📁 Gps数据的获得及处理
💻 C
字号:
#if 0

// Data frame format MaxLen=255
// Token + type + frameLen + Data + CheckSum
//frameLen is sum of Token,type,frameLen+data+CheckSum
// Token = 0x24
#include<common.h>
//extern uChar CompareData(void);
//extern uChar GetCurLongitudeLatitude(uChar *p);
extern uChar Handle776InfoData(uChar *p);
extern uChar CompareData(void);
extern void ViewGpsDat();
extern uChar GetCurLongitudeLatitude(uChar *p);

volatile uChar gIrKeyValue=0;
volatile uChar gNecState = Nec_Null;
volatile uInt2 gIrTick;//per tick 200us

void Init(void);
void delay(uchar);
void SendCharsToSerial(uchar *p,uchar);
void PrintNum(uChar i);

volatile uInt2 gSystemTick=0;
volatile uChar g500usCnt = 0;
volatile uChar g100msCnt = 0;
volatile uChar xdata pReceiveBuffer[150] ;
volatile uChar gGetInfoDataSuccessFlag=0;

//max 100 station.
uChar gTotalStation=0;
uChar gReceiveTotalStation=0;

GpsInfo xdata pGpsInfo[50];
uInt4 gCurLongitude = 0;
uInt4 gCurLatitude = 0;

volatile uChar gReceiveTimeout = 8;
volatile uChar gSerialReceiveFlag=0;
volatile uInt2 gSendTimeout = 0; 
volatile uInt2 gSendArray=0;
volatile uChar gSendBit=0;
volatile uInt2 gSendLen = 0;



volatile uChar g776SendFlag=0;
//volatile uChar idata p776SendArray[20];
volatile uChar g776SendBytePos=0;
volatile uChar g776SendBitPos=0;
volatile uChar g776SendFinishFlag = 0;
volatile uChar g776SendTimeout = 0;

const uChar code pByteMap[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Delay_100ms(uChar param)
{
	g100msCnt=param;
	while(1)
	{
		if((g500usCnt==0)&&(g100msCnt==0))
			break;
	}
}
void init_reg(void)
{
	CHPENT=0x87;
	CHPENT=0x59;
	CHPCON|=0x10;
	CHPENT=0;
}

void Init(void)
{
	TMOD=0x21;
	TH0=0xfa;
	TL0=0x00;
	ET0=1;
	EX0=0;
	EX1=1;
//	TH1=0xfa;//0xf4 is 4800 for 22.1184 ,0xfa is 9600 for 22.1184 
//	TL1=0xfa;//0xfd for 19200
	TH1=0xf4;
	TL1=0xf4;
	ET1=0;
//	PCON=0x80;	//bandrate=19200 for 11.0592 
 	PCON=0x00;		//bandrate=19200 for 22.1184
	SCON=0x50;
	RI=TI=0;
	ES=1;
	TR1=1;
	TR0=1;
	EA=1;
	IT0=1;
	IT1=1;
	P1=0xff;
	IP=0x05;
	OpenInt0AndCloseSerial();
	init_reg();
}



void SendCharsToSerial(uchar *p,uchar count)
{
	uchar i;
	EA=0;
	for(i=0 ; i<count; i++)
	{
		SBUF = p[i];
		while(!TI);
		TI=RI=0;
	}
	EA=1;
}

void PrintNum(uChar i)
{
	#define SBUF_SERIAL SBUF=tTemp + 0x30; \
						while(!TI); \
						TI=RI=0

	uChar tTemp = i/100;
	EA=0;
	SBUF_SERIAL;
	tTemp = (i%100)/10;
	SBUF_SERIAL;
	tTemp = i%10;
	SBUF_SERIAL;
	EA=1;
}

void Timer0()interrupt 1	//for all sort of timeout and system'tick 
{

	TR0 = 0 ;
//	TH0=0xfb;
//	TL0=0xf5; //560us for 22.1184M
	TH0=0xfe;
	TL0=0x8f; //200us for 22.1184M
	TR0 = 1 ;
	
	if(gReceiveTimeout)
		gReceiveTimeout--;
	if(gSendTimeout)
		gSendTimeout--;
	if(g776SendTimeout)
		g776SendTimeout--;
	if(g500usCnt)
		g500usCnt--;
	if((g100msCnt)&&(g500usCnt==0))
	{
		g500usCnt = 200;
		g100msCnt--;
	}

	gSystemTick++;
	GUEST ^=0x01; 

}

void Int1() interrupt 2		//for remoter
{
	#define dIr_Margin		2

	static uChar sTempCnt = 0;
	static uChar sIrBuffer[4];
		
	switch(gNecState)
	{
		case	Nec_Null:
			gIrTick=gSystemTick;
			gNecState = Nec_Head;
			sTempCnt=0;
			break;	
		case	Nec_Head:
		{
			if((gSystemTick>=(gIrTick+67-dIr_Margin)) && (gSystemTick<=(gIrTick+67+dIr_Margin)))
			{
				gIrTick=gSystemTick;
				gNecState = Nec_FacDat;
			}
			else
			{
				gNecState = Nec_Null;
			}
			break;
		}
		case	Nec_FacDat:
			if((gSystemTick>=(gIrTick+6-dIr_Margin)) && (gSystemTick<=(gIrTick+6+dIr_Margin)))//0
				sIrBuffer[sTempCnt/8] &= ~pByteMap[sTempCnt%8];
			else if((gSystemTick>=(gIrTick+11-dIr_Margin)) && (gSystemTick<=(gIrTick+11+dIr_Margin)))//1
				sIrBuffer[sTempCnt/8] |= pByteMap[sTempCnt%8];
			else
				gNecState = Nec_Null;
		
			sTempCnt++;
			gIrTick = gSystemTick ;
			if(sTempCnt==32)
			{
				gNecState = Nec_Null;
				if((sIrBuffer[0]==~sIrBuffer[1])&&(sIrBuffer[2]==~sIrBuffer[3]))
					gIrKeyValue = sIrBuffer[2];
			}
			break;

		default:
			gNecState = Nec_Null;
			break;
	}
}

void Int0() interrupt 0		//for bi_communication
{

	//for receive data from 776
	if(g776SendFlag==1)	
	{
		DAT = 1;
		if(DAT==1)
		//	p776SendArray[g776SendBytePos] |= pByteMap[g776SendBitPos];
			pReceiveBuffer[g776SendBytePos] |= pByteMap[g776SendBitPos];
		else
		//	p776SendArray[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
			pReceiveBuffer[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
		g776SendTimeout = 200;
		g776SendBitPos++;
		if(g776SendBitPos==8)
		{
			g776SendBitPos=0;
		//	if(++g776SendBytePos==(p776SendArray[2]))
			if(++g776SendBytePos==(pReceiveBuffer[2]))
			if(g776SendBytePos>4)
			{
				g776SendBytePos=0;
				g776SendFlag = 0;
				DAT = 1;
				g776SendFinishFlag = 1;
			}
		}
		return;
	}
	
	//send data to 776
	if((gSendArray==0)&&(gSendBit==0))
		return;

	if(pReceiveBuffer[gSendLen-gSendArray]&pByteMap[8-gSendBit])
		DAT =1;
	else
		DAT =0;
	gSendTimeout = 200;

	if(gSendBit)
		gSendBit-=1;		
	if((gSendBit==0)&&(gSendArray))
	{
		gSendArray--;
		if(gSendArray)
			gSendBit=8;
		else
			DAT = 1;//finished send
	}
}

void delay(uChar a)//delay(1) for 500us 
{
	uChar i,k;
	for(k=0 ;k<a; k++)
		for(i=0 ;i<200; i++)
				_nop_();
}


void Serial_int(void) interrupt 4 
{	//$GPRMC,212110.64,V,3339.1116,N,11742.9893,W
	//pReceive[]=",212110.64,V,3339.1116,N,11742.9893,W";
	code uChar pGPRMC[]={0x24, 0x47, 0x50, 0x52 ,0x4d ,0x43};//"$GPRMC";
	static uChar sReceiveState=0;
	uChar   c;
	if(_testbit_(RI))
	{
		RI=0;
		TI=0;
		c=SBUF;	

		if(sReceiveState<6)
		{
			if(pGPRMC[sReceiveState] != c)
			{
				sReceiveState = 0;
				return;
			}
			sReceiveState++;
		}else 
		{
			pReceiveBuffer[sReceiveState-6]=c;
			sReceiveState++;
			if(sReceiveState == 43)
			{
				sReceiveState = 0;
				gSerialReceiveFlag = 1;
			}
		}
	}
	
	if(sReceiveState>2)
	{
		if(gReceiveTimeout==0)
 			sReceiveState = 0;
		gReceiveTimeout=200;	
	}
	else			
		gReceiveTimeout=200;
	
}
void SendDataTo776(uChar type ,uChar len,uChar *pTemp)
{
	uChar *pSendTo776Buffer = pReceiveBuffer;
	uChar i;
	uChar tTempSum=0;

	OpenInt0AndCloseSerial();	
	pSendTo776Buffer[0]=0x24;
	pSendTo776Buffer[1]=type;
	pSendTo776Buffer[2]=len + 4;//4 for Token+type+len+CheckSum;
	for(i=0 ;i<len; i++)
		pSendTo776Buffer[3+i] = pTemp[i];
	for(i=0 ;i<(len+3); i++)
		tTempSum = pSendTo776Buffer[i];
	pSendTo776Buffer[len+3] = tTempSum;
	gSendArray = len+4;
	gSendLen = gSendArray;
	gSendBit=8;
	gSendTimeout = 200;
	DAT = 0;
}
void main(void)
{
	delay(20);
	Init();
	Delay_100ms(2);
	while(1)
	{	
		if(gGetInfoDataSuccessFlag == 0)
		{
			if((gReceiveTotalStation == gTotalStation)&&(gReceiveTotalStation!=0))
			{
				gGetInfoDataSuccessFlag = 1;
				SendDataTo776(0xff,2,"OK");
			}
		}
		if(gIrKeyValue)
		{	
			PrintNum(gIrKeyValue);
			if(gIrKeyValue == _Key_2)
			{
				uChar pTemp[2];
				pTemp[0]=0x05;
				pTemp[1]=~0x05;
				SendCharsToSerial("SendData\n",9);
				SendDataTo776(0x01,2,pTemp);
			//	ViewGpsDat();
			}
			if(gIrKeyValue == _Key_3)
			{
				PrintNum(gTotalStation);
				PrintNum(gReceiveTotalStation);
			}
			if(gIrKeyValue == _Key_4)
			{
				gCurLongitude = 0x12345678;
				gCurLatitude = 0x123456789;
				if(CompareData()!=0)
					SendCharsToSerial("find\n",5);
				else
					SendCharsToSerial("no find\n",8);
				PrintNum(gTotalStation);
			}
	
			gIrKeyValue=0;
		}
		if(gSerialReceiveFlag == 1)
		{
			gSerialReceiveFlag = 0;
			SendCharsToSerial(pReceiveBuffer,43);
		
	//		if(GetCurLongitudeLatitude(pReceiveBuffer))
			{
				uChar  pTemp[2];
				pTemp[0] = CompareData();
				pTemp[1]=~pTemp[0];
//				if(pTemp!=0)
					SendDataTo776(0x0,2,pTemp);
			}
		}
		if(g776SendFinishFlag == 1)
		{
			g776SendFinishFlag = 0;
			
			EnterCrucial();
			DAT=1;
			PrintNum(pReceiveBuffer[2]);
			if(Handle776InfoData(pReceiveBuffer)==TRUE)
				SendCharsToSerial("GPS Succed!\n",12);
			else
				SendCharsToSerial("GPS Fail!\n",10);
			ExitCrucial();
			CloseInt0AndOpenSerial();
		}
		if((gSendTimeout ==0)&&((gSendArray!=0)||(gSendBit!=0)))//fail send and restart .
		{
				OpenInt0AndCloseSerial();
				gSendTimeout  = 200;		
				gSendArray =gSendLen;
				gSendBit=8;
				DAT = 0;
		}
		if(gNecState != Nec_Null)
		{
			if(gSystemTick>(gIrTick+67))
			{
		 		SendCharsToSerial("Nec_Null\n",9);
				gNecState = Nec_Null;
			}
		}
	
		if((gSendArray==0)&&(gSendBit ==0)&&(g776SendFlag==0))
		{
			CloseInt0AndOpenSerial();
			DAT=1;
			CLK=1;
		
			if(DAT == 0)
			{	
				DAT = 0;
				g776SendFlag = 1;
				g776SendBitPos=0;
				g776SendBytePos = 0;
				g776SendTimeout=200;
				OpenInt0AndCloseSerial();
			}
		}

		if((g776SendTimeout==0)&&(g776SendFlag == 1))//fail and GiveUp
		{
			g776SendFlag = 0;
			g776SendBytePos = 0;
 		    g776SendBitPos = 0;
			SendCharsToSerial("AA!\n",4);
			DAT = 1;
			CloseInt0AndOpenSerial();
		}
		
	}//while(1)
}

#else

//#include<reg52.h>
#include "reg51.h"

sbit STB = P2^1;
sbit CLK = P2^2;
sbit DAT = P2^3;


#define uchar unsigned char
#define uint unsigned int

void InputBYTE(uchar tTemp);

void Long_Delay(void)
{
	int i=4000;

	while(i--);
}
void delay(void)
{
	uchar i;
	for(i=0;i<1;i++);
}
void send(uchar tTemp)
{
	STB=1;
	DAT=1;
	CLK=1;
	
	STB=0;
	InputBYTE(tTemp);
	
	STB=1;
	DAT=1;
	CLK=1;

}
void InputBYTE(uchar tTemp)
{ 	
	uchar ar,i;
	#if 0
	
	for(i=0;i<8;i++)
	{
		delay();
		CLK=0;
		delay();
		ar=0x01;
		ar<<=i;
		if(tTemp&ar) 
			DAT=1;//为1则置高电平
		else 
			DAT=0;//为0则置低电平
		CLK=1;//置脉冲
		delay();
	}
	#else
	
	ar=0x01;
	for(i=0;i<8;i++)
	{
		CLK=0;
		if(ar&tTemp)
			DAT=1;
		else
			DAT=0;
		ar<<=0x01;
		CLK=1;	
	}
	
	#endif
}

void InputBYTE2(uchar tTempValue)
{
	uchar i;
	uchar tTemp=0x01;
	for(i=0;i<8;i++)
	{
		CLK=0;
		if(tTemp&tTempValue)
			DAT=1;
		else
			DAT=0;
		tTemp<<=0x01;
		CLK=1;
	}
}
void displaymodeset()
{
	delay();
	send(0x02);
	delay();
}
void dataset()
{
	delay();
	send(0x40);
	delay();
}

void displaycontrolset()
{
	delay();
	send(0x8c);
	delay();
}

void senddata(uchar ucaddr,uchar senda)
{
	delay();
	STB=1;
	delay();
	STB=0;
	delay();
	InputBYTE(ucaddr);
	
		
//	delay();
	InputBYTE(senda);
	STB=1;
	delay();
}


void UpdateVFD(uchar add,uchar dat);
void main(void)
{
	int i;

	dataset();//数据设置命令
	displaymodeset();//显示模式设置命

⌨️ 快捷键说明

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