`
huobengle
  • 浏览: 867458 次
文章分类
社区版块
存档分类
最新评论

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; }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics