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

📄 gps.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
字号:
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include "System.h"
#include "Lcd.h"
#include "Menu.h"
#include "UART.h"

//字符数组绝对地址
#define latitude	0x8000
#define longitude	0x9947
#define flag		0xB28E
#define satllite	0xB79D
#define height		0xBCAC
#define speed		0xC6C9
#define angle		0xD5F4

////////////////////////////////////////////////////////////////////////////////////////////////
//GPS模块参数默认值
unsigned char GPSParaList[]={3,8,30,0,0,7,3,26};

////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int code BaudArray[]={12,24,48,96,192,288,576,1152};

void GPSSetUp()						//设置
{
	char MovHand=1;					//移动光标标志位
	char ItemSel=2;					//光标所在行
	//显示界面
	Clear(0,240);
	dprintf(9,0,"GPS串行实验参数设置");
	dprintf(0,16*1,line);
	dprintf(2,16*2,"波特率:     00");
	putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
	dprintf(2,16*3,"时  间:     时");
	putufig(12,16*3,GPSParaList[1],2,0,'0');
	dprintf(12,16*4,"  分:");				
	putufig(12,16*4,GPSParaList[2],2,0,'0');

	dprintf(12,16*5,"  秒");
	putufig(12,16*5,GPSParaList[3],2,0,'0');
	dprintf(12,16*6,"  毫秒");
	putufig(13,16*6,GPSParaList[4],1,0,' ');

	dprintf(2,16*7,"日  期:     年");
	putufig(12,16*7,GPSParaList[5],2,0,'0');
	dprintf(12,16*8,"  月");				
	putufig(12,16*8,GPSParaList[6],2,0,'0');
	dprintf(12,16*9,"  日");
	putufig(12,16*9,GPSParaList[7],2,0,'0');

	dprintf(0,16*12,line);
	dprintf(0,16*13,"选择项目  改变参数");
	dprintf(1,16*14, "芗  兦    戛  戋");
	dprintf(35,16*14, "确定");

	while(1)
	{		
		if(CheckKeyF==1)			//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(MovHand==1)
		{
			int i;
			for(i=2;i<12;i++)
			{
				if(ItemSel==i)	
				dprintf(0,i*16,"贲");
				else
				dprintf(0,i*16,"  ");
			}
			MovHand=0;
		}

		if(Key[0].pressed==1)       //检测到上键
		{
	        Key[0].pressed=0;
			if(ItemSel>2)
			ItemSel--;
			MovHand=1;				
		}

		if(Key[1].pressed==1)       //检测到下键
		{
	        Key[1].pressed=0;
			if(ItemSel<9)
			ItemSel++;
			MovHand=1;		
		}

		if(Key[2].pressed==1)       //检测到-键
		{
	        Key[2].pressed=0;
			switch(ItemSel)
			{
			case 2:		//波特率
				if(GPSParaList[0]!=0)
				{
					GPSParaList[0]--;
					putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
				}
				break;
			case 3:		//时
				if(GPSParaList[1]==0)
				GPSParaList[1]=23;
				else
				GPSParaList[1]--;
				putufig(12,16*3,GPSParaList[1],2,0,'0');
				break;
			case 4:		//分
				if(GPSParaList[2]==0)
				GPSParaList[2]=59;
				else
				GPSParaList[2]--;
				putufig(12,16*4,GPSParaList[2],2,0,'0');
				break;
			case 5:		//秒
				if(GPSParaList[3]==0)
				GPSParaList[3]=59;
				else
				GPSParaList[3]--;
				putufig(12,16*5,GPSParaList[3],2,0,'0');
				break;
			case 6:		//毫秒
				if(GPSParaList[4]==0)
				GPSParaList[4]=9;
				else
				GPSParaList[4]--;
				putufig(13,16*6,GPSParaList[4],1,0,' ');
				break;
			case 7:		//年
				if(GPSParaList[5]==0)
				GPSParaList[5]=99;
				else
				GPSParaList[5]--;
				putufig(12,16*7,GPSParaList[5],2,0,'0');
				break;
			case 8:		//月
				if(GPSParaList[6]==1)
				GPSParaList[6]=12;
				else
				GPSParaList[6]--;
				putufig(12,16*8,GPSParaList[6],2,0,'0');
				break;
			case 9:		//日
				if(GPSParaList[7]==1)
				GPSParaList[7]=31;
				else
				GPSParaList[7]--;
				putufig(12,16*9,GPSParaList[7],2,0,'0');
				break;
			default:
				break;
			}
		}

		if(Key[3].pressed==1)       //检测到+键
		{
	        Key[3].pressed=0;
			switch(ItemSel)
			{
			case 2:		//波特率
				if(GPSParaList[0]!=7)
				{
					GPSParaList[0]++;
					putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
				}
				break;
			case 3:		//时
				if(GPSParaList[1]==23)
				GPSParaList[1]=0;
				else
				GPSParaList[1]++;
				putufig(12,16*3,GPSParaList[1],2,0,'0');
				break;
			case 4:		//分
				if(GPSParaList[2]==59)
				GPSParaList[2]=0;
				else
				GPSParaList[2]++;
				putufig(12,16*4,GPSParaList[2],2,0,'0');
				break;
			case 5:		//秒
				if(GPSParaList[3]==59)
				GPSParaList[3]=0;
				else
				GPSParaList[3]++;
				putufig(12,16*5,GPSParaList[3],2,0,'0');
				break;
			case 6:		//毫秒
				if(GPSParaList[4]==9)
				GPSParaList[4]=0;
				else
				GPSParaList[4]++;
				putufig(13,16*6,GPSParaList[4],1,0,' ');
				break;
			case 7:		//年
				if(GPSParaList[5]==99)
				GPSParaList[5]=0;
				else
				GPSParaList[5]++;
				putufig(12,16*7,GPSParaList[5],2,0,'0');
				break;
			case 8:		//月
				if(GPSParaList[6]==12)
				GPSParaList[6]=1;
				else
				GPSParaList[6]++;
				putufig(12,16*8,GPSParaList[6],2,0,'0');
				break;
			case 9:		//日
				if(GPSParaList[7]==31)
				GPSParaList[7]=1;
				else
				GPSParaList[7]++;
				putufig(12,16*9,GPSParaList[7],2,0,'0');
				break;
			default:
				break;
			}
		}

		if(Key[7].pressed==1)       //检测到确定键,向DACData中填充数据
		{
			ClearKey();
			Clear(0,240);
			uart_ini(GPSParaList[0]);
			return;					
		}	
	}//while(1)
}

