Interfacing GPS with 8051
Here is the sample code to interface GPS with 8051.
#include<reg51.h> #define port2 P2 sbit rs = P1^0; sbit rw = P1^1; sbit e = P1^2; char info[70]; char test[6]={"$GPGGA"}; char comma_position[15]; unsigned int check=0,i; unsigned char a; void receive_data(); void lcd_latitude(); void lcd_longitude(); //DELAY FUNCTION void delay(unsigned int msec) { int i,j ; for(i=0;i<msec;i++) for(j=0;j<1275;j++); } // LCD COMMAND SENDING FUNCTION void lcd_cmd(unsigned char item) { port2 = item; rs= 0; rw=0; e=1; delay(1); e=0; return; } // LCD DATA SENDING FUNCTION void lcd_data(unsigned char item) { port2 = item; rs= 1; rw=0; e=1; delay(1); e=0; return; } // LCD STRING SENDING FUNCTION void lcd_string(unsigned char *str) { int i=0; while(str[i]!='\0') { lcd_data(str[i]); i++; delay(10); } return; } // SERIAL PORT SETTING void serial() { TMOD=0x20; //MODE=2 TH1=0xfa; // 4800 BAUD SCON=0x50 ; // SERIAL MODE 1 ,8- BIT DATA ,1 STOP BIT ,1 START BIT , RECEIVING ON TR1=1; //TIMER START } void find_comma() { unsigned int i,count=0; for(i=0;i<70;i++) { if(info[i]==',') { comma_position[count++]=i; } } } void compare() { IE=0x00; //Interrupt disable find_comma(); //Function to detect position of comma in the string lcd_latitude(); //Function to show Latitude lcd_longitude(); //Function to show Longitude check=0; IE=0x90; //Interrupt enable } void receive_data() interrupt 4 { info[check++]=SBUF; //Read SBUF if(check<7) //Condition to check the required data { if(info[check-1]!=test[check-1]) check=0; } RI=0; } void lcd_shape() //Function to create shape of degree { lcd_cmd(64); lcd_data(10); lcd_data(17); lcd_data(17); lcd_data(10); lcd_data(0); lcd_data(0); lcd_data(0); lcd_data(0); } void lcd_latitude() //Function to display Latitude { unsigned int c2=comma_position[1]; //Position of second comma lcd_shape(); lcd_cmd(0x01); // Clear LCD display lcd_cmd(0x84); //Move cursor to position 6 of line 1 lcd_string("LATITUDE"); //Showing Latitude lcd_cmd(0xC0); //Beginning of second line lcd_data(info[c2+1]); lcd_data(info[c2+2]); lcd_data(0); //Degree symbol lcd_data(info[c2+3]); lcd_data(info[c2+4]); lcd_data(info[c2+5]); lcd_data(info[c2+6]); lcd_data(info[c2+7]); lcd_data(info[c2+8]); lcd_data(info[c2+9]); lcd_data(0x27); //ASCII of minute sign(') lcd_data(info[c2+10]); lcd_data(info[c2+11]); delay(250); } void lcd_longitude() { unsigned int c4=comma_position[3]; lcd_cmd(0x01); //Clear LCD display lcd_cmd(0x84); //Move cursor to position 4 of line 1 lcd_string("LONGITUDE"); //Showing Longitude lcd_cmd(0xC0); //Begining of second line lcd_data(info[c4+1]); lcd_data(info[c4+2]); lcd_data(info[c4+3]); lcd_data(0); lcd_data(info[c4+4]); lcd_data(info[c4+5]); lcd_data(info[c4+6]); lcd_data(info[c4+7]); lcd_data(info[c4+8]); lcd_data(info[c4+9]); lcd_data(info[c4+10]); lcd_data(0x27); //ASCII of minute sign(') lcd_data(info[c4+11]); lcd_data(info[c4+12]); delay(250); } void main() { serial(); lcd_cmd(0x38); //2 LINE, 5X7 MATRIX lcd_cmd(0x0e); //DISPLAY ON, CURSOR BLINKING IE=0x90; while(1) { if(check==69) compare(); } }