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

📄 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 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 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[5];
volatile uChar g776SendBytePos=0;
volatile uChar g776SendBitPos=0;
volatile uChar g776SendFinishFlag = 0;
volatile uChar g776SendTimeout = 0;

sbit CLK = P3^2;
sbit DAT = P1^7;
sbit TEST12  = P1^2;
sbit TEST13 = P1^3;

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=0;
//	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;
	P1=0xff;
	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;
	SBUF_SERIAL;
	tTemp = (i%100)/10;
	SBUF_SERIAL;
	tTemp = i%10;
	SBUF_SERIAL;
}

void Timer0()interrupt 1
{
	TR0 = 0 ;
	TH0=0xfb;
	TL0=0xf5; //550us for 22.1184M
	TR0 = 1 ;
	TEST12=~TEST12;
	if(gReceiveTimeout)
		gReceiveTimeout--;
	if(gSendTimeout)
		gSendTimeout--;
	if(g776SendTimeout)
		g776SendTimeout--;
}

const uChar code pByteMap[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Int0() interrupt 0
{
	//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==5)
			{
				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;
		}

	}
}

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();
			EA=0;
			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]);
			EA=1;
		}
		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;
		}
	}//while(1)
}

⌨️ 快捷键说明

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