搜索
bottom↓
回复: 16

如何检测GPS模块

[复制链接]

出0入0汤圆

发表于 2011-4-9 19:52:09 | 显示全部楼层 |阅读模式
GPS模块已经焊到板上了,程序也应该没什么问题,但是液晶屏就是不显示数据
/******************************************************************************

晶振频率:11.0592Mhz
波特率:4800

******************************************************************************/

#include <reg52.h>
#include <string.h>

#define LCM_Data P0
#define Busy 0x80   //用于检测LCM状态字中的Busy标识
sbit LCM_RW = P2^2;  //LCD1602定义引脚
sbit LCM_RS = P2^1;
sbit LCM_E = P2^5;


//GPS数据存储数组
unsigned char JD[10];            //经度
unsigned char JD_a;            //经度方向
unsigned char WD[9];            //纬度
unsigned char WD_a;            //纬度方向
unsigned char time[6];        //时间
unsigned char date[6];        //日期
unsigned char speed[5];        //速度
unsigned char angle[5];        //方位角
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;
bit spd_type;

void sys_init(void);
bit chk_key(void);

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void LCD_cls(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
/******************************************************************************************
* 函数名称    :main()
* 功能描述    :
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void main()
{
    unsigned char i;

    sys_init();

    while(1)
    {
        if(buf_full==0)                //无GPS信号时
        {
            dsp_count++;
            if(dsp_count>=65000)
                    {
                LCD_cls();            //清屏
                DisplayListChar(0,0,"No GPS connect..");
                Delay400Ms();
                while(buf_full==0);
                LCD_cls();   
                dsp_count=0;
                    }
        }
        else if(lock=='V')   //GPRMC语句
              {                    //如果未定位
                   DisplayListChar(0,1,"No Positioning");
                   Delay400Ms();
                   LCD_cls();                  
              }
            else
              {                            //如果已定位
                   DisplayOneChar(0,0,JD_a);            //显示经度
                   DisplayOneChar(1,0,' ');
                   for(i=0;i<3;i++)
                   {
                        DisplayOneChar(i+1,0,JD);
                   }
                   DisplayOneChar(4,0,'.');
                   for(i=3;i<10;i++)
                   {
                        DisplayOneChar(i+2,0,JD);
                   }
                                   DisplayOneChar(0,1,WD_a);            //显示纬度
                   DisplayOneChar(1,1,' ');
                   for(i=0;i<2;i++)
                   {
                        DisplayOneChar(i+2,1,WD);
                   }            
                   DisplayOneChar(4,1,'.');
                   for(i=2;i<9;i++)
                   {
                        DisplayOneChar(i+3,1,WD);
                   }
                  
                }
                    
                  
            dsp_count=0;
         }
}


/******************************************************************************************
* 函数名称    :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 */
    TH1 = 0xfa;            /* TH1: reload value for 4800 baud @ 11.059MHz */

   

   
    TR1 = 1;         /* TR1: timer 1 run */
    LCMInit();        //初始化LCD
    DisplayListChar(0,0,"GPS GS-89m-J");
    Delay400Ms();
    Delay400Ms();
    LCD_cls();
    IE=0x90;            //开总中断、串口中断
}

