sd3000225 发表于 2011-4-9 19:52:09

如何检测GPS模块

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;            //经度
unsigned char JD_a;            //经度方向
unsigned char WD;            //纬度
unsigned char WD_a;            //纬度方向
unsigned char time;      //时间
unsigned char date;      //日期
unsigned char speed;      //速度
unsigned char angle;      //方位角
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;            //命令类型存储数组

//显示需要的变量
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); //显示单个字符
                       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=tmp;            //接收字符放入类型缓存
                  if(byte_count>=4)
                          {                //如果类型数据接收完毕,判断类型
                        if(cmd=='G')
                                {
                            if(cmd=='P')
                                    {
                              if(cmd=='R')
                                      {
                                    if(cmd=='M')
                                            {
                                        if(cmd=='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=tmp;   
                                            }
                                    break;
                                case 2:                              //定位判断A or V
                                    if(byte_count<1)
                                            {
                                        lock=tmp;
                                            }
                                case 3:                              //纬度处理
                                    if(byte_count<9)
                                            {
                                        WD=tmp;
                                            }
                                    break;
                                case 4:                              //纬度方向处理
                                    if(byte_count<1)
                                            {
                                        WD_a=tmp;
                                            }
                                    break;
                                case 5:                              //经度处理
                                    if(byte_count<10)
                                            {
                                        JD=tmp;
                                            }
                                    break;
                              case 6:                              //经度方向处理
                                    if(byte_count<1)
                                            {
                                        JD_a=tmp;
                                            }
                                    break;
                              case 7:                              //速度处理
                                    if(byte_count<5)
                                            {
                                        speed=tmp;
                                            }
                                    break;
                              case 8:                              //航向处理
                                    if(byte_count<5)
                                            {
                                        angle=tmp;
                                            }
                                    break;
                                case 9:                              //日期处理
                                    if(byte_count<6)
                                            {
                                        date=tmp;
                                            }
                                    break;
                            }
                            break;
                  }
                }
                byte_count++;      //接收数位加1
                break;
      }
    }
    RI=0;
}

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

renpeng009 发表于 2011-4-9 20:11:36

只有局部的代码,说明不了什么问题

sd3000225 发表于 2011-4-9 20:23:08

回复【1楼】renpeng009大鹏集成
-----------------------------------------------------------------------
请问如何用电脑来检测GPS模块的数据接收

bynce 发表于 2011-4-9 20:27:03

就是一个串口信号,有很多这样的软件。注意GPS的TX和RX信号的类型,用一个串口线就可以了。

sd3000225 发表于 2011-4-9 20:29:07

回复【3楼】bynce罗曼
-----------------------------------------------------------------------

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

renpeng009 发表于 2011-4-9 20:40:31

不知道你是什么情况,我说一个具体的实例,我用CP2102做的USB转串口,把CP2102直接和GPS相连即可。如果你有硬件串口,需要电平转换

sd3000225 发表于 2011-4-9 20:48:03

回复【5楼】renpeng009大鹏集成
-----------------------------------------------------------------------

求指教。。。

sd3000225 发表于 2011-4-9 21:05:55

求一个 GPS上位机软件 万分感激

renpeng009 发表于 2011-4-9 22:03:50

百度GPSVIEWERPC 版回车

sd3000225 发表于 2011-4-9 22:14:07

回复【8楼】renpeng009大鹏集成
-----------------------------------------------------------------------

哦 谢谢

sd3000225 发表于 2011-4-9 22:15:36

哪位大虾可以帮我看下程序。。。

renpeng009 发表于 2011-4-9 22:54:50

你确定没有硬件错误?

sd3000225 发表于 2011-4-10 10:06:47

回复【11楼】renpeng009大鹏集成
-----------------------------------------------------------------------

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

mx123 发表于 2011-4-10 10:30:31

先连上电脑看看啊,有很多软件的,直接查看,如果是好的,说明你的程序有问题!

yaodp 发表于 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有效数据会有帮助的。

sd3000225 发表于 2011-4-10 11:41:29

感谢LS两位。。软件搜到的都无法安装

yzqllgg 发表于 2011-4-11 18:52:26

mark
页: [1]
查看完整版本: 如何检测GPS模块