找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3269|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

我用51板子連接GPS,用1602顯示。可是顯示不出來,有大神能幫我看看么

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102745 發(fā)表于 2016-3-11 08:52 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>
#include "LCD1602.h"
#include "UART.h"
#include "Delay.h"
#include "GPS.h"
#include "config.h"

void main(void)
{
        unsigned char i;
        Uart_Init();
        LCD1602_Init();

        GPS_lock=1;
        GPSUSE_satellite[0]='0';
        GPSUSE_satellite[1]='0';

        while(1)
        {
                if(Data_legitimate==0)                                //無GPS信號(hào)時(shí)
                {
                        LCD1602_WriteCMD(CMD_clear);
                        Print_String(line_one,"  RTrobot GPS");
                        Print_String(line_two,"Please Waiting. ");
                        while(Data_legitimate==0);
                        Delay_Ms(200);
                        LCD1602_WriteCMD(CMD_clear);
                }
                else        //有GPS信號(hào)
                {               
                        if(Data_legitimate|0x01)        //GPGGA處理
                        {                       
                                        if(GPS_lock==0)                                        //未定位
                                        {
                                                Print_String(line_one,"  RTrobot GPS");
                                                Print_String(line_two,"Waiting...");                                       
                                        }
                                        else                                                                                //已定位
                                        {                                                                                       
                                                Print_Char(line_one,0,GPS_longitude_dir);                        //顯示經(jīng)度
                                                for(i=0;i<3;i++)
                                                {
                                                  Print_Char(line_one,i+1,GPS_longitude[i]);
                                                }
                                                Print_Char(line_one,4,'.');
                                                for(i=3;i<10;i++)
                                                {
                                                        Print_Char(line_one,i+2,GPS_longitude[i]);
                                                }

                                                Print_Char(line_two,0,GPS_latitude_dir);                        //顯示緯度
                                                Print_Char(line_two,1,' ');
                                               
                                                for(i=0;i<2;i++)
                                                {
                                                        Print_Char(line_two,i+2,GPS_latitude[i]);
                                                }
                                                Print_Char(line_two,4,'.');

                                                for(i=2;i<9;i++)
                                                {
                                                        Print_Char(line_two,i+3,GPS_latitude[i]);
                                                }
                                        }                       
                                        Data_legitimate&=~0x01;
                        }       
                        Delay_Ms(500);
                }
        }
}

