⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 DSP开发的一个例子
💻 C
字号:
#include  <msp430x14x.h>
#include <stdlib.h>
#include <in430.h>

void init_usart0(void);
void init_usart1(void);
void save(void);
void store(char *source,char *dest);
void flash_clr(char *Data_ptr);
void replace(char *c,char *d); 
void seg_flash(char *source_ptr,char *des_ptr);

char id[3]={'1','0','0'};
char flag=0;
char j=0;
char valid=0;       //是否为每隔5分钟的有效数据?
char send=0;         //是否有要向gprs设备发送的数据?
char gps_init=0;
char data[52];
char new_data[55]={'$',','};
char speed[5];
char buffer[512];
char position[22];
float speed1,speed2;
int speed3;
char data_in_flash=0;
char *flash_init;
char *flash_ptr;
char *seg_ptr;
char inf_number=0;
char frame_from_gps[7]={'$','G','P','R','M','C',','};
char data1[6];
char change=1;
unsigned long time_now=0;
unsigned long time_past=0;

void init_usart0(void)
{
 UCTL0&=~SWRST;
 UCTL0=0x10;
 UTCTL0=SSEL0;          //选择Aclk为时钟
 UBR00=0x03;        //选择波特率9600,所以分频因子104.166。。。
 UBR10=0x00;
 UMCTL0=0x4a;
 ME1=UTXE0+URXE0;    //允许发送和接收
 P3SEL=BIT4+BIT5;
 P3DIR|=BIT4;
 P3DIR&=~BIT5; 
 IE1|=URXIE0;         //允许接收中断     
}

void init_usart1(void)
{
 UCTL1&=~SWRST;
 UCTL1=0x10;
 UTCTL1=SSEL0;          //选择Aclk为时钟
 UBR01=0x03;        //选择波特率9600,所以分频因子104.166。。。
 UBR11=0x00;
 UMCTL1=0x4a;
 ME1=UTXE1+URXE1;    //允许发送和接收
 P3SEL|=BIT6+BIT7;
 P3DIR|=BIT7;
 P3DIR&=~BIT6; 
}

interrupt[UART0RX_VECTOR] void UART0RX(void)   //flag=7表示接收到帧头
{
char i;
switch(flag)
{case 0x00:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x01:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x02:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x03:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x04:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x05:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x06:
  {if(RXBUF0==frame_from_gps[flag])
   flag++;
   break;
   }
 case 0x07:
 {
  data[j]=RXBUF0;
  j++;
  if(j==52)   //每秒的GPS有效数据接收完毕
   {
    j=0;
    flag=0;
    for(i=0;i<6;i++)
    data1[i]=data[i]-0x30;           //存放时间量
    if(gps_init==0)           //是第一次的数据,保存
     {
      time_past=(((unsigned int)data1[0]*10+(unsigned int)data1[1])*3600+((unsigned int)data1[2]*10+(unsigned int)data1[3])*60+((unsigned int)data1[4]*10+(unsigned int)data1[5]));    //单位秒
      for(i=0;i<22;i++)             //存放初次的位置信息
      position[i]=data[i+9];
      gps_init=1;
      valid=1;
     }   
    if(gps_init==1)
      {
      time_now=(((unsigned int)data1[0]*10+(unsigned int)data1[1])*3600+((unsigned int)data1[2]*10+(unsigned int)data1[3])*60+((unsigned int)data1[4]*10+(unsigned int)data1[5]));    //单位秒
       if(time_now-time_past==300)           //判断是否到了每隔5分钟
        {
         time_past=time_now;
         for(i=0;i<22;i++)     //判断位置有无变化
         {
          if(data[i+9]!=position[i])     //有变化,置标志位
          {           
           change=1;
           break;
           }
          else        
           change=0;
         }
         for(i=0;i<22;i++) 
         position[i]=data[i+9];     //更新position数据
         valid=1;       
        }
      }
  while(valid==1)  //无效数据,等待
       //有效数据,重组
      //id
      {for(i=0;i<3;i++)          
       new_data[i+2]=id[i];
       new_data[5]=',';
       //a/v
       new_data[6]=data[7];
       new_data[7]=',';
     //日期yy
      for(i=0;i<2;i++)          
      new_data[i+8]=data[i+50];
      //mm
      for(i=0;i<2;i++)
      new_data[i+10]=data[i+48];
      //dd
      for(i=0;i<2;i++)
      new_data[i+12]=data[i+46];
     //时间
     for(i=0;i<6;i++)           
     new_data[i+14]=data[i];
     new_data[20]=',';
    //纬度
    for(i=0;i<2;i++)
    new_data[i+21]=data[i+9];
    new_data[23]='.';
    for(i=0;i<2;i++)
    new_data[i+24]=data[i+11];
    for(i=0;i<2;i++)
    new_data[i+26]=data[i+14];
    for(i=0;i<9;i++)
    new_data[28]=',';
    //n/s
    new_data[29]=data[19];
    new_data[30]=',';
    //经度
    for(i=0;i<3;i++)
    new_data[i+31]=data[i+21];
    new_data[34]='.';
    for(i=0;i<2;i++)
    new_data[i+35]=data[i+24];
    for(i=0;i<2;i++)
    new_data[i+37]=data[i+27];
    new_data[39]=',';
    //速率
    for(i=0;i<3;i++)
    data[i+34]=data[i+34]-0x30;
    data[38]=data[38]-0x30;
    speed1=((float)data[34]*100+(float)data[35]*10+(float)data[36]+(float)data[38]*0.1);   //speed1为十进制单位为节的速率值
    speed2=speed1/1.852;    //speed2为十进制单位为公里的速率值
    speed3=(int)speed2;
    speed[0]=(char)(speed3/100);
    speed[1]=(char)((speed3-speed[0]*100)/10);
    speed[2]=(char)(speed3-speed[0]*100-speed[1]*10);
    speed[3]='.'-0x30;
    speed[4]=(char)((int)((speed2-speed3)/0.1));
    for(i=0;i<5;i++)
    new_data[i+40]=speed[i]+0x30;
    new_data[45]=',';
    //航向
    for(i=0;i<5;i++)
    new_data[i+46]=data[i+40];
    new_data[51]=',';
    new_data[52]='*';
    new_data[53]=0x0d;               //CR
    new_data[54]=0x0a;               //LF
    send=1;
    valid=0;     //重新开始下一次数据 
    }           //while
    }        //j=52
  }        //case07
 }         //switch          
}

