DSP

基于DSP的GPGGA定位数据提取的代码

2019-07-13 16:04发布

基于DSPGPGGA定位数据提取的代码已经通过了测试。 由于分了好多模块,但在网上下载就有其他的模块,在此我贴出来已经改好的GPGGA的main函数代码, 其他的代码不变,可以在网上下载,百度里搜  基于DSP的GPGGA定位数据提取 就能找到,main函数换以下代码就能得到你想要的功能。 该代码的功能能使液晶移动并且翻页。 main函数代码: #include  #include "mmdrv.h" //CPU Memory-Mapped Registers    #include "mcbsp.h"  //串口模块de头文件  #include "cpu_reg.h"     #include "lcd_86.h"  //液晶显示模块de头文件  #define uint16 unsigned int #define uint8 unsigned char    ioport unsigned portefff; #define  IO_374  portefff #define shuzunum 600 //定义数据缓冲区   void init_exint1_interrupt(); void init_GPIO(void);  void uart_rece_gpgga_0(void);   //提取haiba,tm,weidu,jingdu;   void uart_rece_gpgga_1(void); void uart_trans(void);    void uart_trans_byte(unsigned int data); unsigned int flag=0xffff; volatile unsigned int displayflag=0; char tx_re_buf[1]={0x38}; void display() {    LCD_clear(0); cur_row=0;         cur_col=50;             LCD_pr_chars("GPGGA",5); cur_row=1;         cur_col=0;             LCD_pr_chars("=====================",21); cur_row=3;         cur_col=0;      LCD_pr_chars("K1:H,Tm,WD,JD",13); cur_row=5;         cur_col=0;      LCD_pr_chars("K2:State,Num,HODP",17); cur_row=7;         cur_col=0;             LCD_pr_chars("=====================",21);   } uint16 keyscan() { unsigned int key_val; unsigned int i,j; i=Get_Key();         waitloop( 0x040000L ); j=Get_Key();         if(i==j)         {   key_val=j; /*保存 key_val*/   while(Get_Key())    {   asm(" nop"); //wait blank_key    }   } return key_val; } void main(void) {   SWWSR = 0x7fff;     SWCR = 0x0001;     BSCR = 0x8006;        CLKMD = PLL_DIV_INIT;     waitloop( 0x0400 );     CLKMD = PLL_LOCK_INIT_X(14);     waitloop( 0x0400 );         PMST = 0x0168; IO_374=0xffff; //374 enable   init_exint1_interrupt();     init_GPIO();        init_lcd(); display();  //显示菜单     Close_LED_sign();     Close_LED_Data();      Close_LED_Traf();     waitloop( 0x0400 );           while(1) { flag=0xffff;           /*防抖动*/           switch(keyscan())         {            default:           break;            case 1:             displayflag=1;     LCD_clear(0); //清屏                            break;    case 2:     displayflag=2;     LCD_clear(0);   break;    case 17:     displayflag=3;     display(); break;               }               switch(displayflag)         {            default:           break;            case 1:             uart_rece_gpgga_0();//第一页显示海拔高度,时间,纬度,经度                break;    case 2:     uart_rece_gpgga_1(); //第二页显示水平精度因子,卫星个数     break;    case 3:     display(); //返回到主菜单     break;               }               //LCD_clear(0);                                                    }       }     void init_exint1_interrupt()   //中断 { IFR =0xffff;   IMR =0x0002; //TINT=IMR.3 EXINT1=IMR.1 asm(" rsbx intm "); }       interrupt void EXINT1_isr()    {     Close_LED_sign();     Close_LED_Data();      Close_LED_Traf(); //    while(!(GPIOSR&0x01))  { asm(" nop");   //中断处理函数 asm(" nop");  } flag=0;             cur_row=7;         cur_col=15;             LCD_pr_chars("    Uart_Stop   ",17);    }     void init_GPIO(void)    { GPIOCR =0xfffe;   //EXINT1=GPIO.0=input=0,nand_cs=GPIO.6=output=1   GPIOSR =0x0040;   //GPIO.6=output=1 }  void uart_rece_gpgga_0(void)   //提取haiba,tm,weidu,jingdu {      unsigned int ii; unsigned int jj; unsigned char data[shuzunum];//缓冲区中存储600个数据 unsigned int tm[7],weidu[10],jingdu[11],hb[8],E[2],N[2]; unsigned int locate=0; unsigned int ji_dou=0;//逗号计数变量 unsigned int data_num=0;//数组计数变量 char chartable[10]={'0','1','2','3','4','5','6','7','8','9'}; Uart_Init();    for(ii=0;ii清空数据缓冲区     {      data[ii] =0;     }  while(1) { do { jj = Uart_rx();         if(!flag)       { asm(" nop");           break;       } }while(jj==0xFFFF);    //Uart_tx(jj); //发送接收到的数据               if(locate每当接收到一个数据时立马把他存下来 { data[locate] =jj; //数组是从data[0]开始存储 locate++;//接收完一个数据立马将数组位置进一位 } else { ii=0; //while(ii总的数据长度不超过600 while(1)         {             if(data[ii]==36)//$             {                if((ii+1)也就是满足上面六个符号则退出这个whlile大循环             }             ii++;         }         //退出后接着就是将一串的数据解析出我们要的                  ii+=6;         for(;ii如果逗号个数为1则为时间            {             tm[data_num]=data[ii];             data_num++;            }            else if(ji_dou==2)//如果逗号个数为2则为北纬度数            {             weidu[data_num]=data[ii];             data_num++;            }            else if(ji_dou==3)            {             N[data_num]=data[ii];             data_num++;            }            else if(ji_dou==4)            {             jingdu[data_num]=data[ii];             data_num++;            }            else if(ji_dou==5)            {             E[data_num]=data[ii];             data_num++;            }            else if(ji_dou==9)            {             hb[data_num]=data[ii];             data_num++;            }            if(data[ii]==44)//判断是否为逗号            {             ji_dou++;//遇到逗号则逗号计数的加1             data_num=0;//也就是在遇到逗号来之前我们要把数据存下来st++            }         } //数据截取下来后就要进行相应的显示了 //LCD_clear(0);//先清上次的显示 cur_col=50; cur_row=0; LCD_pr_chars("GPGGA",5); cur_col=0; cur_row=1; LCD_pr_chars("***********************",23); cur_col = 1;         cur_row = 2;           LCD_pr_chars("haiba:",6);             for(ii=0;ii<4;ii++)              {                 if(hb[ii]==46)                  LCD_nextchar('.');                 else                     LCD_nextchar(chartable[hb[ii]-48]);             }                                        cur_col = 1;             cur_row =3;              LCD_pr_chars("Time:",5);             LCD_nextchar(chartable[tm[0]-48]);             LCD_nextchar(chartable[tm[1]-48]);             LCD_nextchar(':');             LCD_nextchar(chartable[tm[2]-48]);             LCD_nextchar(chartable[tm[3]-48]);             LCD_nextchar(':');             LCD_nextchar(chartable[tm[4]-48]);             LCD_nextchar(chartable[tm[5]-48]);                          cur_col = 1;             cur_row = 4;              LCD_pr_chars("Latitude:",9);                                       for(ii=0;ii<9;ii++)              {                 if(weidu[ii]==46)LCD_nextchar('.');                 else   LCD_nextchar(chartable[weidu[ii]-48]);             }             if(N[0]==78)LCD_nextchar('N');             else LCD_nextchar('S');                          cur_col = 1;             cur_row = 5;              LCD_pr_chars("Longitude:",10);                                        for(ii=0;ii<9;ii++)              {                 if(jingdu[ii]==46)LCD_nextchar('.');                 else   LCD_nextchar(chartable[jingdu[ii]-48]);             }               if(E[0]==69)LCD_nextchar('E');             else LCD_nextchar('W'); cur_row=6;    cur_col=0;  LCD_pr_chars("Press  to Exit",19);  cur_col=0; cur_row=7; LCD_pr_chars("***********************",23);         break; }     }      return; } void uart_rece_gpgga_1(void)   //串口提取  {      unsigned int ii; unsigned int jj; unsigned char data[shuzunum];//缓冲区中存储600个数据 unsigned int state_gps[2],satellite_num[2],HDOP[4]; unsigned int locate=0; unsigned int ji_dou=0;//逗号计数变量 unsigned int data_num=0;//数组计数变量 char chartable[10]={'0','1','2','3','4','5','6','7','8','9'}; Uart_Init();    for(ii=0;ii清空数据缓冲区     {      data[ii] =0;     }  while(1) { do { jj = Uart_rx();         if(!flag)       { asm(" nop");           break;       } }while(jj==0xFFFF);    //Uart_tx(jj); //发送接收到的数据               if(locate每当接收到一个数据时立马把他存下来 { data[locate] =jj; //数组是从data[0]开始存储 locate++;//接收完一个数据立马将数组位置进一位 } else { ii=0; //while(ii总的数据长度不超过600 while(1)         {             if(data[ii]==36)//$             {                if((ii+1)也就是满足上面六个符号则退出这个whlile大循环             }             ii++;         }         //退出后接着就是将一串的数据解析出我们要的                  ii+=6;         for(;ii如果逗号个数为1则为时间            {             state_gps[data_num]=data[ii];             data_num++;            }            else if(ji_dou==7)//如果逗号个数为2则为北纬度数            {             satellite_num[data_num]=data[ii];             data_num++;            }            else if(ji_dou==8)            {             HDOP[data_num]=data[ii];             data_num++;            }            if(data[ii]==44)//判断是否为逗号            {             ji_dou++;//遇到逗号则逗号计数的加1             data_num=0;//也就是在遇到逗号来之前我们要把数据存下来st++            }         } //数据截取下来后就要进行相应的显示了 //LCD_clear(0);//先清上次的显示 cur_col=50; cur_row=0; LCD_pr_chars("GPGGA",5); cur_col=0; cur_row=1; LCD_pr_chars("***********************",23);  //*********************************************************************                      //GPS定位状态             cur_col = 1;             cur_row = 2;              LCD_pr_chars("state_gps:",10); cur_col = 1;             cur_row = 3;  if (state_gps[0]=='0') LCD_pr_chars("Unlocated",9); else if(state_gps[0]=='1')              LCD_pr_chars("non-differential gps",20); else if(state_gps[0]=='2') LCD_pr_chars("differential gps",16); else if(state_gps[0]=='6') LCD_pr_chars("estimated",9); else {}; //*********************************************************************** //正在使用的卫星数量             cur_col = 1;             cur_row = 4;              LCD_pr_chars("satellite_num:",14);                                           if(satellite_num[1]!=0) { LCD_nextchar(chartable[satellite_num[0]-48]); LCD_nextchar(chartable[satellite_num[1]-48]);                 }                 else    LCD_nextchar(chartable[satellite_num[0]-48]); //*********************************************************************** //HDOP水平精度因子             cur_col = 1;             cur_row = 5;              LCD_pr_chars("HDOP:",5);                                        for(ii=0;ii<4;ii++)              {                 if(HDOP[ii]==46)LCD_nextchar('.');                 else   LCD_nextchar(chartable[HDOP[ii]-48]);             }   cur_row=6;    cur_col=0;  LCD_pr_chars("Press  to Exit",19);  cur_col=0; cur_row=7; LCD_pr_chars("***********************",23);         break; }     }      return; }