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

📄 remoter(双向通讯即遥控头).c

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

#include "reg51.h"
#include< intrins.h>
typedef unsigned char uchar;
typedef unsigned char uChar;
typedef unsigned  int ushort;
typedef unsigned short uInt2;
typedef unsigned long uInt4;
typedef unsigned char BYTE;
typedef uChar BOOL;
#define FALSE	0
#define TRUE	1

sfr CHPENT    = 0xf6;
sfr CHPCON    = 0xbf;

#define Pro_Head	0
#define Pro_LenHigh	1
#define Pro_LenLow	2
#define Pro_Serial	3
#define Pro_Type	4
#define Pro_Data	5
#define Pro_Sum		6
void Init(void);
void delay(uchar);
void SendCharsToSerial(uchar *p,uchar);
void PrintNum(uChar i);

volatile uInt2 gSystemTick=0;

volatile uChar gReceiveState = Pro_Head;
volatile uChar xdata pReceiveBuffer[255] ;//288
//volatile uChar idata  pReceiveBuffer[127] ;
//volatile uChar pReceiveBuffer[60] ;
volatile uChar gReceiveTimeout = 8;
volatile uChar gSerialReceiveFlag=0;
volatile uInt2 gSendTimeout = 0; 
volatile uInt2 gSendArray=0;
volatile uChar gSendBit=0;
volatile uInt2 gSendLen = 0;
#define OpenInt0AndCloseSerial()	ES=0; EX0=1
#define CloseInt0AndOpenSerial()	EX0=0; ES=1

volatile uChar g776SendFlag=0;
volatile uChar g776SendArray[10];
volatile uChar g776SendBytePos=0;
volatile uChar g776SendBitPos=0;
volatile uChar g776SendFinishFlag = 0;
volatile uChar g776SendTimeout = 0;

#define Nec_Null		0
#define Nec_Head		1
#define Nec_FacDat		2
volatile uChar gNecState = Nec_Null;
volatile uInt2 gIrTick;//per tick 200us
volatile uChar gIrKeyValue = 0;
volatile uChar gKeyValue = 0;


