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

📄 main.c

📁 一个很不错的GPS接收机源程序
💻 C
字号:

#include "LCD_Library.h"
#include "nmea.h"
#include "mymath.h"


/**********************************************
*   Function: RS232_Init(void)
*   Input Variables: none
*   Return Variables: None
*   Usage: Init UART
**********************************************/
void RS232_Init()
{
	SCON = 	0x50;		// UART工作于模式1, REN=1 
	TMOD = 	0x20 ;		// Timer1 工业于模式2
	PCON |= 0x80;			// SMOD1 = 1 
	TH1	= 0xF3;			// 波特率9600 Bds at 24MHz 
	TL1	= 0xF3;			// 波特率9600 Bds at 24MHz 
	ES 	= 1; 				// 串口中断使能	
	TR1 = 1; 				// 启动Timer1 
}

#define BUFFER_LENGTH 2048
static unsigned char	pRead = 0;					// Buffer Writing Point
static unsigned char	pWrite = 0;					// Buffer Reading Point
volatile unsigned char	LoopFlag = 0;					// Buffer Reading Point
volatile unsigned char UpdateFlag = 0;
volatile unsigned char OverflowFlag = 0;
xdata char _Buffer[BUFFER_LENGTH];
/**********************************************
*   Function: ReadBuffera(void)
*   Input Variables: void
*   Return Variables: unsigned char
*   Usage: read a char from the Buffer
*********************************************/
unsigned char ReadBuffer()
{
		unsigned char Buffer_value;			// Buffer 值
		Buffer_value = _Buffer[pRead];	    		// 从缓存区读数
		pRead++;							// 指针向前移动
		if(pRead == BUFFER_LENGTH)		// 如果到缓存末尾
		{
  	 		pRead = 0;					// 循环指针
  	 		LoopFlag = 0;					// 清除LoopFlag
		}	
  	
		if((pRead == pWrite) && (!LoopFlag)) 	// 如果数据读取完毕
		{ 
			UpdateFlag = 0;                  // 清除更新标志                 
		}
		
		if(OverflowFlag) 					 // 如果数据缓存溢出
		{
			OverflowFlag = 0;				 // 清除数据溢出标志 
		}
		return Buffer_value;				 	// 返回读取值
}

/**********************************************
*   Function: serial_IT
*   Input Variables: void
*   Return Variables: void
*   Usage: UART Interrupt Service Routine
*********************************************/
void serial_IT(void) interrupt SIO_VECTOR 
{
	EA = 0;						 	// 关中断
	if (RI == 1) 
	{						 	 	// 接收中断
		RI = 0; 			 	 		// 清除中断标志 
		_Buffer[pWrite] = SBUF;	 		// 将数据写入缓存区
		UpdateFlag = 1;			 	// 置高数据更新标志
		pWrite++;
		if(pWrite == BUFFER_LENGTH)
		{
	  	 	pWrite = 0;			 	// 循环缓存区
	  	 	LoopFlag = 1;		 		// 置高Loop标志
		}
		if((pWrite >= pRead) && (LoopFlag == 1))
		{
			OverflowFlag = 1;    		// 数据溢出标志置高
		}
	}
	else
	{
		TI = 0;						// 清除发送中断标志
	}
	EA = 1;	 						// 开中断,准备下次接收		
}



/**********************************************
*   Function: void main(void)
*   Input Variables: void
*   Return Variables: void
*   Usage: 主函数
*********************************************/
void main(void)
{
    nmeaINFO info;								// 定义NMEAInfo结构体变量
    nmeaPARSER parser;						// 定义NMEAParser变量
    
    int size, it = 0;
nmeaPOS dpos;							// 定义dpos

    nmea_property()->trace_func = &LCD_PutStrSz;	// 定义调试跟踪函数
    nmea_property()->error_func = &LCD_PutStrSz;	// 定义错误显示函数	

    nmea_zero_INFO(&info);						// 初始化Info结构体
    nmea_parser_init(&parser);					// 初始化Parser	
		
		
		InitLCD();								// 初始化LCD
		ClearLCD();							//  LCD清屏
    		RS232_Init();							// 初始化UART
		EA = 1;								// 全局中断使能
		
    while(1)
{
	   LCD_Cursor2yx(1,0);						// 指定LCD显示坐标
    	   while(pWrite<200);						// 等待接收数据
	   size = pWrite - pRead; 					//  计算Buffer Size
        nmea_parse(&parser, &_Buffer [0], size, &info); 	//  对Buffer进行解析 
        nmea_info2pos(&info, &dpos);				// 获得定位信息
	   LCD_Putstr("欢迎使用GPS定位");			// 显示欢迎信息	
	   LCD_Cursor2yx(2,0);						// 指定LCD显示坐标
        LCD_mini_printf(
            "%03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n",
            it++, dpos.lat, dpos.lon, info.sig, info.fix
            );    								// 在LCD液晶屏上显示定位数据
        nmea_parser_destroy(&parser);
}
}

⌨️ 快捷键说明

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