搜索
bottom↓
回复: 36

GPS模块接收不到定位信号,只有时间,请大家指点

[复制链接]

出0入0汤圆

发表于 2009-8-19 07:43:06 | 显示全部楼层 |阅读模式
我使用的GPS接收模块是个天线一起集成的,模块背面写着GPS ANTENNA  但是老师给的资料我的是GERMIN OEM板的资料
我按照上面资料做的,写入输入语句,输出语句选的是GPRMC,输入语句是PGRMI
MCU是89C2051 我刚开始接收到了时间的时分 后来接了秒
然后我想尝试定位一下,发现接收不到,显示6H30有时候显示1H30(  我在武汉)
后来我就测试,到底接收到信号没有,因为GPRMC有个数据是判断定位没有嘛。结果显示没有定位
我怕是放在实验室,没有信号,然后就把他放到窗户外(我在二楼)。还是没有接收,不晓得是上面原因,请大家指教下~~~我怀疑是输入语句初始化的原因,但是尝试换不同的输入语句,还是没有接收到,附上程序,大家指点下
(注:我的是先接受,后无线发给另外的单片机的)
#include<reg51.h>

unsigned char mm,timer_h,time_h_s,time_h_g,hour_s,hour_g,time_min_s,time_min_g,time_sec_s,time_sec_g;
unsigned char cnt2, done2, tt2,sendflag;


sbit din=P1^7;                    //佑隡AX7219连接的管脚定义
sbit clk=P1^5;
sbit load=P1^6;

void delay(unsigned int t)          //延时
    {
      unsigned int i;
      for(i=t;i>0;i--);   

    }


void maxsend(unsigned char  add,unsigned char  dat)        //MAX7219发送指令或者数据的子程序
        {
            unsigned char  ads,i,j;
            load=0;
            i=0;
            while(i<16)
            {
              if(i<8)
                {ads=add;}
              else
                {ads=dat;}
              for(j=8;j>=1;j--)
              {
                clk=0;
                din=(bit)(ads&0X80);
                ads=ads<<1;
                clk=1;
               }
              i=i+8;
             }
             load=1;
        }


void DisplayTime( )                                  //数码管显示
        {
             maxsend(0x01, time_sec_g);//分钟个位
             maxsend(0x02,time_sec_s); //分钟十位
             maxsend(0x03,hour_g); //小时个位
             maxsend(0x04,hour_s);//小时十位
        }   

void send_data()                                    //无线发送到另外一个单片机,因为无线模块硬件做的很好,所以不需什么程序
{
         delay(500);
         TI=0;
         SBUF= 1;
             while(!TI);
         TI=0;
         delay(500);

         SBUF= 2;
             while(!TI);
         TI=0;
                 delay(500);
      
         SBUF= 3;
         while(!TI);
         TI=0;
         delay(500);

         SBUF= 4;
         while(!TI);
         TI=0;
         delay(500);

         SBUF= 5;
         while(!TI);
         TI=0;
         delay(500);

         SBUF= hour_s;         //小时十位
         while(!TI);
         TI=0;
         delay(500);

         SBUF= hour_g;                 //小时个位
         while(!TI);
         TI=0;
         delay(500);

         SBUF= time_min_s;       //分钟十位
         while(!TI);
         TI=0;
         delay(500);

         SBUF= time_min_g;        //分钟个位
         while(!TI);
         TI=0;
         delay(500);
}

changeband9600()              //发送到另一个单片机的时候设置9600的波特率
        {
                TMOD=0x20;//2方式
                TH1=0xFD;//9600bit/s
                TL1=0xFD;
                TR1=1;
                SCON=0x50;//1方式,发
                PCON=0x00;
        }

changeband4800()            //接收GPS模块的信号时,波特率设置为4800(这是规定的波特率)
        {
                TMOD=0x20;//2方式
                TH1=0xfa;//4800bit/s
                TL1=0xfa;
                TR1=1;
                SCON=0x50;//receive open
                PCON=0x00;
        }