sbit CLK = P3^2;
sbit DAT = P1^7;
sbit TEST12  = P1^2;
sbit TEST13 = P1^3;
const uChar code pByteMap[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
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;
	CloseInt0AndOpenSerial();
	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--;
	gSystemTick++;

}

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)
			g776SendArray[g776SendBytePos] |= pByteMap[g776SendBitPos];
		else
			g776SendArray[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
		g776SendTimeout = 200;
		g776SendBitPos++;
		if(g776SendBitPos==8)
		{
			g776SendBitPos=0;
			if(++g776SendBytePos==10)
			{
				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 
{
	static uChar sReceiveCheckSum = 0;
	static uInt2 sTempPos=0 ;
	uChar   c;
	if(_testbit_(RI))
	{
		RI=0;
		TI=0;
		c=SBUF;

		switch(gReceiveState)
		{
			case	Pro_Head:
					if(c==0x24)
					{
						gReceiveState=Pro_LenHigh;
						sReceiveCheckSum=c;	
						pReceiveBuffer[0]=c;	
						gReceiveTimeout=40; //20ms
					}
					break;
			
			case	Pro_LenHigh:
					if((c==0x30)||(c==0x31))
					{
						gReceiveState=Pro_LenLow;
						sReceiveCheckSum +=c;
						pReceiveBuffer[1]=c;
						if(gReceiveTimeout==0)
 				    		gReceiveState=Pro_Head;
						else
							gReceiveTimeout=40; 
					}
					else	
						gReceiveState=Pro_Head;
 					break;
			case	Pro_LenLow:
					{
						gReceiveState=Pro_Serial;
						pReceiveBuffer[2] = c;
						sReceiveCheckSum +=c;
						if(gReceiveTimeout==0)
 				    		gReceiveState=Pro_Head;
						else
							gReceiveTimeout=40; 
					}
 					break;
			case	Pro_Serial:
					{
						gReceiveState=Pro_Type;
						sReceiveCheckSum +=c;
						pReceiveBuffer[3]=c;
						sTempPos=4;
						if(gReceiveTimeout==0)
 				    		gReceiveState=Pro_Head;
						else
							gReceiveTimeout=40; 
					}
 					break;
			case	Pro_Type:
					{
						gReceiveState=Pro_Data;
						sReceiveCheckSum +=c;
						pReceiveBuffer[4]=c;
						sTempPos=5;
						if(gReceiveTimeout==0)
 				    		gReceiveState=Pro_Head;
						else
							gReceiveTimeout=40; 
					}
 					break;
			case	Pro_Data:
					if(pReceiveBuffer[2]>sTempPos)
					{
						pReceiveBuffer[sTempPos++] = c;
						sReceiveCheckSum+=c;
						if((pReceiveBuffer[2]-1)==sTempPos)
							gReceiveState = Pro_Sum;	
						if(gReceiveTimeout==0)
 				    		gReceiveState=Pro_Head;
						else
							gReceiveTimeout=40; 
					}else
						gReceiveState=Pro_Head;
 					break;
			case	Pro_Sum:	
			 		if(c==sReceiveCheckSum)
					{
						pReceiveBuffer[sTempPos]=c;
						gSerialReceiveFlag = 1;
						gReceiveState = Pro_Head;	
					}
			 		break;
			default:
					gReceiveState=Pro_Head;
					break;
		}

	}
}

uChar	KeyScan(void)	//P1.0~P1.3
{
	#define dPortNum	4	//10Key	
	uChar i=0;
	uChar tTempKeyValue=0;
	uChar tTemp = 0x0f;
	for(i=0 ;i<dPortNum; i++)
	{
		P1=0x0f&tTemp;
		if(P1&0x0f != 0x0f&tTemp)
		{
			tTempKeyValue=P1&0x0f + 4*i;
			break;
		}
		tTemp<<=1;	
	}
	return tTempKeyValue;
} 
uChar GetKeyValue(void)
{
	uChar tKeyValue = KeyScan();
	uChar tKeyValue1=0; 
	if(tKeyValue)
		delay(5);
	else
		return 0;
	tKeyValue1=KeyScan();
	if(tKeyValue == tKeyValue1)
		return tKeyValue;
	else
		return 0;
}
void main(void)
{
	Init();
	while(1)
	{
		if(gSerialReceiveFlag == 1)
		{	
			OpenInt0AndCloseSerial();
			gSerialReceiveFlag = 0;
			gSendArray = pReceiveBuffer[2];
			gSendLen = gSendArray;
			gSendBit=8;
			gSendTimeout = 200;
			DAT = 0;
		}
		if(g776SendFinishFlag == 1)
		{
			uChar i;
			g776SendFinishFlag = 0;
			CloseInt0AndOpenSerial();
			if((g776SendArray[0]==0x55)&&(g776SendArray[1]==0x23)&&(g776SendArray[2]==0x34)
							&&(g776SendArray[3]==0x45)&&(g776SendArray[4]==0x56))
					SendCharsToSerial("Success:",7);
			else
					SendCharsToSerial("Fail:",5);
			for(i=0;i<5;i++)
					PrintNum(g776SendArray[i]);
			SendCharsToSerial("Para:",4);
			PrintNum(gNecState);
		}
		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((gSendTimeout ==0)&&((gSendArray!=0)||(gSendBit!=0)))//fail send and restart .
		{
				OpenInt0AndCloseSerial();
				gSendTimeout  = 200;		
				gSendArray =gSendLen;
				gSendBit=8;
				DAT = 0;
		}
		
		if((g776SendTimeout==0)&&(g776SendFlag == 1))//fail and GiveUp
		{
			g776SendFlag = 0;
			g776SendBytePos = 0;
 		    g776SendBitPos = 0;
			DAT = 1;
		}
		if(gIrKeyValue)
		{
			SendCharsToSerial("ir:",3);
			PrintNum(gIrKeyValue);
			if(gIrKeyValue==13)
			{
				PrintNum(gSendArray);
				PrintNum(gSendBit);
				PrintNum(g776SendFlag);
			}
			gIrKeyValue = 0;
		}
/*
		if( (gKeyValue=GetKeyValue())!=0)
		{
			SendCharsToSerial("key:",4);
			PrintNum(gKeyValue);
			gKeyValue = 0;
		}
*/
		if((gSystemTick-gIrTick)>500)
		{
			if(gNecState != Nec_Null)
			{
				gIrTick = gSystemTick;
				gNecState = Nec_Null;
			}
		}

	}//while(1)
}

⌨️ 快捷键说明

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