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

📄 gps.c

📁 gps接受数据模块 用于导航系统 监测系统等
💻 C
字号:
#include <reg51.h> 

#include <string.h>   
//GPS数据存储数组        
 
unsigned char time[6];        //时间   
unsigned char lock;            //定位状态  
unsigned char WD[9];            //纬度    
unsigned char WD_a;            //纬度方向 
unsigned char JD[10];            //经度    
unsigned char JD_a;            //经度方向     
unsigned char speed[5];        //速度    
unsigned char date[6];        //日期

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

   
void sys_init(void);   //系统初始化 
   
main()   
{    
    sys_init(); 
    
}   
   
//系统初始化    
void sys_init() 
{   
    
    SCON = 0x50;     /* SCON: mode 1, 8-bit UART, enable rcvr */   
    TMOD = 0x21;     /* TMOD: timer 1, mode 2, 8-bit reload */   
    TR1 = 1;         /* TR1: timer 1 run */   
   
    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 '*' :   
                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]=='R')
								{   
                                    if(cmd[3]=='M')
									{   
                                        if(cmd[4]=='C')
										{   
                                            cmd_number=1;   
                                            mode=2;
                                            seg_count=0;   //逗号计数器    
                                            byte_count=0;  //接收位数计数器
                                        }   
                                    }   
                                }   
                            }   
                        }   
                    }
                else if(mode==2)
				{   
                    //接收数据处理    
                    switch (cmd_number)
					{   
                        case 1:                //类型3数据接收。GPRMC    
                            switch(seg_count)
							{   
                                case 1:   
                                    if(byte_count<6)
									{                //时间处理    
                                        time[byte_count]=tmp;       
                                    }   
                                    break;   
								case 2:                                //定位判断    
                                    if(byte_count<1)
									{   
                                        lock=tmp;   
                                    }   
                                    break;   
                                case 3:                                //纬度处理    
                                    if(byte_count<9)
									{   
                                        WD[byte_count]=tmp;   
                                    }   
                                    break;   
                                case 4:                                //经度处理    
                                    if(byte_count<10)
									{   
                                        JD[byte_count]=tmp;   
                                    }   
                                    break;  
							    case 5:                                //纬度方向处理    
                                    if(byte_count<1)
									{   
                                        WD_a=tmp;   
                                    }   
                                    break;   
							    case 7:                                //速度处理    
                                    if(byte_count<5)
									{   
                                        speed[byte_count]=tmp;   
                                    }   
                                    break;    
                               
								case 9:   
                                    if(byte_count<6)
									{                //时间处理    
                                        date[byte_count]=tmp;       
                                    }   
                                    break;   
				}			
                byte_count++;        //接收数位加1    
                break;   
        }
     } 
}

⌨️ 快捷键说明

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