init_GPS()                 //输入语句PGRMI。接收时间
{
    TI = 0;
        SBUF ='$';                                // 发送"$"
        while(!TI);
        TI = 0;

        SBUF = 'P';                                        // 发送"P"
        while(!TI);
        TI = 0;

        SBUF = 'G';                                        // 发送"G"
        while(!TI);
        TI = 0;

        SBUF = 'R';                                        // 发送"R"
        while(!TI);
        TI = 0;

        SBUF = 'M';                                        // 发送"M"
        while(!TI);
        TI = 0;

        SBUF = 'I';                                        // 发送"O"
        while(!TI);
        TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
    TI = 0;


        SBUF = ',';                                        // 发送","
        while(!TI);
    TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
        TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
        TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
        TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
        TI = 0;

        SBUF = ',';                                        // 发送","
        while(!TI);
        TI = 0;


        SBUF = 'A';                                        // 发送"A"
        while(!TI);
        TI = 0;

           SBUF = '*';                                        // 发送","
        while(!TI);
        TI = 0;
}



void main()
        {
               

                cnt2=1;

                SCON=0x50;
                PCON=0x00;
                TMOD=0x20;
                TH1=0xfa;
                TL1=0xfa;
                TR1=1;
                EA=1;
                ES=1;
               
                maxsend(0X0C,0X01);           //MAX7219的初始化
                maxsend(0X0B,0X03);  
                maxsend(0X0A,0Xff);
                maxsend(0X09,0Xff);
                maxsend(0X0f,0X00);
                maxsend(0X01,0x02);
                maxsend(0X02,0x02);
                maxsend(0X03,0x02);
                maxsend(0X04,0x02);
                init_GPS();                  //GPS输入语句
                while(1)
                 {
                          DisplayTime();
               
                         if(sendflag)
                            {
                              ES=0;
                              sendflag=0;
                              changeband9600();  //改变波特率发送
                              send_data();       //发出信息
                  maxsend(0X03,0x08);
                  delay(10000);                  
                              changeband4800();  //改变波特率接收
                              ES=1;

                             }

                 }

    }
receivedat() interrupt 4  //receive int
{

        if(RI)
          {
               
                RI=0;//从卫星上获取数据
        mm=SBUF;
       
                done2=1;
                tt2=1;
      
                 if (mm == '$' && cnt2 == 1)       //识别帧头
                    {cnt2 = 2;}
                 if (mm == 'G' && cnt2 == 2)  
                        {cnt2 = 3;}
                 if (mm == 'P' && cnt2 == 3)  
                        {cnt2 = 4;}
                 if (mm == 'R' && cnt2 ==4)  
                        {cnt2 = 5;}
                 if (mm == 'M' && cnt2 == 5)  
                        {cnt2 = 6;}
                 if (mm == 'C' && cnt2 == 6 )
                          {  
                   cnt2 = 7;
                           done2 = 0;
                           }
                if (done2 == 1 && cnt2 == 7 )  //逗号
                          {
                           cnt2 = 8;
                           tt2 = 0;
                          }

                if (tt2 == 1 && cnt2 == 8)   //小时十位
                         {
                          cnt2 = 9;
                          tt2 = 0;
                          time_h_s= mm-'0';
                         }

                if (tt2 == 1 &&cnt2 == 9 )  //小时个位
                 {
           cnt2 = 10;
                   tt2 = 0;
           time_h_g=mm-'0';
                   timer_h = time_h_s*10 +time_h_g;

                   if (timer_h >=16)         //转换为北京时间
                      {   
                       timer_h -=16;
                      }

                   else
                             {
                                    timer_h +=  8;


                            }
                hour_s=timer_h/10;
                                hour_g=timer_h%10;
                  }

                if (tt2 == 1 && cnt2 == 10)  //分钟十位
                 {
           cnt2 = 11;
                   tt2 = 0;
                   time_min_s =mm-'0';
                 }

                if (tt2 == 1 && cnt2 == 11) //分钟个位
                 {
                  cnt2 = 12;
          tt2=0;
                  time_min_g =mm-'0';
                 }

       if (tt2 == 1 && cnt2 == 12)  //秒十位
                 {
           cnt2 = 13;
                   tt2 = 0;
                   time_sec_s =mm-'0';
                 }

                if (tt2 == 1 && cnt2 == 13) //秒个位
                 {
           cnt2 = 1;
           time_sec_g =mm-'0';
                   sendflag=1;             //接受完之后,置位标志位,开始发送
                 }
}
}

