找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1757|回复: 5
收起左侧

求助,单片机+GPS显示到LCD乱码

[复制链接]
ID:773086 发表于 2020-6-12 12:51 | 显示全部楼层 |阅读模式
/***********************************main.c***********************************/
#include <reg51.h>
#include "lcd1602.h"
#include "gps.h"
#include "delay.h"


bit flag_GPS_OK =0;
bit xianshi = 0;
bit yemian=0;


void main(void)
{
        
        LCD1602_Init();
  Write_CMD(0x80);
  LCD1602_string(0,2,"welcome");
        Delay_xms(1000);
  CK(); //串口初始化
        
        while(1)
        {
          if(GPS_OK==1)
    {
                        if( GNGGA[0]=='$'
                  && GNGGA[1]=='G'
                  && GNGGA[2]=='N'
                  && GNGGA[3]=='G'
                  && GNGGA[4]=='G'  
                  && GNGGA[5]=='A')//判断是否收到GNGGA
                {
                                       
hour=(GNGGA[7])*10+(GNGGA[8])+8;                        
                        
                if(hour>=24)
                {
                hour=hour%24;
                }
               
                min=(GNGGA[9])+(GNGGA[10]);
                sec=(GNGGA[11])+(GNGGA[12]);
               
          hour_high=GNGGA[7];
                hour_low=GNGGA[8];
               
               
                min_high=GNGGA[9];
                min_low=GNGGA[10];
               
                sec_high=GNGGA[11];
                sec_high=GNGGA[12];

        }
                        
                        
               
        
        LCD1602_char(0,1,hour_high);
        LCD1602_char(0,2,hour_low);
        LCD1602_char(0,3,'-');
               
        LCD1602_char(0,4,min_high);
        LCD1602_char(0,5,min_low);
        LCD1602_char(0,6,'-');
        
        LCD1602_char(0,7,sec_high);
        LCD1602_char(0,8,sec_low);
        
        
        LCD1602_char(0,10,GNGGA[52]);
        LCD1602_char(0,11,GNGGA[53]);//卫星数量
               
               
          LCD1602_char(1,0,GNGGA[18]); //纬度
          LCD1602_char(1,1,GNGGA[19]);
                LCD1602_char(1,2,GNGGA[20]);
                LCD1602_char(1,3,GNGGA[21]);
                LCD1602_char(1,4,GNGGA[22]);
                LCD1602_char(1,5,GNGGA[23]);
                LCD1602_char(1,6,GNGGA[24]);
                LCD1602_char(1,7,GNGGA[25]);
                LCD1602_char(1,8,GNGGA[26]);
                LCD1602_char(1,9,GNGGA[28]);  //N或者S
                LCD1602_char(1,12,GNGGA[43]);//定位是否成功判断位

    }
        }
}

/*********************************************gps.c*********************************************/
#include "gps.h"

/*****定义变量*****/
unsigned char count;
unsigned char hour,min,sec,min_high,min_low,sec_high,sec_low,hour_high,hour_low;

void CK()  
{
  SCON=0x50;
        REN=1;      //允许串口接收数据
        PCON=0x00;  
        TMOD=0x20;  //T1方式2
        TH1=0xFD;   //装初值
        TL1=0xFD;
        TR1=1;      //启动定时器1
        EA=1;       //总中断允许
        ES=1;       //打开串口中断
}

unsigned temp,i;
unsigned char GNGGA[73];
unsigned char xdata GNGGA1[73]={0};
bit GPS_OK=0;
void ZD(void) interrupt 4 using 3
{
  if(RI)
        {
        temp=SBUF;
                if(temp=='$')
                {
                GNGGA[count++]=temp;
                }
                if(temp=='*')
                {
                for(i=0;i<count;i++)
                        {
                        GNGGA1=GNGGA;
}
count=0;
                        GPS_OK=1;
                }
                RI=0;
        }
}        



/**********************************LCD1602.c*******************************/
#include <reg51.h>
#include "lcd1602.h"