void save(void)
 {          
  flash_init=(char *)0x3000; 
  flash_ptr=flash_init+inf_number*64;    //flash_ptr为待写入数据的地址,存完数据后的地址为flash_ptr+64
  seg_ptr=flash_init+(inf_number/8)*512;       //计算段首址
  store(seg_ptr,buffer); 
  flash_clr(seg_ptr);  
  replace(buffer,new_data);                 //至此,buffer中的内容为包含新用户的整段
  seg_flash(buffer,seg_ptr);
  inf_number++;
  data_in_flash=1;
  _EINT();
  }

void store(char *source,char *dest)         //保存要修改的整段
{int i;
 for(i=0;i<512;i++)
  *dest++=*source++;
}

void flash_clr(char *Data_ptr)
{
  FCTL1 = 0x0A502;          /* ERASE = 1 */
  FCTL3 = 0x0A500;          /* Lock = 0 */
  *Data_ptr=0;              /* erase Flash segment */
}

void replace(char *c,char *d)     //c为buffer,d为new_data  
{
 int i; 
 char *ptr;
 ptr=c+64*(inf_number%4);   
 for(i=0;i<64;i++)
   {*ptr=(*d);
    ptr++;
    d++; 
   }
}

void seg_flash(char *source_ptr,char *des_ptr)
{ 
  int i;
  IFG1=0;                           //清除中断
  _DINT();
  FCTL3=0x0a500;
  FCTL1=0x0a540;  
  for(i=0;i<512;i++)                   //写
   *des_ptr++=*source_ptr++;
}

void main (void)
{
 int i;
 char *n;
 n=flash_init;
 WDTCTL=WDTPW+WDTHOLD;             // 关闭WDT
 BCSCTL2=0xbe;     //选择XT2CLK8分频作为SMCLk和MCLK*/ 
 P1OUT=BIT0+BIT3;    //置为无效状态
 P1DIR=BIT0+BIT3;           //BIT0-DTR;BIT1-DSR;BIT2-CTS;BIT3-RTS;BIT4-DCD
 P1SEL=0x00;
 init_usart0();
 //init_usart1();
 _EINT();
 while(1)   //死循环
 {while(send==0);      //查看有无待发送数据
  if(P1IN&0x10==0)        //有数据,检测gprs状态,dcd有效
   {P1OUT&=~BIT3;          //RTS有效
    if(P1IN&0x04==0)   //检测CTS,有效
   {
    switch(data_in_flash)    //检测flash中是否有数据
       {
        case 1:               //有则首先发送flash中数据
          {
           for(i=0;i<inf_number*64;i++)       
           {
            TXBUF0=*flash_init++;
            while((UTCTL0&0x01)==0);
            }
            for(n=flash_init;n<flash_ptr+64;n=n+512)
             flash_clr(n);    //清空flash中的数据            
             data_in_flash=0;    //清除标志位
             break;
          }
        case 0:
          {for(i=0;i<53;i++)        //没有则发送现在的数据
           {
            TXBUF0=new_data[i];
            while((UTCTL0&0x01)==0);
           }
          }  //case 0
        }   //switch
       }     
  else         //CTS无效
     if(change==1)
     {save();
      send=0;   //清除有数据发送标志
     }  
  }
 else    //DCD无效
    if(change==1)
    {save();
     send=0;   //清除有数据发送标志位
     }
}       //死循环
}

⌨️ 快捷键说明

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