因为发射功率有点大,所以可以看到数码管闪烁的现象,表面,的确接收到信号了,但是接收经纬度就不行(我让它接收到经纬度后显示一个数字)
请大家指教下,我的QQ:331750901  可以加QQ请教

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入137汤圆

发表于 2009-8-19 07:58:10 | 显示全部楼层
用max232转成232电平,接到电脑的串口,用串口调试助手看。分析一下数据

出0入0汤圆

 楼主| 发表于 2009-8-19 08:25:49 | 显示全部楼层
那我请问下,我的输入语句跟输入的格式有问题吗?

出0入0汤圆

发表于 2009-8-19 08:45:13 | 显示全部楼层
查询方式的串行收发不可取

出0入0汤圆

 楼主| 发表于 2009-8-19 08:48:17 | 显示全部楼层
这个我晓得,我后来懒得改了,我现在关心的问题是,我的输入语句有问题不?

出0入0汤圆

发表于 2009-8-19 08:53:39 | 显示全部楼层
不要和你的电路和程序了,先把GPS接到电脑串口上看看语句中的内容。
GPS一般不要初始化的,上电就工作。

出0入0汤圆

发表于 2009-8-19 09:00:48 | 显示全部楼层
标记一下,楼主加油呀,

出0入0汤圆

发表于 2009-8-19 09:00:52 | 显示全部楼层
直接从PC串口调试助手读回看看
若是时间是格林威治时间的话,那是已经接收到卫星信号了,否则GPS给出的时间都是错的
收到格林威治时间后再等等就行了
先前调GPS时遇到过这个问题

出0入42汤圆

发表于 2009-8-19 09:02:26 | 显示全部楼层
摆到开阔的窗外,四周高楼林立是不行滴。你可以打开gpgsv语句来看视野里都有哪些卫星了。gps这个东西和单片机关系不大。不同的模块有不同的控制(输入)语句

出0入0汤圆

 楼主| 发表于 2009-8-19 09:11:07 | 显示全部楼层
怎么有人说要输入语句,有人说不要哦~~~我上面说的两款:GPS  ANTERNA 还有GERMIN OEM 需要初始化吗?我只晓得GERMIN25LS/V的需要初始化  其他的貌似不需要 不晓得前面的需要不需要

出0入0汤圆

 楼主| 发表于 2009-8-19 09:13:23 | 显示全部楼层
还有哦,我的GPS是串口的,就用了三根线,那我不是还要弄个转成USB接口接到电脑去????

出0入0汤圆

发表于 2009-8-19 09:25:02 | 显示全部楼层
有串口接串口,没串口你当然只能转USB。注意电平,不知道你的GPS是TTL电平还是RS232电平。TTL接串口需要转,接USB转换则不需要。RS232反之。

GPS一般都不需要初始化。你输入控制语句只是对它进行一些功能上的控制,但不会影响基本的定位。

四周一定要开阔,如果是SiRFII的芯片,想定位则至少有三分之二的露天。三代芯片好点,但也最好有二分之一的天空是无阻挡的,才能快速定位。

先不要管你的单片机了。接电脑上看看。

出0入0汤圆

发表于 2009-8-19 10:52:34 | 显示全部楼层
楼主加油,标记一下!

出0入42汤圆

发表于 2009-8-19 11:17:32 | 显示全部楼层
garmin25lvs,你应该说的这个吧。也不需要初始化的,5年前我十块钱买来的第一个模块就是这个

出0入0汤圆

发表于 2009-8-19 11:32:05 | 显示全部楼层
先从原理上说,GPS接收机定位需要有至少4颗卫星,通过卫星到接收机的距离,以及广播的卫星的位置,可以计算出接收机的3D坐标,以及本地时钟和卫星时钟的偏差。

至于GPS时间,是由广播的GPS导航电文得到的,所以只要跟踪任何一颗卫星,并连续跟踪超过6s,就能完成该星的帧同步,从而结算出该卫星的导航电文,GPS时间也由导航电文的头字得到。

所以,从你的情况可推出,你可以接受到少于4颗卫星的信号,所以得到了GPS时间,但是如果完成定位,需要至少4颗卫星,你可以把天线架在屋顶,或者远离建筑物的地方。

出0入137汤圆

