gpsrec.c

来自「GPS经纬度时间等数据提取.111 111」· C语言 代码 · 共 215 行

C
215
字号
//****************************2007.04.05
#include "msp430x14x.h"        // Standard Equations
#include "math.h"
//#define adcmem((int*)0x0140);          //
void Send_Bytetopc(unsigned char ),init(void),GPS_change(void);
unsigned int i,j,d,k;
unsigned char m,n;
unsigned  char GPGGA1[64];//GPGGA ALL

unsigned char recbuff[128]="国通GPS$GPGGA,062437.00,3957.9358,N,11621.9420,E,1,04,2.63,00100,M,-006,M,,*44.GPS国通";
                           

void main(void)
{ init();
  _EINT();
  while(1)
  {GPS_change();
   m=0;
  }
                       
} 
void GPS_change(void)
{
 for(i=0;i<128;i++)  ////GPGGA ALL
   {if((recbuff[i]=='G')&&(recbuff[i+1]=='P')&&(recbuff[i+2]=='G')&&(recbuff[i+3]=='G')&&(recbuff[i+4]=='A')) //search GPGGA
      { for(m=0;m<64;m++)
        { GPGGA1[m]=recbuff[i+m];//receive data to GPGGA1[m]
           if(recbuff[i+m]=='*') //find *
            {break;
            }
        }
       
      }
    }
    for(m=0;m<64;m++) //clear 
        { GPGGA1[m]=0;
           
        }
     m=0;i=0;
  for(i=0;i<128;i++)// GPGGA +time+N+E
   {if((recbuff[i]=='G')&&(recbuff[i+1]=='P')&&(recbuff[i+2]=='G')&&(recbuff[i+3]=='G')&&(recbuff[i+4]=='A')) //search GPGGA
      { for(m=0;m<128;m++)
        { GPGGA1[m]=recbuff[i+m];//receive data to GPGGA1[m]
           if(recbuff[i+m]=='E')//find E
            {break;
            }
        }
        
      }
    }
   m=0;i=0;   
}
// Timer B0 PN capture
interrupt[TIMERB0_VECTOR] void Timer_B (void)
{ ;                 
 }


void Send_Bytetopc(unsigned char SendByte)
 {//while ((IFG2 & UTXIFG1) == 0);        // USART1 TX buffer ready?
   //TXBUF1 = SendByte;
   //*****************************
     while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
       TXBUF0 = SendByte;                    //  to TXBUF0
           
  }
 //****************************MSP430 init
 void test_max(void)
 {   
            //while ((ADC12IFG & ADC12BUSY)==0);
         //     max =ADC12MEM0;//adcmem[j];
  
  }