/********************************************************************
* 名称 : LCD1602_Delay()
* 功能 : 1602延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_Delay()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=20; j++)
;
}

/********************************************************************
* 名称 : Write_CMD(unsigned char del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/

void Write_CMD(unsigned char del)         //写指令   输入:RS=L;Rw=L;                          
{                                                //        D0~D7= 指令码,E=高脉冲;
        LCD_PORT = del;                         //输出:D0~D7=数据
        RS = 0;
        RW = 0;
        E = 0;
        LCD1602_Delay();
        E = 1;
        LCD1602_Delay();
}


/********************************************************************
* 名称 : Write_DAT(unsigned char del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void Write_DAT(unsigned char del)  //写数据  输入:RS=H;RW=L;
{
        LCD_PORT = del;                   //D0~D7=数据;E=高脉冲
        RS = 1;
        RW = 0;                           //输出:无
        E = 0;
        LCD1602_Delay();
        E = 1;
        LCD1602_Delay();
}

/********************************************************************
* 名称 : LCD1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_Init(void)
{
        Write_CMD(0x01); //显示模式设置 ,设置16*2显示,5*7点阵,8位数据接口  
        Write_CMD(0x38); //显示清0
        Write_CMD(0x38);
        Write_CMD(0x0c); //显示光标移动设置
        Write_CMD(0x06); // 显示开关、光标的设置
}

/********************************************************************
* 名称 : LCD1602_char(unsigned char hang,unsigned char lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第0行,第5个字符显示"b" ,调用该函数如下
                 LCD1602_char(0,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_char(unsigned char hang,unsigned char lie,char dat)
{
        unsigned char a;
        if(hang == 0) a = 0x80;
        if(hang == 1) a = 0xc0;
        a = a + lie;
        Write_CMD(a);//调用写指令函数
        Write_DAT(dat);//调用写数据函数
}

/********************************************************************
* 名称 : LCD1602_string(unsigned char hang,unsigned char lie,unsigned char *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
                  LCD1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_string(unsigned char hang,unsigned char lie,unsigned char *p)
{
        unsigned char a;
        if(hang == 0) a = 0x80;//0x80代表第一行第一个字
        if(hang == 1) a = 0xc0;         //        代表第二行的第五个字
        a = a + lie ;
        Write_CMD(a);
        while(1)
        {
                if(*p == '\0') break;
                Write_DAT(*p);
                p++;
        }
}
/********************************************************************
* 名称 : LCD1602_num(unsigned char hang,unsigned char lie,unsigned int dat)
* 功能 : 如果要让第一行,第五个字符显示整数99 ,调用该函数如下
                 LCD1602_2num(1,5,99)
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_num(unsigned char hang,unsigned char lie,unsigned int dat)
{
        LCD1602_char( hang,lie,dat%10+'0');
        //LCD1602_char( hang,lie,dat+'0'); //个位
}

显示乱码

显示乱码

设置有一个欢迎界面,把GPS模块的发送端接到单片机的接收端,如果监测到信号进来就跳转到显示页面

设置有一个欢迎界面,把GPS模块的发送端接到单片机的接收端,如果监测到信号进来就跳转到显示页面
回复

使用道具 举报

ID:73435 发表于 2020-6-12 16:06 | 显示全部楼层
首先确定你的lcd的显示字符api没有问题的话,那就是你的gps解析有问题了,看了下你的解析,应该是GPS解析有误吧,时间不可能固定在数组的第几位,需要根据逗号“,”来分别解析经纬度和时间
回复

使用道具 举报

ID:773086 发表于 2020-6-13 10:22 来自手机 | 显示全部楼层
294479435 发表于 2020-6-12 16:06
首先确定你的lcd的显示字符api没有问题的话,那就是你的gps解析有问题了,看了下你的解析,应该是GPS解析有 ...

是要用if来判断吗,比如加个
if(GNGGA1[6] ==','&& GNGGA1[17]==',')
{
LCD1602_char(GNGGA1[7]) ;//时
LCD1602_char(GNGGA1[8]);
}
来判断,因为第六位和第十七位是逗号,然后让逗号之间的数值显示?
回复

使用道具 举报

ID:59076 发表于 2020-6-13 11:51 | 显示全部楼层
用仿真器看GPS收到的数据,这样调试起来比较快
回复

使用道具 举报

ID:773086 发表于 2020-6-13 19:26 | 显示全部楼层
lyq130 发表于 2020-6-13 11:51
用仿真器看GPS收到的数据,这样调试起来比较快

GPS不懂怎么仿真。。。
回复

使用道具 举报

ID:73435 发表于 2020-6-15 10:13 | 显示全部楼层
Patrick6277 发表于 2020-6-13 10:22
是要用if来判断吗,比如加个
if(GNGGA1[6] ==','&& GNGGA1[17]==',')
{

不要固定逗号位置,要用strstr来查找到逗号开始解析;
比如下面的GPS数据,第一个逗号后面是什么数据,第二个逗号后面是纬度,第三个逗号后面是南北,第四个逗号后面是经度,第五个逗号后面是东西,依次类推,不能固定数组第几个位是什么数据
$GNGGA,045625.000,3033.74024,N,10405.67012,E,1,07,2.6,446.2,M,0.0,M,,*71
$GNGLL,3033.74024,N,10405.67012,E,045625.000,A,A*43
$GPGSA,A,3,11,17,28,195,,,,,,,,,3.9,2.6,2.9*06
$BDGSA,A,3,07,10,12,,,,,,,,,,3.9,2.6,2.9*23
$GPGSV,4,1,13,01,,,36,03,26,107,,06,17,213,,07,26,180,*41
$GPGSV,4,2,13,11,16,049,33,17,48,298,19,19,30,275,,22,25,079,*74
$GPGSV,4,3,13,28,62,347,21,30,49,211,,193,,,14,194,41,140,03*4C
$GPGSV,4,4,13,195,56,061,33*72
$BDGSV,1,1,03,07,63,101,29,10,78,009,23,12,53,023,31*52
$GNRMC,045625.000,A,3033.74024,N,10405.67012,E,0.00,44.16,060620,,,A*41
$GNVTG,44.16,T,,M,0.00,N,0.00,K,A*14
$GNZDA,045625.000,06,06,2020,00,00*48
$GPTXT,01,01,01,ANTENNA OK*35
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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