发表于 2009-8-19 11:33:37 | 显示全部楼层
garmin的25lvs输出是232电平,可以直接接到电脑串口上

出0入0汤圆

 楼主| 发表于 2009-8-19 11:47:59 | 显示全部楼层
你们说的环境貌似我这里达不到~~~~
这里是实验楼,附近都是楼遮挡着

13楼的大哥,你买的5块钱??是模块??不对吧,我这个一两百哦
14楼的大哥,按照你的意思就是说,我还是接收到卫星了,对吧?只是信号的强与弱的问题~~~就是没有到宽广的地方接收更多卫星的信号~~
15楼的大哥,很感谢你的回答,你的方法暂时做不了,以后有时间在回头做这个,谢谢大家啊

出0入0汤圆

发表于 2009-8-19 12:08:49 | 显示全部楼层
对,你已经接收并跟踪了至少一颗卫星的信号。 我当年是用跟木棍,邦上天线,从窗口伸出去。

出0入0汤圆

 楼主| 发表于 2009-8-19 12:12:21 | 显示全部楼层
17楼的大哥,你从窗户伸出去??周围宽广吗??我那天也是伸出窗外了的

出0入0汤圆

发表于 2009-8-19 12:18:31 | 显示全部楼层
基本无遮挡了

出0入0汤圆

发表于 2009-8-19 12:19:25 | 显示全部楼层
放楼顶或者窗外,用木棍将天线伸远一些。
当你能够确定数据接收正常后。可以考虑在屋顶架设GPS天线,将室外的GPS信号引入室内放大。

出0入0汤圆

发表于 2009-8-19 12:56:33 | 显示全部楼层
有的GPS模块只能授时没有定位数据喔!!

出0入0汤圆

发表于 2009-8-19 13:03:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-19 13:36:04 | 显示全部楼层
时间要加上8才是真正的北京时间,后面的数据A开头才是有效数据,说明定位良好,如果时V,那就是无效的

语句是$GPRMC,开头,然后是时间,然后是标志A,V,标志位,然后是经纬度。


模块必须电平转化接PC串口,上电数据就出来了,通过串口精灵就可以看,波特率4800

出0入0汤圆

 楼主| 发表于 2009-8-19 13:40:22 | 显示全部楼层
呵呵,21楼 的大哥,那么我的定位的时候显示6H30是麽回事呢?乱码??

出0入0汤圆

 楼主| 发表于 2009-8-19 13:43:08 | 显示全部楼层
对,23楼的大哥说的是这样的~~~这是理想状况~~~我就在这么做的,“A开头才是有效数据,说明定位良好,如果时V,那就是无效的 ”我做的是A=9 V=0,看到的是一直显示0,说明没有定位到嘛~~
这个说定位需要天线啊 宽广的视野啊,什么的,我这里条件限制比较厉害~~只能够把天线放到窗户外而已呵呵

出0入0汤圆

发表于 2009-8-19 14:04:19 | 显示全部楼层
我跟23楼的Lvy56 佳一起做实验的,我们都是在户外空旷的场地上进行的,户外定位效果好。有没有笔记本电脑,那个USB就能供5V电源。

出0入0汤圆

 楼主| 发表于 2009-8-19 18:50:51 | 显示全部楼层
忽然想起,各位大哥,如果我需要设置输入语句,这样加速定位的话,是不是像我程序中写的那样的呢???????????

出0入0汤圆

发表于 2009-9-2 09:32:57 | 显示全部楼层
收藏一下,

出0入0汤圆

发表于 2009-9-3 23:52:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-4 10:30:52 | 显示全部楼层
冬冬你MARK两次了

出0入0汤圆

发表于 2009-9-4 10:56:59 | 显示全部楼层
如果串行助手能看到gps数据信息
那是你程序的问题
你一个一个字符存储
时间要换算
需要数据减去48
再计算

出0入0汤圆

发表于 2010-5-1 12:58:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-16 17:28:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-31 18:17:24 | 显示全部楼层
标记GPS回复【楼主位】yc1988lzj  
-----------------------------------------------------------------------

出0入0汤圆

发表于 2010-5-31 20:01:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-3 19:42:50 | 显示全部楼层
接到受时,证明收到卫星信号了,也就是说模块基本正常工作。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 04:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表