| 
钻石会员 主题
回帖0
积分25772
阅读权限50
注册时间2010-7-10
最后登录1970-1-1
在线时间 小时
 
 | 
 
 楼主|
发表于 2013-12-17 19:59
|
显示全部楼层 
| [ 本帖最后由 灰太狼8888 于 2013-12-17 20:15 编辑 ]\n\n 
 #include<reg52.h>
 
 sbit GPS_SPD=P1^1;                        //GPS模块接收速率设置
 sbit KEY1=P1^0;                                //显示内容分屏切换
 
 char code TIME_AREA= 8;                //时区
 
 //GPS数据存储数组
 unsigned char JD[10];                //经度
 unsigned char JD_a;                //经度方向
 unsigned char WD[9];                //纬度
 unsigned char WD_a;                //纬度方向
 unsigned char date[6];                //日期
 unsigned char time[6];                //时间
 unsigned char speed[5]= {'0','0','0','0','0'};                //速度
 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:结束模式,1:命令模式,2:数据模式
 unsigned char buf_full;                //1:整句接收完成,相应数据有效。0:缓存数据无效。
 unsigned char cmd[5];                //命令类型存储数组
 
 //显示需要的变量
 unsigned int dsp_count;                //刷新次数计数器
 unsigned char time_count;
 bit page;
 
 void sys_init(void);
 bit chk_key(void);
 
 main()
 {
 unsigned char i;
 char Bhour;
 sys_init();
 
 lock=1;
 use_sat[0]='0';
 use_sat[1]='0';
 total_sat[0]='0';
 total_sat[1]='0';
 
 while(1) {
 if(buf_full==0)                                //无GPS信号时
 {
 dsp_count++;
 if(dsp_count>=65000) {
 LCD_cls();                        //清屏
 LCD_write_string(0,0,"No GPS connect..");
 LCD_write_string(0,1,"Please Check..");
 while(buf_full==0);
 LCD_cls();
 dsp_count=0;
 }
 }
 else {                                                //有GPS信号时
 
 if(chk_key()) {                                //检测到按键切换显示
 page=!page;
 LCD_cls();
 }
 
 if(!page) {                                                //页面1
 if(buf_full|0x01) {                                //GGA语句
 if(lock==0) {                                        //如果未定位
 LCD_write_string(0,0,"*---.--.----  ");
 LCD_write_string(0,1,"* --.--.----  ");
 } else {                                                        //如果已定位
 LCD_write_char(0,0,JD_a);                        //显示经度
 for(i=0; i<10; i++) {
 LCD_write_char(i+1,0,JD[i]);
 }
 
 LCD_write_char(0,1,WD_a);                        //显示纬度
 LCD_write_char(1,1,' ');
 for(i=0; i<9; i++) {
 LCD_write_char(i+2,1,WD[i]);
 }
 }
 LCD_write_char(14,1,use_sat[0]);                //显示接收卫星数
 LCD_write_char(15,1,use_sat[1]);
 buf_full&=~0x01;
 dsp_count=0;
 }
 if(buf_full|0x02) {                                //GSV语句
 LCD_write_char(14,1,total_sat[0]);
 LCD_write_char(15,1,total_sat[1]);
 buf_full&=~0x02;
 dsp_count=0;
 }
 if(buf_full|0x04) {
 if(lock==0) {                                        //如果未定位
 LCD_write_string(0,0,"*---.--.----  ");
 LCD_write_string(0,1,"* --.--.----  ");
 } else {                                                        //如果已定位
 LCD_write_char(0,0,JD_a);                        //显示经度
 for(i=0; i<10; i++) {
 LCD_write_char(i+1,0,JD[i]);
 }
 LCD_write_char(0,1,WD_a);                        //显示纬度
 LCD_write_char(1,1,' ');
 for(i=0; i<9; i++) {
 LCD_write_char(i+2,1,WD[i]);
 }
 }
 LCD_write_char(14,0,use_sat[0]);                //显示接收卫星数
 LCD_write_char(15,0,use_sat[1]);
 buf_full&=~0x04;
 dsp_count=0;
 }
 }
 else {                                                        //页面2
 if(buf_full|0x01) {                                //GGA语句
 buf_full&=~0x01;
 dsp_count=0;
 }
 if(buf_full|0x02) {
 buf_full&=~0x02;
 dsp_count=0;
 }
 if(buf_full|0x04) {                                //RMC语句
 Bhour=((time[0]-0x30)*10+time[1]-0x30)+TIME_AREA;
 if(Bhour>=24) {
 Bhour-=24;
 } else if(Bhour<0) {
 Bhour+=24;
 }
 
 LCD_write_char(0,1,date[4]);
 LCD_write_char(1,1,date[5]);
 LCD_write_char(2,1,date[2]);
 LCD_write_char(3,1,date[3]);
 LCD_write_char(4,1,date[0]);
 LCD_write_char(5,1,date[1]);
 
 LCD_write_char(8,1,Bhour/10+0x30);
 LCD_write_char(9,1,Bhour%10+0x30);
 LCD_write_char(10,1,':');
 LCD_write_char(11,1,time[2]);
 LCD_write_char(12,1,time[3]);
 LCD_write_char(13,1,':');
 LCD_write_char(14,1,time[4]);
 LCD_write_char(15,1,time[5]);
 
 LCD_write_string(5,0,"knot A");
 
 if(lock=='0') {                                        //如果未定位
 LCD_write_string(0,0,"---.-");
 LCD_write_string(11,0,"---.-");
 } else {                                                        //已经定位
 for(i=0; i<5; i++) {                        //knot显示
 LCD_write_char(i,0,speed[i]);
 }
 for(i=0; i<5; i++) {
 LCD_write_char(11+i,0,angle[i]);
 }
 }
 buf_full&=~0x04;
 dsp_count=0;
 }
 }
 
 }
 }
 }
 
 bit chk_key(void)
 {
 if(!KEY1) {
 delayms(10);
 if(!KEY1) {
 while(!KEY1);
 delayms(10);
 return(1);
 }
 }
 return(0);
 }
 
 //系统初始化
 void sys_init() {
 unsigned char i;
 SCON = 0x50;         /* SCON: mode 1, 8-bit UART, enable rcvr */
 TMOD = 0x21;         /* TMOD: timer 1, mode 2, 8-bit reload */
 if(GPS_SPD)
 {
 TH1 = 0xfa;                 /* TH1: reload value for 4800 baud @ 11.059MHz */
 }
 else
 {
 TH1 = 0xfd;                        /* TH1: reload value for 9600 baud @ 11.059MHz */
 }
 TR1 = 1;                 /* TR1: timer 1 run */
 LCD_init(8);                //初始化LCD
 LCD_write_string(0,0," GPS SIRF II 2 ");
 LCD_write_string(0,1," 11-11-23 1342 ");
 
 
 for(i=1; i<4; i++) {
 delayms(250);
 }
 //LCD_cls();
 IE=0x90;                        //开总中断、串口中断
 }
 
 //串口接收中断
 void uart(void) interrupt 4
 {
 unsigned char tmp;
 if(RI) {
 tmp=SBUF;
 //  SBUF=tmp;
 //  if(TI)TI=0;
 switch(tmp) {
 case '$':
 cmd_number=0;                //命令类型清空
 mode=1;                                //接收命令模式
 byte_count=0;                //接收位数清空
 break;
 case ',':
 seg_count++;                //逗号计数加1
 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:                                //类型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:                                //类型2数据接收。GPGSV
 switch(seg_count) {
 case 3:                //天空中的卫星总数
 if(byte_count<2) {
 total_sat[byte_count]=tmp;
 }
 break;
 }
 break;
 case 3:                                //类型3数据接收。GPRMC
 switch(seg_count) {
 case 1:                //时间处理
 if(byte_count<6) {
 time[byte_count]=tmp;
 }
 break;
 case 2:                //定位判断
 if(byte_count<1) {
 if (tmp=='A') {
 lock=1;
 }
 else {
 lock=0;
 }
 }
 break;
 case 3:                //纬度处理
 if(byte_count<9) {
 WD[byte_count]=tmp;
 }
 break;
 case 4:                //纬度方向处理
 if(byte_count<1) {
 WD_a=tmp;
 }
 break;
 case 5:                //经度处理
 if(byte_count<10) {
 JD[byte_count]=tmp;
 }
 break;
 case 6:                //经度方向处理
 if(byte_count<1) {
 JD_a=tmp;
 }
 break;
 case 7:                //速度处理
 if(byte_count<5) {
 speed[byte_count]=tmp;
 }
 break;
 case 8:                //方位角处理
 if(byte_count<5) {
 angle[byte_count]=tmp;
 }
 break;
 case 9:                //方位角处理
 if(byte_count<6) {
 date[byte_count]=tmp;
 }
 break;
 
 }
 break;
 }
 }
 byte_count++;                //接收数位加1
 break;
 }
 }
 RI=0;
 }
 
 
 
 
  基于单片机的GPS串口中断接收程序.txt
(8.92 KB, 下载次数: 351) 
 | 
 |