void init(void)   //msp430  init
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT停止看门狗
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  P1DIR |= 0x0c;                        // Set P1.2\3 to output direction
                                       //P1.2=PTT
  //P1IE =0x40;                           // P1.6 inte_ enable
  P1IES = 0x00;                         //up edge int 
 // P1IES = 0x041;                         //p1.0\6 down edge int 
  P1OUT=0x00;
  //********************
  P2DIR |= 0xff;                        // Set P2 to output direction
  P2IE =0x00;                           // P2.0 int disable
  P2IES = 0x00;                         //up edge int 
 // P1IES = 0x01;                         //down edge int 
  P2OUT=0xfb;
  
 do 
  {
  IFG1 &= ~OFIFG;                       // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?                
  //*********************************port0 PC
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)
  UCTL0 = CHAR;                         // 8-bit character
  //UCTL0 |=PENA;                         //odd  
  UTCTL0 = SSEL0;                       // UCLK = ACLK
  //UBR00 = 0xc0;                         // 1.8432Mhz/9600 - 192
  // UBR00 = 0x60;                         // 1.8432Mhz/19200 - 96
  //UBR00 = 0x20;                         // 1.8432Mhz/57600 - 32
  UBR00 = 0x10;                         // 1.8432Mhz/115200 - 32
  //UBR00 = 0x74;                         // 3.58Mhz/9600 - 372
  UBR10 = 0x00;                         //
  UMCTL0 = 0x00;                        // no modulation
  ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
 // IE1 |= URXIE0;                        // Enable USART0 RX interrupt
  P3SEL |= 0x30;                        // P3.4,5 = USART0 TXD/RXD
  P3DIR |= 0x10;                        // P3.4 output direction
  //*************************************port1 GPS
 
  UCTL1 = CHAR;                         // 8-bit character
  UTCTL1 = SSEL0;                       // UCLK = ACLK
  //UCTL1 |=PENA;                         //odd 
  //UCTL1 &=~PEV;                          //奇校验。
  // UBR01 = 0x04;                         // 76.8khz/19200 - 04h
   UBR01 = 0xc0;                         // 1.8432Mhz/9600 - 192
  // UBR01 = 0x60;                         // 1.8432Mhz/19200 - 96
  //UBR01 = 0x20;                         // 1.8432Mhz/57600 - 32
  // UBR01 = 0x10;                         // 1.8432Mhz/115200 - 16
   //UBR01 = 0x80;                         // 7.3728Mhz/57600 - 128
   //UBR01 = 0x40;                         // 7.3728Mhz/115200 - 64
  UBR11 = 0x00;                         //
  UMCTL1 = 0x00;                        // no modulation
  ME2 |= UTXE1 + URXE1;                 // Enable USART0 TXD/RXD
  //IE2 |= URXIE1;                        // Enable USART1 RX interrupt
  P3SEL |= 0xc0;                        // P3.6,7 = USART1 TXD/RXD
  P3DIR |= 0x40;                        // P3.6 output direction
 
 // FCTL2 = FWKEY + FSSEL0 + FN0;      // 定义FLASH时序发生器输入时钟
 // P4DIR=0xff;        //out
 // P4OUT=0xff; //245 out
  P5DIR=0x40;//p5.6=out
  P5SEL |= 0x40; //ACLK out 
 // P5OUT=0xff;
 
 /////////////////////////////////////////////////////////P6 A/D
     P6SEL |= 0x01;                        // Enable A/D channel A0
  //  ADC12MCTL0 |=0x0a;                    //  sel channel A10 Sref=0 Temp 
    ADC12MCTL0 |=0x00;                    //  sel channel A0 Sref=0
     // P6SEL |= 0x02;                        // Enable A/D channel A1
    //ADC12MCTL0 |=0x01;                    //  sel channel A1
    // P6SEL |= 0x04;                        // Enable A/D channel A2
    //ADC12MCTL0 |=0x02;                    //  sel channel A2
  //  P6SEL |= 0x08;                        // Enable A/D channel A3
 //  ADC12MCTL0 |=0x03;                    //  sel channel A3
  //  ADC12CTL0 = ADC12ON+SHT0_2;           // Turn on ADC12, set sampling time
    ADC12CTL0 = ADC12ON;//+SHT0_0;//+SHT1_0; 
  // ADC12CTL0 |= ADC12DIV_0 ;              //1 fenpin
   ADC12CTL0 |= 0x0080;                   //MSC=1
    ADC12CTL1 = SHP;                      // Use sampling timer /ADC12OSC
    ADC12CTL1 |= 0x0008;                      // ADC12SSEL=1 Use sampling timer /ACLK
    ADC12CTL1 |= 0x0004;                      //conseq   continue ad
    //ADC12CTL0 |=0x020;//                     REFON=1
    ADC12CTL0 |= ENC;                     // Enable conversions
 /////////////////////////////////////////////timer A
 //WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  //TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR
  TACTL = TASSEL0 +TACLR;              // ACLK, clear TAR
  //CCTL0 = CCIE;                         // CCR0 interrupt enabled
  CCR0 = 250;//256
 // P1DIR |= 0x01;                        // P1.0 output
  //TACTL |= MC1;                         // Start Timer_A in continuous mode
 // TACTL |= MC0;                         // Start Timer_A in increase mode
 //_EINT();                              // Enable interrupts
 //////////////////////////////////////////////timer B
 TBCTL = TBSSEL0 + TBCLR;              // SMCLK, clear TAR
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled
  TBCCR0 = 250;
 // TBCTL |= MC0;                         // Start Timer_A in continuous mode
  
 
}
//////////////////////

//"$GPGGA,062437.00,3957.9358,N,11621.9420,E,1,04,2.63,00100,M,-006,M,,*44.
//$GPRMC,062437.00,A,3957.9358,N,11621.9420,E,000.0,000.0,050407,05.9,W,A*1C.
//$GPGGA,062438.00,3957.9358,N,11621.9420,E,1,04,2.63,00100,M,-006,M,,*4B.
//$GPRMC,062438.00,A,3957.9358,N,11621.9420,E,000.0,000.0,050407,05.9,W,A*13.
//$GPGGA,062439.00,3957.9358,N,11621.9420,E,1,04,2.63,00100,M,-006,M,,*4A.
//$GPRMC,062439.00,A,3957.9358,N,11621.9420,E,000.0,000.0,050407,05.9,W,A*12.
//$GPGGA,062440.00,3957.9359,N,11621.9420,E,1,04,2.63,0"

/*

GPS固定数据输出语句($GPGGA)   
这是一帧GPS定位的主要数据,也是使用最广的数据。为了便于理解,下面举例说明$GPGGA语句各部分的含义。例1是用GN-77N和笔者开发的软硬件接口,在笔者所在地接收到的$GPGGA语句的内容。
例1:$GPGGA,050901,3931.4449,N,11643.5123,E,1,07,1.4,76.2,M,-7.0,M,,*65   
其标准格式为:$GPGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)  
各部分所对应的含义为:   
(1)定位UTC时间:05时09分01秒  
(2)纬度(格式ddmm.mmmm:即dd度,mm.mmmm分);  
(3)N/S(北纬或南纬):北纬39度31.4449分;  
(4)经度(格式dddmm.mmmm:即ddd度,mm.mmmm分);  
(5)E/W(东经或西经):东经116度43.5123分;  
(6)质量因子(0=没有定位,1=实时GPS,2=差分GPS):1=实时GPS;  
(7)可使用的卫星数(0~8):可使用的卫星数=07;  
(8)水平精度因子(1.0~99.9);水平精度因子=1.4;  
(9)天线高程(海平面,-9999.9~99999.9,单位:m);天线高程=76.2m);   
(10)大地椭球面相对海平面的高度(-999.9~9999.9,单位:m):-7.0m;   
(11)差分GPS数据年龄,实时GPS时无:无;   
(12)差分基准站号(0000~1023),实时GPS时无:无;   
*总和校验域;  
hh 总和校验数:65   
(CR)(LF)回车,换行。  
*/

⌨️ 快捷键说明

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