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

📄 main.c

📁 ATmega128的GPS例子
💻 C
字号:
//ICC-AVR application builder : 2007-11-21
// Target : M16
// Crystal: 8.0000Mhz
                  
/******************  SMG12232ZK串行接口程序******************
* Title : Accessing to LCD-CONTROLLER                                   
* Date :  2007.10.18                                                      
* Support telephone:       
* Support fax :     
* Create by :	       
* DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER  
*******************************************************************/

#include <iom16v.h>		//ATMEGA48头文件
#include <macros.h>		//宏定义
//#include <math.h>	
#include "define.h"		//端口定义
#include "initrialm16.h"//初始化mcu
#include "delay.h"		//延时程序
#include "smg12232zk.h" //122*32点阵屏驱动程序


void Get_Key(void);
void Get_GPRMC_data(void);//提取GPRMC数据
long Get_Area(long x1,long y1,long x2,long y2);


Byte const COS_TAB[90]=
	{
	100,100,100,100,100,99, 99, 99, 99, 98, 
	98, 98, 97, 97, 97, 96, 96, 95, 95, 94, 
	93, 93, 92, 91, 91, 90, 89, 88, 87, 87, 
	86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 
	75, 74, 73, 72, 71, 69, 68, 67, 66, 64, 
	63, 62, 60, 59, 57, 56, 55, 53, 52, 50, 
	49, 47, 45, 44, 42, 41, 39, 38, 36, 34, 
	33, 31, 29, 28, 26, 24, 23, 21, 19, 17, 
	16, 14, 12, 11,  9,  7,  5,  4,  2,  0 
	};

void main(void)
{
	Word i;
 	Init_Devices();
	Lcd_Reset();
	while(1)
	{
		Get_Key();
		if(key != 0)
		{
			switch(key)
			{
				case 1: flag_area = 1;break;//开始测量
				case 2: flag_area = 2;break;
				default:break;
			}
			key_dis = key;
			key = 0;
		}
		if(flag_area == 0)
		{
			Hzk_Dis_Data(1,1,latitude,9);
			Hzk_Dis_Data(2,1,longitude,9);
		}
		if(flag_area == 1)
		{
			x0_longitude = longitude;//保存0点的坐标
			y0_latitude = latitude;
			x1_post = 0;
			y1_post = 0;
			area = 0;
			flag_area = 3;//测量开始
		}
		if(flag_area == 3)
		{
			//计算本次的相对坐标
			xishu = PI2RDIV360*COS_TAB[latitude/1000000-1]/100000;
			x2_post = (longitude - x0_longitude)*xishu;
			y2_post = (latitude - y0_latitude)*111;
			area += Get_Area(x1_post,y1_post,x2_post,y2_post);
			//计算完成本次坐标次数前移
			x1_post = x2_post;
			y1_post = y2_post;

			x_dis = x1_post;//显示偏移坐标
			y_dis = y1_post;
			if(x_dis < 0)
			{
				x_dis = ~(x_dis-1);
			}
			if(y_dis < 0)
			{
				y_dis = ~(y_dis-1);
			}
			//Hzk_Dis_Clr();
			Hzk_Dis_Data(1,1,x_dis/10,9);//显示相对坐标*0.01米
			Hzk_Dis_Data(2,1,y_dis/10,9);	
		}
		if(flag_area == 2)
		{
			x2_post = (longitude - x0_longitude)*11;
			y2_post = (latitude - y0_latitude)*11;
			area += Get_Area(x2_post,y2_post,x0_post,y0_post);
			if(area < 0)
			{
				area = ~(area - 1); 
			}
			Hzk_Dis_Clr();
			Hzk_Dis_Data(2,1,area/10000,9);
			while(1);
			//flag_area = 0;
		}		
		if((flag_area == 0)||(flag_area == 1)||(flag_area == 2)||(flag_area == 3))
		{
			Hzk_Dis_Data(1,7,key_dis,2);
			Hzk_Dis_Data(2,7,flag_area,2);
		}
		/*
		if(usart_flag & BIT(SINK0_FINISH))
		{
			Get_GPRMC_data();	
			usart_flag &=~ BIT(SINK0_FINISH);			
		}
		*/
	}
}



