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

📄 receive.c

📁 GPS开发 NEA1803 51单片机与12864 由串口中断收取数据 显示经度纬度 高度 速度 时间 使用卫星数
💻 C
📖 第 1 页 / 共 2 页
字号:
                       }
                 }
//系统初始化
void sys_init() 
{
//     unsigned char i;
     SCON = 0x50;      /* SCON: mode 1, 8-bit UART, enable rcvr */
     TMOD = 0x20;      /* TMOD: timer 1, mode 2, 8-bit reload */
     TH1=TL1=0xfa;       /* TH1: reload value for 4800 baud @ 11.059MHz */
     TR1 = 1;            /* TR1: timer 1 run */
     Init_Lcd12864();            //初始化LCD
	 ResetCursor(0,1);
     printf("GPS Monitor V1.2");
   	 ClearAS();
     IE=0x90;                  //开总中断、串口中断
}

//串口接收中断
void uart(void) interrupt 4
{
     unsigned char tmp;
     if(RI){
           tmp=SBUF;
           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 
								 //  $GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
                                         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
								   //$GPGSV,2,1,07,07,79,048,42,02,51,062,43,26,36,256,42,27,27,138,42*71
                                         switch(seg_count){
                                               case 3:                                                //天空中的卫星总数
                                                     if(byte_count<2){
                                                           total_sat[byte_count]=tmp;
                                                     }
                                                     break;
                                         }
                                         break;
                                   case 3:                        //类型3数据接收。GPRMC
					//$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10
                                         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++;            //接收数位加1
                       break;
           }
     }
     RI=0;
}

⌨️ 快捷键说明

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