/*****************************************************************************
串口中斷
/****************************************************************************/
void uart(void) interrupt 4
{
        unsigned char UART_data;
        if(RI)
        {
                UART_data=SBUF;
                switch(UART_data)
                {
                        case '$':
                                GPSDATA_number=0;                //GPS數(shù)據(jù)類型清空
                                GPSDATA_mode=1;                        //接收命令模式
                                GPSDATA_count=0;                //接收位數(shù)清空
                                break;
                       
                        case ',':
                                GPSDOT_count++;                //逗號(hào)計(jì)數(shù)加1
                                GPSDATA_count=0;
                                break;
                       
                        case '*':
                                switch(GPSDATA_number)
                                {
                                        case 1:
                                                Data_legitimate|=0x01;//GPGGA
                                                break;
                                        case 2:
                                                Data_legitimate|=0x02;//GPGSV
                                                break;
                                        case 3:
                                                Data_legitimate|=0x04;//GPRMC
                                                break;
                                }
                                GPSDATA_mode=0;
                                break;
                               
                        default:
                                if(GPSDATA_mode==1)                                                                                                        //類型種類判斷
                                {
                                        GPSDATA_cmd[GPSDATA_count]=UART_data;                        //接收字符放入類型緩存
                                        if(GPSDATA_count==4)                                                                                        //如果類型數(shù)據(jù)接收完畢,判斷類型
                                        {                                                                                       
                                                if(GPSDATA_cmd[0]=='G'&&GPSDATA_cmd[1]=='P'&&GPSDATA_cmd[2]=='G'&&GPSDATA_cmd[3]=='G'&&GPSDATA_cmd[4]=='A')//判斷GPGGA
                                                {
                                                        GPSDATA_number=1;
                                                        GPSDATA_mode=2;
                                                        GPSDOT_count=0;
                                                        GPSDATA_count=0;
                                                }
                                               
                                                if(GPSDATA_cmd[0]=='G'&&GPSDATA_cmd[1]=='P'&&GPSDATA_cmd[2]=='G'&&GPSDATA_cmd[3]=='S'&&GPSDATA_cmd[4]=='V')//判斷GPGSV
                                                {
                                                        GPSDATA_number=2;
                                                        GPSDATA_mode=2;
                                                        GPSDOT_count=0;
                                                        GPSDATA_count=0;
                                                }
                                               
                                                if(GPSDATA_cmd[0]=='G'&&GPSDATA_cmd[1]=='P'&&GPSDATA_cmd[2]=='R'&&GPSDATA_cmd[3]=='M'&&GPSDATA_cmd[4]=='C')//判斷GPRMC
                                                {
                                                        GPSDATA_number=3;
                                                        GPSDATA_mode=2;
                                                        GPSDOT_count=0;
                                                        GPSDATA_count=0;
                                                }
                                               
                                                /****************
                                                ....
                                                其他類型照搬
                                                ****************/
                                               
                                        }
                                }
                                else if(GPSDATA_mode==2)                                        //接收數(shù)據(jù)處理
                                {
                                        switch (GPSDATA_number)
                                        {
                                                case 1:                                                                                                //類型1數(shù)據(jù)接收。GPGGA
                                                        switch(GPSDOT_count)
                                                        {
                                                                case 2:                                                                                //緯度處理
                                                                        if(GPSDATA_count<9)
                                                                                GPS_latitude[GPSDATA_count]=UART_data;
                                                                        break;
                                                                case 3:                                                                                //緯度方向處理
                                                                        if(GPSDATA_count<1)
                                                                                GPS_latitude_dir=UART_data;
                                                                        break;
                                                                case 4:                                                                                //經(jīng)度處理
                                                                        if(GPSDATA_count<10)
                                                                                GPS_longitude[GPSDATA_count]=UART_data;
                                                                        break;
                                                                case 5:                                                                                //經(jīng)度方向處理
                                                                        if(GPSDATA_count<1)
                                                                                GPS_longitude_dir=UART_data;
                                                                        break;
                                                                case 6:                                                                                //定位判斷
                                                                        if(GPSDATA_count<1)
                                                                                GPS_lock=UART_data;
                                                                        break;
                                                                case 7:                                                                                //GPS使用衛(wèi)星個(gè)數(shù)
                                                                        if(GPSDATA_count<2)
                                                                                GPSUSE_satellite[GPSDATA_count]=UART_data;
                                                                        break;
                                                                case 9:                                                                                //海拔高度處理
                                                                        if(GPSDATA_count<6)
                                                                                GPS_altitude[GPSDATA_count]=UART_data;
                                                                        break;
                                                        }
                                                        break;
                                                       
                                                case 2:                                                                                                //類型2數(shù)據(jù)接收。GPGSV
                                                        switch(GPSDOT_count)
                                                        {
                                                                case 3:                                                                                //GPS可見衛(wèi)星個(gè)數(shù)
                                                                        if(GPSDATA_count<2)
                                                                                GPSVISIBLE_satellite[GPSDATA_count]=UART_data;
                                                                        break;
                                                        }
                                                break;
                                                       
                                                case 3:                                                                                                //類型3數(shù)據(jù)接收。GPRMC
                                                        switch(GPSDOT_count)
                                                        {
                                                                case 1:                                                                                //時(shí)間處理
                                                                        if(GPSDATA_count<6)               
                                                                                GPS_time[GPSDATA_count]=UART_data;       
                                                                        break;
                                                                case 2:                                                                                //定位判斷                                               
                                                                        if(GPSDATA_count<1)
                                                                        {
                                                                          if(UART_data=='A')
                                                                                        GPS_lock=1;
                                                                          if(UART_data=='V')
                                                                            GPS_lock=0;
                                                                        }
                                                                        break;
                                                                case 3:                                                                                //緯度處理                                               
                                                                        if(GPSDATA_count<9)
                                                                        {
                                                                                GPS_latitude[GPSDATA_count]=UART_data;
                                                                        }
                                                                        break;
                                                                case 4:                                                                                //緯度方向處理                                               
                                                                        if(GPSDATA_count<1)
                                                                        {
                                                                                GPS_latitude_dir=UART_data;
                                                                        }
                                                                        break;
                                                                case 5:                                                                                //經(jīng)度處理                                               
                                                                        if(GPSDATA_count<10)
                                                                        {
                                                                                GPS_longitude[GPSDATA_count]=UART_data;
                                                                        }
                                                                        break;
                                                                case 6:                                                                                //經(jīng)度方向處理                                               
                                                                        if(GPSDATA_count<1)
                                                                        {
                                                                                GPS_longitude_dir=UART_data;
                                                                        }
                                                                        break;
                                                                case 7:                                                                                //速度處理                                               
                                                                        if(GPSDATA_count<5)
                                                                        {
                                                                                GPS_speed[GPSDATA_count]=UART_data;
                                                                        }
                                                                        break;
                                                                case 8:                                                                                //方位角處理                                               
                                                                        if(GPSDATA_count<5)
                                                                        {
                                                                                GPS_Angle[GPSDATA_count]=UART_data;
                                                                        }
                                                                        break;
                                                                case 9:                                                                                //日期                               
                                                                        if(GPSDATA_count<6)
                                                                        {
                                                                                GPS_date[GPSDATA_count]=UART_data;
                                                                        }
                                                                        break;
                                                        }
                                                        break;
                                        }
                                }
                                GPSDATA_count++;                //接收數(shù)位加1
                                break;
                }
        }
#define LCD1602_DB0_DB7  P0   //1602液晶數(shù)據(jù)端口
sbit LCD1602_RS = P1^0;  //1602液晶指令/數(shù)據(jù)選擇引腳
sbit LCD1602_RW = P1^1;  //1602液晶讀寫引腳
sbit LCD1602_E  = P1^5;  //1602液晶使能引腳
/*****************************************************************************
定義LCD1602指令集 (詳細(xì)請(qǐng)見查看1602指令集手冊(cè))
/****************************************************************************/
#define                        CMD_clear                0x01            // 清除屏幕
#define                        CMD_back                0x02            // DDRAM回零位
#define                        CMD_ac                        0x06            // 讀入后AC(指針)加1,向右寫
#define                        CMD_display                0x0c            // 開顯示_關(guān)光標(biāo)_關(guān)光標(biāo)閃爍
#define                        CMD_set                        0x38            // 8位總線_2行顯示
#define                        line_one                0x80            // 第一行寫入地址
#define                        line_two                0xc0            // 第二行寫入地址

/*****************************************************************************
LCD1602測(cè)忙,若LCD1602處于忙狀態(tài),本函數(shù)將等待至非忙狀態(tài)
/****************************************************************************/
void LCD1602_TestBusy(void)
{
           LCD1602_DB0_DB7 = 0xff;                            //設(shè)備讀狀態(tài)
           LCD1602_RS = 0;
           LCD1602_RW = 1;
           LCD1602_E = 1;
           while(LCD1602_DB0_DB7&0x80);                //等待LCD空閑
           LCD1602_E = 0;                               
}

/*****************************************************************************
寫指令程序
/****************************************************************************/
void LCD1602_WriteCMD(unsigned char LCD1602_command)
{
          LCD1602_TestBusy();
          LCD1602_DB0_DB7 = LCD1602_command;
          LCD1602_RS = 0;
          LCD1602_RW = 0;
          LCD1602_E = 1;
          LCD1602_E = 0;
}

/*****************************************************************************
向LCD1602寫數(shù)據(jù)
/****************************************************************************/
void LCD1602_WriteData(unsigned char  LCD1602_data)
{
        LCD1602_TestBusy();
        LCD1602_DB0_DB7 = LCD1602_data;
          LCD1602_RS = 1;
          LCD1602_RW = 0;
          LCD1602_E = 1;
          LCD1602_E = 0;
}

/*****************************************************************************
打印字符串程序(本函數(shù)調(diào)用指針函數(shù))
向LCD發(fā)送一個(gè)字符串,長度48字符之內(nèi)
在第一行第一位處從左向右打印字符串
/****************************************************************************/
void Print_String(unsigned char  line,unsigned char  *str)
{
        LCD1602_WriteCMD(line);
        while(*str != '\0')
        {
                LCD1602_WriteData(*str++);
        }
        *str = 0;
}

/********************************************************************************************
打印字符程序
向LCD發(fā)送一個(gè)字符,
line為行數(shù)(使用line_one,line_two定義使用),num為位置,data為打印字符
/********************************************************************************************/
void Print_Char (unsigned char line,unsigned char num,unsigned char date)
{
                LCD1602_WriteCMD(line+num);
                LCD1602_WriteData(date);
}

/*****************************************************************************
LCD1602初始化
/****************************************************************************/
void LCD1602_Init(void)
{
          LCD1602_WriteCMD(CMD_set);        // 顯示模式設(shè)置:顯示2行,每個(gè)字符為5*7個(gè)像素
          LCD1602_WriteCMD(CMD_clear);        // 顯示清屏
          LCD1602_WriteCMD(CMD_back);            // 數(shù)據(jù)指針指向第1行第1個(gè)字符位置
          LCD1602_WriteCMD(CMD_ac);            // 顯示光標(biāo)移動(dòng)設(shè)置:文字不動(dòng),光標(biāo)右移
          LCD1602_WriteCMD(CMD_display);         // 顯示開及光標(biāo)設(shè)置:顯示開,光標(biāo)開,閃爍開
}

void Uart_Init(void)               
{
        EA=1;
        ES=1;
        SCON = 0x50;                         
        TMOD = 0x20;
        PCON=0x00;        
        TH1 = 0xFD;       
        TL1 = 0xfd;
        TR1 = 1;       
        RI = 0;       
}

接收數(shù)據(jù)是否完整
1有效
0無效
*****************************/
unsigned char Data_legitimate=0;

/****************************
GPS是否定位
1有效
0無效
*****************************/
unsigned char GPS_lock;

/****************************
GPS使用衛(wèi)星個(gè)數(shù)
*****************************/
unsigned char GPSUSE_satellite[2];

/****************************
GPS可見衛(wèi)星個(gè)數(shù)
*****************************/
unsigned char GPSVISIBLE_satellite[2];

/****************************
GPS數(shù)據(jù)類型
1GPGGA
2GPGSV
3GPRMC
*****************************/
unsigned char GPSDATA_number;

/****************************
GPS數(shù)據(jù)模式
0結(jié)束模式
1類型模式
2數(shù)據(jù)模式
*****************************/
unsigned char GPSDATA_mode;

/****************************
逗號(hào)計(jì)數(shù)器
*****************************/
unsigned char GPSDOT_count;

/****************************
位數(shù)計(jì)數(shù)器
*****************************/
unsigned char GPSDATA_count;       

/****************************
類型模式存儲(chǔ)數(shù)組
*****************************/
unsigned char GPSDATA_cmd[5];               

/****************************
緯度
*****************************/
unsigned char GPS_latitude[9];               

/****************************
緯度方向
*****************************/
unsigned char GPS_latitude_dir;

/****************************
經(jīng)度
*****************************/
unsigned char GPS_longitude[10];

/****************************
經(jīng)度方向
*****************************/
unsigned char GPS_longitude_dir;

/****************************
GPS速度
*****************************/
unsigned char GPS_speed[5]={'0','0','0','.','0'};       

/****************************
海拔高度
*****************************/
unsigned char GPS_altitude[6];       

/****************************
日期
*****************************/
unsigned char GPS_date[6];               

/****************************
時(shí)間
*****************************/
unsigned char GPS_time[6];               

/****************************
方位角
*****************************/
unsigned char GPS_Angle[5]={'0','0','0','0','0'};               

/****************************
方位角
*****************************/
unsigned char OUT_speed[5];


void Delay_Ms (unsigned int a)
{
        unsigned int i;
        while( a-- != 0)
        {
                for(i = 0; i < 600; i++);
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:105648 發(fā)表于 2016-4-12 00:50 | 只看該作者
我也在搞這個(gè), 手里也是顯示不出。。。

聽說前期調(diào)試可以直接用電腦的串口助手之類的仿佛發(fā)假的gps格式的信息,方便定位和debug
回復(fù)

使用道具 舉報(bào)

板凳
ID:84495 發(fā)表于 2016-4-12 09:28 | 只看該作者
如果你的  Print_String(line_one,"  RTrobot GPS");
               Print_String(line_two,"Please Waiting. ")
這兩行可以顯示的話,就是gps波特率不對(duì),,,
先確定你的gps模塊的波特率,一般有4800和9600兩種,可以先在電腦上調(diào)試一下,主要是確定gps模塊是好的,
還有很重要的一點(diǎn)晶振,晶振誤差大可能就跑偏了
回復(fù)

使用道具 舉報(bào)

地板
ID:110866 發(fā)表于 2016-4-12 15:24 | 只看該作者
改下那個(gè)就行的
回復(fù)

使用道具 舉報(bào)

5#
ID:130538 發(fā)表于 2016-8-19 10:24 | 只看該作者
不錯(cuò)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

6#
ID:185537 發(fā)表于 2017-4-2 16:07 | 只看該作者
你現(xiàn)在好了嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:82765 發(fā)表于 2017-4-3 14:12 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

8#
ID:185829 發(fā)表于 2017-4-3 19:34 | 只看該作者
字符格式轉(zhuǎn)換
回復(fù)

使用道具 舉報(bào)

9#
ID:185537 發(fā)表于 2017-4-4 17:02 | 只看該作者
cjjcjj1 發(fā)表于 2017-4-3 14:12
你好!你的GPS出現(xiàn)的什么問題呢

我的也是出現(xiàn)了1602顯示不出來,調(diào)試了調(diào)試了lcd的驅(qū)動(dòng)程序還是不可以顯示
你的現(xiàn)在可以顯示了嗎,可以的話加我qq:975319430 我們一起學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

10#
ID:253599 發(fā)表于 2019-3-9 11:12 | 只看該作者
把P改成N
回復(fù)

使用道具 舉報(bào)

11#
ID:253599 發(fā)表于 2019-3-9 11:29 | 只看該作者
if(GPSDATA_cmd[0]=='G'&&GPSDATA_cmd[1]=='N'&&GPSDATA_cmd[2]=='G'&&GPSDATA_cmd[3]=='G'&&GPSDATA_c
回復(fù)

使用道具 舉報(bào)

12#
ID:253599 發(fā)表于 2019-3-9 11:33 | 只看該作者
我剛剛發(fā)了一個(gè)和你的差不多的,但是可以顯示就是改了兩個(gè)字母,你可以看一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表