W77E58单片在GPS解码程序

/*用W77E58单片机,对GPS进行解码。注:GPS的解码算法来源于网络,忘记了从那抄的了。呵呵

现在改进后是:

   串口0:接PC,波特率

   串口1:接GPS,波特率

代码如下,留作纪念,也算纪念奋斗了夜!

用W77E58单片机,对GPS进行解码。注:GPS的解码算法来源于网络,忘记了从那抄的了。呵呵

现在改进后是:

   串口0:接PC,波特率

   串口1:接GPS,波特率

代码如下,留作纪念,也算纪念奋斗了夜! */ /* 说明:Winbond 单片机W77E58 双串口测试程序 时间:年月日 程序:张建波 串口采用波特率 串口采用波特率 */ #include" w77e58.h" static int flag_1,flag_0; char c1[]="hello china";  //串口 char c2[]="hello World";  //串口 //串口9600   8 N 1 //串口4800   8 N 1 //GPS ---- //GPS数据存储数组 unsigned char JD[10];            //经度 unsigned char JD_a;            //经度方向 unsigned char WD[9];            //纬度 unsigned char WD_a;            //纬度方向 unsigned char time[6];        //时间 unsigned char speed[5];        //速度 unsigned char high[6];        //高度 unsigned char angle[5];        //方位角 unsigned char use_sat[2];        //使用的卫星数 unsigned char total_sat[2];    //天空中总卫星数 unsigned char lock;            //定位状态

//串口中断需要的变量 unsigned char seg_count;        //逗号计数器 unsigned char dot_count;        //小数点计数器 unsigned char byte_count;        //位数计数器 unsigned char cmd_number;        //命令类型 unsigned char mode;                //0:结束模式,:命令模式,:数据模式 unsigned char buf_full;            //1:整句接收完成,相应数据有效。:缓存数据无效。 unsigned char cmd[5];            //命令类型存储数组

//------ //状态指示灯 sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P0_5=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; //----------------- main() { int i; flag_1=1; flag_0=1;

     P0_0=1; P0_1=1; P0_2=1; P0_3=1; P0_4=1; P0_5=1; P0_6=1; P0_7=1;

     //system init ,其中串口用定时器,串口用定时器 //串口的设置 IE=0x90;      //允许总中断和串口的中断 TMOD=0x20;      //定时器工作在模式 TL1=0xfa;      //baud rate=4800 TH1=0xfa; SCON=0x58;      //工作在模式,接收允许 PCON=0x00; // SM0=0 SM1=1 在位异步收发模式SMOD=0 溢出速率/32 ES1=1;    //串口中断允许    //串口设置 T2CON=0x30;  //用定时器做串口的波特率发生器 RCAP2H=0xff;   // 11.0592M晶振下,baud rate=9600  //2400 RCAP2L=0xdc;   //0x70; SCON1=0x58;   //工作在模式,允许接收 TR2=1; TR1=1;

     while(1) { if(flag_0) {TI=1;flag_0=0;} for(i=0;i<1000;i++); //if(flag_1) {TI_1=1;flag_1=0;} //   for(i=0;i<1000;i++); if(buf_full==0)                //无GPS信号时 { P0_0=1;  //1表示没有信号 }else { P0_0=0; //有信号 if(buf_full|0x01) { //GGA语句 if(lock=='0') { //如果未定位 P0_0=1; }else { //如果已定位 P0_0=0; } } } } }

void serial_0(void)interrupt 4 { int i; if(RI) { flag_0=1; RI=0;    } if(TI) { TI=0; SBUF=JD_a;  //经度方向 while(TI==0) ; TI=0;  for(i=0;i<10;i++){//经度 TI=0; SBUF=JD[i]; while(TI==0) ; TI=0;                           } TI=0; SBUF=WD_a; //纬度方向 while(TI==0) ; TI=0; for(i=0;i<6;i++){ //纬度 TI=0; SBUF=WD[i]; while(TI==0) ; TI=0;  }  TI=0; SBUF='D'; while(TI==0) ; TI=0;

            TI=0; SBUF=use_sat[0]; while(TI==0) ; TI=0; 

             TI=0; SBUF=use_sat[1]; while(TI==0) ; TI=0; 

            TI=0; SBUF='/r'; while(TI==0) ; TI=0;

            TI=0; SBUF='/n'; while(TI==0) ; TI=0;

    } }            

void serial_1(void)interrupt 7 {    unsigned char tmp; if(RI_1) { P0_7=~P0_7; tmp=SBUF1; switch(tmp) { case '$': cmd_number=0;        //命令类型清空 mode=1;                //接收命令模式 byte_count=0;        //接收位数清空 break; case ',': seg_count++;        //逗号计数加 byte_count=0; break; case '*': switch(cmd_number) { case 1: buf_full|=0x01; break; case 2: buf_full|=0x02; break; case 3: buf_full|=0x04; break; } mode=0; break; default: if(mode==1) { //命令种类判断 cmd[byte_count]=tmp;            //接收字符放入类型缓存 if(byte_count>=4) {                //如果类型数据接收完毕,判断类型 if(cmd[0]=='G') { if(cmd[1]=='P') { if(cmd[2]=='G') { if(cmd[3]=='G') { if(cmd[4]=='A') { cmd_number=1; mode=2; seg_count=0; byte_count=0; } } else if(cmd[3]=='S') { if(cmd[4]=='V') { cmd_number=2; mode=2; seg_count=0; byte_count=0; } } } else if(cmd[2]=='R') { if(cmd[3]=='M') { if(cmd[4]=='C') { cmd_number=3; mode=2; seg_count=0; byte_count=0; } } } } } } } else if(mode==2) { //接收数据处理 switch (cmd_number) { case 1:                //类型数据接收。GPGGA switch(seg_count) { case 2:                                //纬度处理 if(byte_count<9) { WD[byte_count]=tmp; } break; case 3:                                //纬度方向处理 if(byte_count<1) { WD_a=tmp; } break; case 4:                                //经度处理 if(byte_count<10) { JD[byte_count]=tmp; } break; case 5:                                //经度方向处理 if(byte_count<1) { JD_a=tmp; } break; case 6:                                //定位判断 if(byte_count<1) { lock=tmp; } break; case 7:                                //定位使用的卫星数 if(byte_count<2) { use_sat[byte_count]=tmp; } break; case 9:                                //高度处理 if(byte_count<6) { high[byte_count]=tmp; } break; } break; case 2:                //类型数据接收。GPGSV switch(seg_count) { case 3:                                //天空中的卫星总数 if(byte_count<2) { total_sat[byte_count]=tmp; } break; } break; case 3:                //类型数据接收。GPRMC switch(seg_count) { case 1: if(byte_count<6) {                //时间处理 time[byte_count]=tmp;    } break; case 7:                                //速度处理 if(byte_count<5) { speed[byte_count]=tmp; } break; case 8:                                //方位角处理 if(byte_count<5) { angle[byte_count]=tmp; } break; } break; } } byte_count++;        //接收数位加 break; } } RI_1=0; }

posted @ 2008-07-04 16:41  陕北蜂农  阅读(225)  评论(0编辑  收藏  举报