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

📄 can_gps.c

📁 单片机和GPS接收机构成的车载卫星定位系统
💻 C
📖 第 1 页 / 共 4 页
字号:
		 request_data(GPSdata,40);
		 }
	  //save_24_buff(buff_send_SPI,1);
	  if(buf_full|0x01)	//GGA语句
	    {                
		 if(lock=='0')//如果未定位
          {dis_str(1,1,"**/**/",6);      //日期
		   dis_str(1,11,"**:**:**",8);   //时间 
		   dis_str(2,1,"***.**",6);      //海拔
		   dis_str(2,11,"***.**",6);     //速度                  
           dis_str(3,1,"-----.----",12);
		   dis_str(3,11,"**",2);         //显示经度方向
		   dis_str(3,15,"**",2);         //显示接收卫星数
           dis_str(4,1," --.--.----  ",12); 
		   dis_str(4,11,"**",2);         //显示纬度方向
		   dis_str(4,15,"**",2);	     //显示天空卫星总数                   
           }
         else         //如果已定位
          {  
		   dis_str(1,1,date,6);          //日期 
		   dis_str(1,9,time,8);          //时间 
		   
		   dis_str(2,1,altitude,7);      //海拔
		   dis_str(2,11,speed,6);        //速度

           dis_str(3,1,JD,10);           //显示经度
		   dis_str(3,11,JD_a,2);         //显示经度方向
		   dis_str(3,15,use_sat,2);      //显示接收卫星数

           dis_str(4,2,WD,9);            //显示纬度
		   dis_str(4,11,WD_a,2);         //显示纬度方向
		   dis_str(4,15,total_sat,2);	 //显示天空卫星总数

           buf_full&=~0x01;
           dsp_count=0;
           }
		 }
	  if(buf_full|0x02)	//GSV语句
	    {                
		 dis_str(1,15,total_sat,2);	     //显示天空卫星总数
		 buf_full&=~0x02;
         dsp_count=0;
		 }
	  if(buf_full|0x04)	//RMC语句
	    {                
		 if(lock=='0')//如果未定位
          {                   
           dis_str(1,1,"**/**/",6);      //日期
		   dis_str(1,11,"**:**:**",8);   //时间 
		   dis_str(2,1,"***.**",6);      //海拔
		   dis_str(2,11,"***.**",6);     //速度                  
           dis_str(3,1,"-----.----",12);
		   dis_str(3,11,"**",2);         //显示经度方向
		   dis_str(3,15,"**",2);         //显示接收卫星数
           dis_str(4,1," --.--.----  ",12); 
		   dis_str(4,11,"**",2);         //显示纬度方向
		   dis_str(4,15,"**",2);	     //显示天空卫星总数                     
           }
         else         //如果已定位
          {
		   dis_str(1,1,date,6);          //日期 
		   dis_str(1,9,time,6);          //时间
		   
		   //dis_str(2,1,altitude,7);    //海拔
		   dis_str(2,1,high,7);          //高度
		   dis_str(2,11,speed,6);        //速度

           dis_str(3,1,JD,12);           //显示经度
		   dis_str(3,13,JD_a,2);         //显示经度方向
		   dis_str(3,15,use_sat,2);      //显示接收卫星数

           dis_str(4,2,WD,11);            //显示纬度
		   dis_str(4,13,WD_a,2);         //显示纬度方向
		   dis_str(4,15,total_sat,2);	 //显示天空卫星总数

           buf_full&=~0x04;
           dsp_count=0;
           }
		 }	 
	  }
 }
}
/*************************************************************/
/********************** 中断 *********************************/
/*************************************************************/
void  DataReceive()  interrupt 0  using 1
{
      red=0;                        //接受指示
      EX0=0;
      SJA_BCANAdr=REG_INTERRUPT;    //读取中断寄存器值,判断中断类型
      interrupt_flag=*SJA_BCANAdr;
      if((interrupt_flag&0x01)==1)//接收中断
         {
          BCAN_DATA_RECEIVE(SystemBuf); //读取缓冲区数据
          BCAN_CMD_PRG(RRB_CMD);        //释放接收缓冲区
          request_flag=1;
          }
       if((interrupt_flag&0x04)==1)//错误中断
          {
           SJA_reset=0; //复位
           }
   EX0=1;
}
void time1_int(void) interrupt 3 using 2
{
return;
}
/*----------------------------------*/
void SCON_int(void) interrupt 4  using 2       //串口接收中断
{
unsigned char tmp;
    if(RI)
    	{
        tmp=SBUF;
        switch(tmp)
        {
            case '$':
                cmd_number=0;        //命令类型清空
                mode=1;              //接收命令模式
                byte_count=0;        //接收位数清空
				GPSdataCount=0;		 //接收总数据计数器清空
                break;
            case ',':
                seg_count++;         //逗号计数加1
                byte_count=0;
                break;
            case '*':
                switch(cmd_number)
                {
                    case 1:
                        buf_full|=0x01;		//GGA接收完毕
                        break;				
                    case 2:
                        buf_full|=0x02;		//GSV接收完毕
                        break;
                    case 3:
                        buf_full|=0x04;		//RMC接收完毕
                        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 1:                                //时间处理
                                    if(byte_count<8)
                                    	{
										if((byte_count==2)|(byte_count==5))time[byte_count++]=':';
                                        time[byte_count]=tmp;
										GPSdata[GPSdataCount++]=tmp;
                                    	}
                                    break;
                                case 2:                                //纬度处理
                                    if(byte_count<13)
                                    	{
										if(byte_count==2)WD[byte_count++]='.';	//0xba/0xb0
                                        WD[byte_count]=tmp;
										GPSdata[GPSdataCount++]=tmp;
                                    	}
                                    break;
                                case 3:                                //纬度方向处理
                                    if(byte_count<1)
                                    	{
                                        WD_a[1]=tmp;
                                    	}
                                    break;
                                case 4:                                //经度处理
                                    if(byte_count<14)
                                    	{
										if(byte_count==3)JD[byte_count++]='.';
                                        JD[byte_count]=tmp;
										GPSdata[GPSdataCount++]=tmp;
                                    	}
                                    break;
                                case 5:                                //经度方向处理
                                    if(byte_count<1)
                                    	{
                                        JD_a[1]=tmp;
                                    	}
                                    break;
                                case 6:                                //定位状态判断
                                    if(byte_count<1)				   //0 未定位
                                    	{							   //1 未差分定位
                                        lock=tmp;					   //2 差分定位
                                    	}
                                    break;
                                case 7:                                //定位使用的卫星号
                                    if(byte_count<2)
                                    	{
                                        use_sat[byte_count]=tmp;
                                    	}
                                    break;
                                case 9:                                //高度处理
                                    if(byte_count<7)
                                    	{
                                        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<8)
                                    	{                //时间处理
										if((byte_count==2)|(byte_count==5))time[byte_count++]=':';
                                        time[byte_count]=tmp;  
										GPSdata[GPSdataCount++]=tmp;  
                                    	}
                                    break;
							    case 2:
                                    if(byte_count<1)
                                    	{if(tmp=='A')	 //A 定位
										lock='1';        //定位状态判断
                                        else if(tmp=='V')//V 未定位
										lock='0';    	     
                                    	}				 
                                    break;
								case 3:
                                    if(byte_count<13)
                                    	{                //纬度处理
										if(byte_count==2)WD[byte_count++]='.';
                                        WD[byte_count]=tmp; 
										GPSdata[GPSdataCount++]=tmp;   
                                    	}
                                    break;
								case 4:
                                    if(byte_count<1)
                                    	{                //纬度方向处理
                                        WD_a[1]=tmp;    
                                    	}
                                    break;
							    case 5:
                                    if(byte_count<14)
                                    	{                //经度处理
										if(byte_count==3)JD[byte_count++]='.';
                                        JD[byte_count]=tmp;  
										GPSdata[GPSdataCount++]=tmp;  
                                    	}
                                    break;
								case 6:
                                    if(byte_count<1)
                                    	{                //经度方向处理
                                        JD_a[1]=tmp;    
                                    	}
                                    break;
                                case 7:                  //速度处理
                                    if(byte_count<6)
                                    	{
                                        speed[byte_count]=tmp;
                                    	}
                                    break;
                                case 8:                  //方位角处理
                                    if(byte_count<5)
                                    	{
                                        angle[byte_count]=tmp;
                                    	}
                                    break; 
							    case 9:                  //日期处理
                                    if(byte_count<8)
                                    	{
										if((byte_count==2)|(byte_count==5))date[byte_count++]='/';
                                        date[byte_count]=tmp;
                                    	}
                                    break;
                            }
                            break;
                    }
                }
                byte_count++;        //接收数位加1
                break;
        }
    }	 
    RI=0;
if(TI)TI=0;
}

⌨️ 快捷键说明

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