1. 程式人生 > >51微控制器對GPS衛星訊號的解碼並通過LCD1602或12864顯示

51微控制器對GPS衛星訊號的解碼並通過LCD1602或12864顯示

主程式如下

#include "main.h"
#include "LCD1602.h"
#include "GPS.h"

//¶¨Òå±äÁ¿
unsigned char KEY_NUM = 0;
char temp,temp1,b,d;
bit Page = 0;
unsigned char xdata Display_GPGGA_Buffer[68];
unsigned char xdata Display_GPRMC_Buffer[68];
bit Flag_OV = 0;
bit Flag_Calc_GPGGA_OK = 0;
bit Flag_Calc_GPRMC_OK = 0;

//****************************************************
//Ö÷º¯Êý
//****************************************************
void main()
{
	unsigned char i = 0;
	Init_LCD1602();
	LCD1602_write_com(0x80);						//Ö¸ÕëÉèÖÃ
	LCD1602_write_word("Welcome to use!");

	Delay_ms(1000);


	Uart_Init();

	while(1)
	{
		Scan_Key();
		if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')			//È·¶¨ÊÇ·ñÊÕµ½"GPGGA"ÕâÒ»Ö¡Êý¾Ý
		{
			for( i = 0; i < 68 ; i++)
			{
				Display_GPGGA_Buffer[i] = RX_Buffer[i];	
			}
			Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8;//UTCʱ¼äת»»µ½±±¾©Ê±¼ä		UTC+8
																								//0x30ΪASCIIת»»ÎªÊý×Ö
			if( Hour >= 24)				//Òç³ö
			{
				Hour %= 24;				//»ñÈ¡µ±Ç°Hour
				Flag_OV = 1;			//ÈÕÆÚ½øλ
			}
			else
			{
				Flag_OV = 0;
			}

			Min_High = Display_GPGGA_Buffer[9];
			Min_Low = Display_GPGGA_Buffer[10];
	
			Sec_High = Display_GPGGA_Buffer[11];
			Sec_Low = Display_GPGGA_Buffer[12];

			Flag_Calc_GPGGA_OK = 1;
		}

		if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',')	//È·¶¨ÊÇ·ñÊÕµ½"GPRMC"ÕâÒ»Ö¡Êý¾Ý
		{
			for( i = 0; i < 68 ; i++)
			{
				Display_GPRMC_Buffer[i] = RX_Buffer[i];	
			}

			Year_High = Display_GPRMC_Buffer[57];
			Year_Low = Display_GPRMC_Buffer[58];

			Month_High = Display_GPRMC_Buffer[55];
			Month_Low = Display_GPRMC_Buffer[56];

			Day_High = Display_GPRMC_Buffer[53];
			Day_Low = Display_GPRMC_Buffer[54];


			if(Flag_OV == 1)			//Óнøλ
			{
				UTCDate2LocalDate();			//UTCÈÕÆÚת»»Îª±±¾©Ê±¼ä		
			}

			Flag_Calc_GPRMC_OK = 1;
		}

		if(Page == 0 && Flag_Calc_GPGGA_OK == 1)							//½ÓÊÕµ½GPGGAÊý¾Ý  °´¼üδ°´ÏÂ
		{
			/*LED1 = ~LED1;	*/
			Flag_Calc_GPGGA_OK = 0;
			LCD1602_write_com(0x80);			//ÉèÖÃÖ¸Õë
			LCD1602_write_data(Display_GPGGA_Buffer[28]);			//N »òÕßS ½«±äÁ¿¸³ÓèDisplay GPGGA BUFFER ²¢Ö±½Ó¶ÁÈ¡

			LCD1602_write_data(Display_GPGGA_Buffer[17]);			//γ¶È
			LCD1602_write_data(Display_GPGGA_Buffer[18]);			//γ¶È
			LCD1602_write_data(0xdf);								//¶È
			LCD1602_write_data(Display_GPGGA_Buffer[19]);			//γ¶È
			LCD1602_write_data(Display_GPGGA_Buffer[20]);

			LCD1602_write_data(Display_GPGGA_Buffer[21]);	 
			LCD1602_write_data(Display_GPGGA_Buffer[22]);
			LCD1602_write_data(Display_GPGGA_Buffer[23]);
			LCD1602_write_data(Display_GPGGA_Buffer[24]);
			LCD1602_write_data(Display_GPGGA_Buffer[25]);
			LCD1602_write_data(Display_GPGGA_Buffer[26]);
			LCD1602_write_word("'");			//·Ö
	
			LCD1602_write_com(0x80+0x40);			//ÉèÖÃÖ¸Õë			
			LCD1602_write_data(Display_GPGGA_Buffer[42]);			//E »òÕß W		  ͬÉÏ

			LCD1602_write_data(Display_GPGGA_Buffer[30]);			//¾­¶È
			LCD1602_write_data(Display_GPGGA_Buffer[31]);	
			LCD1602_write_data(Display_GPGGA_Buffer[32]);	
			LCD1602_write_data(0xdf);								
			LCD1602_write_data(Display_GPGGA_Buffer[33]);			
			LCD1602_write_data(Display_GPGGA_Buffer[34]);
			
			LCD1602_write_data(Display_GPGGA_Buffer[35]);	 //СÊýµã
			LCD1602_write_data(Display_GPGGA_Buffer[36]);
			LCD1602_write_data(Display_GPGGA_Buffer[37]);
			LCD1602_write_data(Display_GPGGA_Buffer[38]);
			LCD1602_write_data(Display_GPGGA_Buffer[39]);
			LCD1602_write_data(Display_GPGGA_Buffer[40]);  
			LCD1602_write_word("'");	 
			
			

						
		}
		


		if(Page == 1 && Flag_Calc_GPRMC_OK == 1)
		{
			/*LED1 = ~LED1;*/
			Flag_Calc_GPRMC_OK = 0;
			LCD1602_write_com(0x80);			//ÉèÖÃÖ¸Õë
			LCD1602_write_word("20");
			LCD1602_write_data(Year_High);
			LCD1602_write_data(Year_Low);
			LCD1602_write_data('-');
	
			LCD1602_write_data(Month_High);
			LCD1602_write_data(Month_Low);
			LCD1602_write_data('-');
	
			LCD1602_write_data(Day_High);
			LCD1602_write_data(Day_Low);
			
			
			LCD1602_write_com(0x80+0x40);			//ÉèÖÃÖ¸Õë
						LCD1602_write_data(Hour/10+0x30);
			LCD1602_write_data(Hour%10+0x30);

			LCD1602_write_data(':');

			LCD1602_write_data(Min_High);
			LCD1602_write_data(Min_Low);

			LCD1602_write_data(':');
	
			LCD1602_write_data(Sec_High);
			LCD1602_write_data(Sec_Low);

			LCD1602_write_word("  ");
			
			LCD1602_write_data(Display_GPGGA_Buffer[54]);	
			LCD1602_write_data(Display_GPGGA_Buffer[55]);	
			LCD1602_write_data(Display_GPGGA_Buffer[56]);	
			LCD1602_write_data(Display_GPGGA_Buffer[57]);
			LCD1602_write_word("m");
				
		}		
	}
}
//****************************************************
//UTCÈÕÆÚÓëµ±µØÈÕÆÚת»»
//****************************************************
void UTCDate2LocalDate(void)
{
	Day = (Day_High - 0x30) * 10 + (Day_Low-0x30) + 1;		//ÈÕ  ¼ÓÒ»
	Month = (Month_High - 0x30) * 10 + (Month_Low - 0x30);
	Year = 2000 + (Year_High - 0x30) * 10 + (Year_Low - 0x30);
	
	MaxDay = GetMaxDay(Month,Year);				//»ñÈ¡µ±Ô ÌìÊý ×î´óÖµ
	if(Day > MaxDay)		//Òç³ö
	{
		Day = 1;
		Month += 1;
		if(Month > 12)
		{
			Year+=1;
		}
	}

	Day_High = Day/10 + 0x30;				//ת»»ÈÕÆÚֵΪASCII
	Day_Low = Day%10 + 0x30;

	Month_High = Month/10 + 0x30;			//ת»»Ô·ÝֵΪASCII
	Month_Low = Month%10 + 0x30;

	Year_High = Year%100/10 + 0x30;			//ת»»Äê·ÝֵΪASCII
	Year_Low = Year%10 + 0x30;			
}