void GPS()
{
	char Buf1[256]={"\0"};
	char Buf2[256];
	int N=0;
	unsigned int hour,minute,second;
	char time[10];
	char date[12];
	char *SendBuf=Buf1;
	char *SaveBuf;

	GPSSetUp();
	hour=GPSParaList[1];
	minute=GPSParaList[2];
	second=GPSParaList[3];

	uart_port_ini();
	dprintf(0,16*13,line);
	dprintf(35,224,"退出");
	sprintf(date,"%d%d,%d%d,20%d%d\0",(unsigned int)GPSParaList[7]/10,(unsigned int)GPSParaList[7]%10,\
	(unsigned int)GPSParaList[6]/10,(unsigned int)GPSParaList[6]%10,(unsigned int)GPSParaList[5]/10,(unsigned int)GPSParaList[5]%10);
	Myflag=1;
	X=0;
	Y=0;
	F=0;

	while(1)
	{
		if(CheckKeyF==1)			//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(Myflag==1)
		{
			int i,length,length2;
			unsigned char checksum;
			char AorV;
			Myflag=0;
			Mycounter=counter+40;

			if(N%2==0)
			{
				SendBuf=Buf1;
				SaveBuf=Buf2;
			}
			else
			{
				SendBuf=Buf2;
				SaveBuf=Buf1;
			}
			
			UartSend(SendBuf);
			if(F==1)
			{
				Clear(0,16*13);
				tprintf(0,0,SendBuf);
			}
			else
			tprintf(X,Y,SendBuf);

			//设置时间	
			second++;
			if(second==60)
			{
				second=0;
				minute++;
				if(minute==60)
				{
					minute=0;
					hour++;
					if(hour==24)
					hour=0;
				}
			}
			sprintf(time,"%d%d%d%d%d%d.%d\0",hour/10,hour%10,minute/10,minute%10,second/10,second%10,(unsigned int)GPSParaList[4]);
			//change bank page to BANK2
			PSBANK=0x21;
			//GPGGA:
			sprintf(SaveBuf,"$GPGGA,%s,395%c.%c%c%c%c,N,1161%c.%c%c%c%c,E,%c,%c,4.30,\0",\
				time,CBYTE[latitude+N*5],CBYTE[latitude+N*5+1],CBYTE[latitude+N*5+2],CBYTE[latitude+N*5+3],CBYTE[latitude+N*5+4],\
				CBYTE[longitude+N*5],CBYTE[longitude+N*5+1],CBYTE[longitude+N*5+2],CBYTE[longitude+N*5+3],CBYTE[longitude+N*5+4],\
				CBYTE[flag+N],CBYTE[satllite+N]);
			length=strlen(SaveBuf);
			if(CBYTE[height+N*2]!='0' && CBYTE[height+N*2+1]!='0')
			sprintf(SaveBuf+length,"000%c%c,M,,M,,*\0",CBYTE[height+N*2],CBYTE[height+N*2+1]);			
			else
			sprintf(SaveBuf+length,",M,,M,,*\0");
			length=strlen(SaveBuf);
			checksum=SaveBuf[1];
			for(i=1;i<length-2;i++)
			{
				checksum^=SaveBuf[i+1];
			}
			sprintf(SaveBuf+length,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);

			//GPRMC:
			length=strlen(SaveBuf);
			if(CBYTE[flag+N]=='0')
			AorV='V';	
			else
			AorV='A';
			sprintf(SaveBuf+length,"$GPRMC,%s,%c,395%c.%c%c%c%c,N,1161%c.%c%c%c%c,E,00%c%c.%c,%c%c%c,130905,,E*\0",\
				time,AorV,CBYTE[latitude+N*5],CBYTE[latitude+N*5+1],CBYTE[latitude+N*5+2],CBYTE[latitude+N*5+3],CBYTE[latitude+N*5+4],\
				CBYTE[longitude+N*5],CBYTE[longitude+N*5+1],CBYTE[longitude+N*5+2],CBYTE[longitude+N*5+3],CBYTE[longitude+N*5+4],\
				CBYTE[speed+N*3],CBYTE[speed+N*3+1],CBYTE[speed+N*3+2],CBYTE[angle+N*3],CBYTE[angle+N*3+1],CBYTE[angle+N*3+2]);
			length2=strlen(SaveBuf);
			checksum=SaveBuf[length+1];
			for(i=1;i<length2-length-2;i++)
			{
				checksum^=SaveBuf[length+i+1];
			}
			sprintf(SaveBuf+length2,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);

			//GPZDA:
			length=strlen(SaveBuf);
			sprintf(SaveBuf+length,"$GPZDA,%s,%s,,*\0",time,date);
			length2=strlen(SaveBuf);
			checksum=SaveBuf[length+1];
			for(i=1;i<length2-length-2;i++)
			{
				checksum^=SaveBuf[length+i+1];
			}
			sprintf(SaveBuf+length2,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);

			//change back
			PSBANK=0x11;

			N++;
			if(N==1294)
			N=0;
		}

		if(Key[7].pressed==1)            	//退出串口模块
		{
			ClearKey();						//清按键
			Clear(0,240);					//清屏幕
			return;
		}
	
	}
}

⌨️ 快捷键说明

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