/******************************************************************************************
* 函数名称    :WriteDataLCM
* 功能描述    :写数据
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void WriteDataLCM(unsigned char WDLCM)
{
                ReadStatusLCM(); //检测忙
                LCM_Data = WDLCM;
                LCM_RS = 1;
                LCM_RW = 0;
                LCM_E = 0; //若晶振速度太高可以在这后加小的延时
                LCM_E = 0; //延时
                LCM_E = 1;
}

/******************************************************************************************
* 函数名称    :WriteCommandLCM
* 功能描述    :写指令
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
                if (BuysC)
                ReadStatusLCM(); //根据需要检测忙
                LCM_Data = WCLCM;
                LCM_RS = 0;
                LCM_RW = 0;
                LCM_E = 0;
                LCM_E = 0;
                LCM_E = 1;
}

/******************************************************************************************
* 函数名称    :ReadStatusLCM
* 功能描述    :读状态
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
unsigned char ReadStatusLCM(void)
{
                LCM_Data = 0xFF;
                LCM_RS = 0;
                LCM_RW = 1;
                LCM_E = 0;
                LCM_E = 0;
                LCM_E = 1;
                while (LCM_Data & Busy); //检测忙信号
                return(LCM_Data);
}
/******************************************************************************************
* 函数名称    :LCMInit
* 功能描述    :LCM初始化
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void LCMInit(void)
{
            Delay400Ms();
                LCM_Data = 0;
                WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
                Delay5Ms();
                WriteCommandLCM(0x38,0);
                Delay5Ms();
                WriteCommandLCM(0x38,0);
                Delay5Ms();

                WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
                WriteCommandLCM(0x08,1); //关闭显示
                WriteCommandLCM(0x01,1); //显示清屏
                WriteCommandLCM(0x06,1); // 显示光标移动设置
                WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
/******************************************************************************************
* 函数名称    :LCMInit
* 功能描述    :LCM初始化
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void LCD_cls(void)
{
                WriteCommandLCM(0x01,0);
                Delay5Ms();
}
/******************************************************************************************
* 函数名称    :DisplayOneChar
* 功能描述    :按指定位置显示一个字符
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
//                Y &= 0x1;
                X &= 0xF; //限制X不能大于15,Y不能大于1
        
                switch(Y)
                {

                        case 0:       
                                X += 0x00; //当要显示第二行时地址码+0x40;
                                X += 0x80; //算出指令码
                                WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
                                WriteDataLCM(DData);
                                break;
                        case 1:       
                                X += 0x80; //当要显示第二行时地址码+0x40;
                                X += 0x40; //算出指令码
                                WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
                                WriteDataLCM(DData);
                                break;
                        default: break;
                }
               
}
/******************************************************************************************
* 函数名称    :DisplayListChar
* 功能描述    :按指定位置显示一串字符  ***原来的遇到空格0x20就不显示***
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
          unsigned char ListLength,j;
          ListLength = strlen(DData);
          Y &= 0x1;
          X &= 0xF; //限制X不能大于15,Y不能大于1
    if (X <= 0xF) //X坐标应小于0xF
      {
                    for(j=0;j<ListLength;j++)
                   {
                         DisplayOneChar(X, Y, DData[j]); //显示单个字符
                         X++;
                  }
       }
}

/******************************************************************************************
* 函数名称    :Delay5M
* 功能描述    :5ms延时
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Delay5Ms(void)
{
                unsigned int TempCyc = 5552;
                while(TempCyc--);
}
/******************************************************************************************
* 函数名称    :Delay400Ms
* 功能描述    :400ms延时
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Delay400Ms(void)
{
                unsigned char TempCycA = 5;
                unsigned int TempCycB;
        while(TempCycA--)
                {
                        TempCycB=7269;
                        while(TempCycB--);
                };
}

/******************************************************************************************
* 函数名称    :uart
* 功能描述    :串口接收中断
* 参数        :  参数名称:        输入/输出?        类型                描述
*
* 返回值      :
* 作者        :
* 创建日期    :
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :                          修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
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]=='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 3:                //类型3数据接收。GPRMC
                            switch(seg_count)
                            {
                                case 1:
                                    if(byte_count<6)                   //时间处理
                                            {               
                                        time[byte_count]=tmp;   
                                            }
                                    break;
                                case 2:                                //定位判断A or V
                                    if(byte_count<1)
                                            {
                                        lock=tmp;
                                            }
                                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;
}

No GPS connect..也不显示         如果模块坏了 或者没焊好  是不是会出现这样的问题?

出0入0汤圆

发表于 2011-4-9 20:11:36 | 显示全部楼层
只有局部的代码,说明不了什么问题

出0入0汤圆

 楼主| 发表于 2011-4-9 20:23:08 | 显示全部楼层
回复【1楼】renpeng009  大鹏集成
-----------------------------------------------------------------------
请问如何用电脑来检测GPS模块的数据接收

出0入0汤圆

发表于 2011-4-9 20:27:03 | 显示全部楼层
就是一个串口信号,有很多这样的软件。  注意GPS的TX和RX信号的类型,用一个串口线就可以了。

出0入0汤圆

 楼主| 发表于 2011-4-9 20:29:07 | 显示全部楼层
回复【3楼】bynce  罗曼
-----------------------------------------------------------------------

板上焊了一个RS232的接口  跟电脑相连  用软件可接收到GPS数据 是吗?

出0入0汤圆

发表于 2011-4-9 20:40:31 | 显示全部楼层
不知道你是什么情况,我说一个具体的实例,我用CP2102做的USB转串口,把CP2102直接和GPS相连即可。如果你有硬件串口,需要电平转换

出0入0汤圆

 楼主| 发表于 2011-4-9 20:48:03 | 显示全部楼层
回复【5楼】renpeng009  大鹏集成
-----------------------------------------------------------------------

求指教。。。

出0入0汤圆

 楼主| 发表于 2011-4-9 21:05:55 | 显示全部楼层
求一个 GPS上位机软件 万分感激

出0入0汤圆

发表于 2011-4-9 22:03:50 | 显示全部楼层
百度  GPSVIEWER  PC 版  回车

出0入0汤圆

 楼主| 发表于 2011-4-9 22:14:07 | 显示全部楼层
回复【8楼】renpeng009  大鹏集成
-----------------------------------------------------------------------

哦 谢谢

出0入0汤圆

 楼主| 发表于 2011-4-9 22:15:36 | 显示全部楼层
哪位大虾可以帮我看下程序。。。

出0入0汤圆

发表于 2011-4-9 22:54:50 | 显示全部楼层
你确定没有硬件错误?

出0入0汤圆

 楼主| 发表于 2011-4-10 10:06:47 | 显示全部楼层
回复【11楼】renpeng009  大鹏集成
-----------------------------------------------------------------------

可以确定。。除非GPS模块坏了

出0入0汤圆

发表于 2011-4-10 10:30:31 | 显示全部楼层
先连上电脑看看啊,有很多软件的,直接查看,如果是好的,说明你的程序有问题!

出0入0汤圆

发表于 2011-4-10 10:42:53 | 显示全部楼层
建议楼主看看这里:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4657079&bbs_page_no=2&bbs_id=9999

再看看NMEA0183协议说明,对你如何检测GPS有效数据会有帮助的。

出0入0汤圆

 楼主| 发表于 2011-4-10 11:41:29 | 显示全部楼层
感谢LS两位。。软件搜到的都无法安装

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-3 10:33

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

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