//****************************************************
//»ñÈ¡µ±ÔÂÈÕÆÚ×î´óÖµ
//****************************************************
unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value)
{
	unsigned char iDays;
	switch(Month_Value)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			{
				iDays = 31;
			}
			break;
		case 2:
			{
				//2Ô·ݱȽÏÌØÊ⣬ÐèÒª¸ù¾ÝÊDz»ÊÇÈòÄêÀ´Åжϵ±ÔÂÊÇ28Ì컹29Ìì
				iDays = IsLeapYear(Year_Value)?29:28;
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			{
				iDays = 30;
			}
			break;
		default : break;
	}
	return(iDays);						
}

//****************************************************
//ÈòÄê¼ì²â
//****************************************************
bit IsLeapYear(unsigned int uiYear)
{
	return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
}


//****************************************************
//°´¼üɨÃè³ÌÐò
//****************************************************
void Scan_Key()
{
	if( KEY4 == 0 )	 					//°´¼ü1ɨÃè
	{
		Delay_ms(10);					//ÑÓʱȥ¶¶
		if( KEY4 == 0 )
		{
			while(KEY4 == 0);			//µÈ´ýËÉÊÖ
			KEY_NUM = 3;
			Page = ~Page;
			LCD1602_write_com(0X01);	//ÇåÆÁ
		}
	}
}
//****************************************************
//MSÑÓʱº¯Êý(12M¾§ÕñϲâÊÔ)
//****************************************************
void Delay_ms(unsigned int n)
{
	unsigned int  i,j;
	for(i=0;i<n;i++)
		for(j=0;j<123;j++);
}
1602的程式如下
#include "LCD1602.h"

