欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

搜索
查看: 2523|回復(fù): 5
收起左側(cè)

求助,單片機(jī)+GPS顯示到LCD亂碼

[復(fù)制鏈接]
ID:773086 發(fā)表于 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]);//衛(wèi)星數(shù)量
               
               
          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;      //允許串口接收數(shù)據(jù)
        PCON=0x00;  
        TMOD=0x20;  //T1方式2
        TH1=0xFD;   //裝初值
        TL1=0xFD;
        TR1=1;      //啟動(dòng)定時(shí)器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延時(shí)函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void LCD1602_Delay()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=20; j++)
;
}

/********************************************************************
* 名稱 : Write_CMD(unsigned char del)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無(wú)
***********************************************************************/

void Write_CMD(unsigned char del)         //寫指令   輸入:RS=L;Rw=L;                          
{                                                //        D0~D7= 指令碼,E=高脈沖;
        LCD_PORT = del;                         //輸出:D0~D7=數(shù)據(jù)
        RS = 0;
        RW = 0;
        E = 0;
        LCD1602_Delay();
        E = 1;
        LCD1602_Delay();
}


/********************************************************************
* 名稱 : Write_DAT(unsigned char del)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/

void Write_DAT(unsigned char del)  //寫數(shù)據(jù)  輸入:RS=H;RW=L;
{
        LCD_PORT = del;                   //D0~D7=數(shù)據(jù);E=高脈沖
        RS = 1;
        RW = 0;                           //輸出:無(wú)
        E = 0;
        LCD1602_Delay();
        E = 1;
        LCD1602_Delay();
}

/********************************************************************
* 名稱 : LCD1602_init()
* 功能 : 1602初始化,請(qǐng)參考1602的資料
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void LCD1602_Init(void)
{
        Write_CMD(0x01); //顯示模式設(shè)置 ,設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口  
        Write_CMD(0x38); //顯示清0
        Write_CMD(0x38);
        Write_CMD(0x0c); //顯示光標(biāo)移動(dòng)設(shè)置
        Write_CMD(0x06); // 顯示開關(guān)、光標(biāo)的設(shè)置
}

/********************************************************************
* 名稱 : LCD1602_char(unsigned char hang,unsigned char lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第0行,第5個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
                 LCD1602_char(0,5,'b')
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
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);//調(diào)用寫指令函數(shù)
        Write_DAT(dat);//調(diào)用寫數(shù)據(jù)函數(shù)
}

/********************************************************************
* 名稱 : LCD1602_string(unsigned char hang,unsigned char lie,unsigned char *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
                  LCD1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void LCD1602_string(unsigned char hang,unsigned char lie,unsigned char *p)
{
        unsigned char a;
        if(hang == 0) a = 0x80;//0x80代表第一行第一個(gè)字
        if(hang == 1) a = 0xc0;         //        代表第二行的第五個(gè)字
        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)
* 功能 : 如果要讓第一行,第五個(gè)字符顯示整數(shù)99 ,調(diào)用該函數(shù)如下
                 LCD1602_2num(1,5,99)
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
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'); //個(gè)位
}

顯示亂碼

顯示亂碼

設(shè)置有一個(gè)歡迎界面,把GPS模塊的發(fā)送端接到單片機(jī)的接收端,如果監(jiān)測(cè)到信號(hào)進(jìn)來(lái)就跳轉(zhuǎn)到顯示頁(yè)面

設(shè)置有一個(gè)歡迎界面,把GPS模塊的發(fā)送端接到單片機(jī)的接收端,如果監(jiān)測(cè)到信號(hào)進(jìn)來(lái)就跳轉(zhuǎn)到顯示頁(yè)面
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
ID:73435 發(fā)表于 2020-6-12 16:06 | 顯示全部樓層
首先確定你的lcd的顯示字符api沒(méi)有問(wèn)題的話,那就是你的gps解析有問(wèn)題了,看了下你的解析,應(yīng)該是GPS解析有誤吧,時(shí)間不可能固定在數(shù)組的第幾位,需要根據(jù)逗號(hào)“,”來(lái)分別解析經(jīng)緯度和時(shí)間
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
ID:773086 發(fā)表于 2020-6-13 10:22 來(lái)自觸屏版 | 顯示全部樓層
294479435 發(fā)表于 2020-6-12 16:06
首先確定你的lcd的顯示字符api沒(méi)有問(wèn)題的話,那就是你的gps解析有問(wèn)題了,看了下你的解析,應(yīng)該是GPS解析有 ...

是要用if來(lái)判斷嗎,比如加個(gè)
if(GNGGA1[6] ==','&& GNGGA1[17]==',')
{
LCD1602_char(GNGGA1[7]) ;//時(shí)
LCD1602_char(GNGGA1[8]);
}
來(lái)判斷,因?yàn)榈诹缓偷谑呶皇嵌禾?hào),然后讓逗號(hào)之間的數(shù)值顯示?
回復(fù)

使用道具 舉報(bào)

ID:59076 發(fā)表于 2020-6-13 11:51 | 顯示全部樓層
用仿真器看GPS收到的數(shù)據(jù),這樣調(diào)試起來(lái)比較快
回復(fù)

使用道具 舉報(bào)

ID:773086 發(fā)表于 2020-6-13 19:26 | 顯示全部樓層
lyq130 發(fā)表于 2020-6-13 11:51
用仿真器看GPS收到的數(shù)據(jù),這樣調(diào)試起來(lái)比較快

GPS不懂怎么仿真。。。
回復(fù)

使用道具 舉報(bào)

ID:73435 發(fā)表于 2020-6-15 10:13 | 顯示全部樓層
Patrick6277 發(fā)表于 2020-6-13 10:22
是要用if來(lái)判斷嗎,比如加個(gè)
if(GNGGA1[6] ==','&& GNGGA1[17]==',')
{

不要固定逗號(hào)位置,要用strstr來(lái)查找到逗號(hào)開始解析;
比如下面的GPS數(shù)據(jù),第一個(gè)逗號(hào)后面是什么數(shù)據(jù),第二個(gè)逗號(hào)后面是緯度,第三個(gè)逗號(hào)后面是南北,第四個(gè)逗號(hào)后面是經(jīng)度,第五個(gè)逗號(hào)后面是東西,依次類推,不能固定數(shù)組第幾個(gè)位是什么數(shù)據(jù)
$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
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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