void Get_Key(void)
{
		if( (KEY_PIN & BIT(KEY_START)) == 0)
		{
			Delay_Ms(20);
			while((KEY_PIN & BIT(KEY_START)) == 0)
				;
			key = 1;
		}
		if( (KEY_PIN & BIT(KEY_FINISH)) == 0)
		{
			Delay_Ms(20);
			while((KEY_PIN & BIT(KEY_FINISH)) == 0)
				;
			key = 2;
		}
}

void Get_GPRMC_data(void)//提取GPRMC数据
{
	unsigned char n=0,m=0,f=0;
	if((sink0_buf[1] == 'G')
	  &&(sink0_buf[2] == 'P')
	  &&(sink0_buf[3] == 'R')
	  &&(sink0_buf[4] == 'M')
	  &&(sink0_buf[5] == 'C'))//GPRMC
	{
		LED_PORT ^= BIT(LED);
		for(n=0;n<100;n++)
		{	
			if(sink0_buf[n] == ',')
			{
				m ++;//m表示低级个","
				if(m == 1)//第一个","后面为时间数据
				{
					//Hzk_Dis_Char(1,1,&sink0_buf[n+1],9);
				}
				if(m == 2)//第二个","后面为定位信息状态
				{
					gps_status = sink0_buf[n+1]; 
					//Hzk_Dis_Char(1,6,&gps_status,1);					
				}
				if(m == 3)//第三个","后面为纬度数据
				{
					if(gps_status == 'A')
					{
						//Hzk_Dis_Char(1,1,&sink0_buf[n+1],11);
						latitude = (unsigned long)(sink0_buf[n+1]-0x30)*10000000
						          +(unsigned long)(sink0_buf[n+2]-0x30)*1000000
						          +						          
						          ((unsigned long)(sink0_buf[n+3]-0x30)*1000000//minuter
						          +(unsigned long)(sink0_buf[n+4]-0x30)*100000
						          +(unsigned long)(sink0_buf[n+6]-0x30)*10000
						          +(unsigned long)(sink0_buf[n+7]-0x30)*1000
						          +(unsigned long)(sink0_buf[n+8]-0x30)*100
						          +(unsigned long)(sink0_buf[n+9]-0x30)*10
						          +(unsigned long)(sink0_buf[n+10]-0x30))*10/60;//换算成度						          
						//Hzk_Dis_Data(2,1,latitude,10);
					}
				}
				if(m == 4)
				{
					//"N"
				}
				if(m == 5)//第五个","后面为精度数据
				{
					if(gps_status == 'A')
					{
						
						longitude = //(unsigned long)(sink0_buf[n+1]-0x30)*100000000
						          +(unsigned long)(sink0_buf[n+2]-0x30)*10000000
						          +(unsigned long)(sink0_buf[n+3]-0x30)*1000000
						          +
						          ((unsigned long)(sink0_buf[n+4]-0x30)*1000000//minuter
						          +(unsigned long)(sink0_buf[n+5]-0x30)*100000
						          +(unsigned long)(sink0_buf[n+7]-0x30)*10000
						          +(unsigned long)(sink0_buf[n+8]-0x30)*1000
						          +(unsigned long)(sink0_buf[n+9]-0x30)*100
						          +(unsigned long)(sink0_buf[n+10]-0x30)*10
						          +(unsigned long)(sink0_buf[n+11]-0x30))*10/60;//换算成度*0.000001						          
						//Hzk_Dis_Data(1,1,longitude,10);
						
					}
				}
				if(m == 6)
				{
					//"E"
				}
				if(m == 9)//第九个","后面为精度数据
				{
					gps_date = (sink0_buf[n+1]-0x30)*10 
						       +(sink0_buf[n+2]-0x30);
					gps_month = (sink0_buf[n+3]-0x30)*10 
						       +(sink0_buf[n+4]-0x30);
				    gps_year = (sink0_buf[n+5]-0x30)*10 
						       +(sink0_buf[n+6]-0x30);
				}
			}
		}
		
	}
}

long Get_Area(long x1,long y1,long x2,long y2)
{
	long area_temp;
	area_temp = (x2-x1)*(y2+y1)/2;
	return area_temp;
}


⌨️ 快捷键说明

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