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 + -
显示快捷键?