//****************************************************
//MSÑÓʱº¯Êý(12M¾§ÕñϲâÊÔ)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
	unsigned int  i,j;
	for(i=0;i<n;i++)
		for(j=0;j<123;j++);
}

//****************************************************
//дָÁî
//****************************************************
void LCD1602_write_com(unsigned char com) //ʹLCD1602ʹÄܵÈÖ¸Áî
{
	LCD1602_RS = 0;
	LCD1602_delay_ms(1);
	LCD1602_EN = 1;
	LCD1602_PORT = com;
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

//****************************************************
//дÊý¾Ý
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
	LCD1602_RS = 1;
	LCD1602_delay_ms(1);	
	LCD1602_PORT = dat;
	LCD1602_EN = 1;
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

//****************************************************
//Á¬Ðøд×Ö·û
//****************************************************
void LCD1602_write_word(unsigned char *s)
{
	while(*s>0)
	{
		LCD1602_write_data(*s);
		s++;
	}
}

void Init_LCD1602()		//δ½Óµ½GPSÖ¸ÁîÇ° LCD1602µÈ´ý״̬
{
	LCD1602_EN = 0;
	LCD1602_RW = 0;						//ÉèÖÃΪд״̬
	LCD1602_write_com(0x38);			//ÏÔʾģʽÉ趨
	LCD1602_write_com(0x0c);			//¿ª¹ØÏÔʾ¡¢¹â±êÓÐÎÞÉèÖᢹâ±êÉÁ˸ÉèÖÃ
	LCD1602_write_com(0x06);			//дһ¸ö×Ö·ûºóÖ¸Õë¼ÓÒ»
	LCD1602_write_com(0x01);			//ÇåÆÁÖ¸Áî
}


GPS程式如下
#include "GPS.h"

unsigned char RX_Buffer[68];
unsigned char RX_Count = 0;
unsigned char Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0;
unsigned char Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0;
unsigned int Year = 0;
bit Flag_GPS_OK = 0;
unsigned char MaxDay = 0;

void Uart_Init()					  			   
{
	SCON = 0X50;  //UART·½Ê½1£»8λUART
	REN  = 1;     //ÔÊÐí´®ÐпڽÓÊÕÊý¾Ý
	PCON = 0x00;  //SMOD=0;²¨ÌØÂʲ»¼Ó±¶
	TMOD = 0x20;  //T1·½Ê½2£¬ÓÃÓÚ²úÉú²¨ÌØÂÊ
	TH1  = 0xFD;  //×°³õÖµ
	TL1  = 0xFD;
	TR1  = 1;     //Æô¶¯¶¨Ê±Æ÷1
	EA   = 1;     //´ò¿ªÈ«¾ÖÖжϿØÖÆ
	ES   = 1;     //´ò¿ª´®ÐпÚÖжÏ	
}


void RECEIVE_DATA(void) interrupt 4 using 3	  //ÖжÏ4ʹÓÃ3ºÅ¼Ä´æ´¦		
{ 
	unsigned char temp = 0;
	ES=0;
	temp = SBUF;
	RI = 0;
//	LED1 = ~LED1;
	
	if(temp == '$')
	{
		RX_Count = 0;
		Flag_GPS_OK = 0;		
	}

	RX_Buffer[RX_Count++] = temp;

	if(RX_Count >= 59)
	{
		RX_Count = 59;
		Flag_GPS_OK = 1;		
	}

	ES=1; 
}
三個.h檔案
#ifndef __LCD1602_H__
#define __LCD1602_H__


#include <reg52.h>

//LCD1602 IOÉèÖÃ
#define LCD1602_PORT P0
sbit LCD1602_RS = P2^7;
sbit LCD1602_RW = P2^6;
sbit LCD1602_EN = P2^5;

//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void LCD1602_delay_ms(unsigned int n);
extern void LCD1602_write_com(unsigned char com);
extern void LCD1602_write_data(unsigned char dat);
extern void LCD1602_write_word(unsigned char *s);
extern void Init_LCD1602();

#endif

#ifndef __GPS_H__
#define __GPS_H__

#include <reg52.h>
#include "main.h"



//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void Uart_Init();



extern unsigned char RX_Buffer[68];
extern unsigned char RX_Count;
extern unsigned char Hour,Min_High,Min_Low,Sec_High,Sec_Low;
extern unsigned char Month,Day,Month_High, Month_Low,Day_Low ,Day_High, Year_High,Year_Low;
extern unsigned int Year;
extern unsigned char MaxDay;

extern bit Flag_GPS_OK;



#endif
#ifndef __MAIN_H__
#define __MAIN_H__

#include <reg52.h>


sbit KEY4 = P1^0;


//º¯Êý»òÕß±äÁ¿ÉùÃ÷
extern void Delay_ms(unsigned int n);
extern void Scan_Key();
extern void UTCDate2LocalDate(void);
extern bit IsLeapYear(unsigned int uiYear);	
extern unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value);




#endif