久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2199|回復(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;      //啟動定時器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ù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
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ù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/

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ù)
* 輸出 : 無
***********************************************************************/

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

/********************************************************************
* 名稱 : LCD1602_init()
* 功能 : 1602初始化,請參考1602的資料
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
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)移動設(shè)置
        Write_CMD(0x06); // 顯示開關(guān)、光標(biāo)的設(shè)置
}

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

顯示亂碼

顯示亂碼

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

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

使用道具 舉報

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

使用道具 舉報

ID:773086 發(fā)表于 2020-6-13 10:22 來自手機(jī) | 顯示全部樓層
294479435 發(fā)表于 2020-6-12 16:06
首先確定你的lcd的顯示字符api沒有問題的話,那就是你的gps解析有問題了,看了下你的解析,應(yīng)該是GPS解析有 ...

是要用if來判斷嗎,比如加個
if(GNGGA1[6] ==','&& GNGGA1[17]==',')
{
LCD1602_char(GNGGA1[7]) ;//時
LCD1602_char(GNGGA1[8]);
}
來判斷,因?yàn)榈诹缓偷谑呶皇嵌禾枺缓笞尪禾栔g的數(shù)值顯示?
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲影音先锋 | 久久精品亚洲欧美日韩久久 | 国产一级在线观看 | 国产亚洲黄色片 | 久久精品国产一区二区电影 | 亚洲人人 | 性色视频在线观看 | 91久久精品国产91久久性色tv | 麻豆av在线免费观看 | 欧美看片 | 综合视频在线 | 久久婷婷香蕉热狠狠综合 | 精品欧美一区二区精品久久久 | 欧美一级二级在线观看 | 亚洲视频一区二区三区 | www.久久国产精品 | 亚洲精品一区二区网址 | 国产激情免费视频 | 国产又爽又黄的视频 | 日韩中文字幕免费在线观看 | 黑人精品| 欧美亚洲国产日韩 | 亚洲精品免费视频 | 国产精品久久久久久久久久久久 | 欧美天堂| 精品99在线 | 中文字幕国产精品视频 | 精品日韩在线 | 欧美日韩一区二区在线 | 免费黄色大片 | 日本国产精品视频 | 国产精品久久影院 | 欧美一级免费片 | 久久久999精品 | 小视频你懂得 | www久久av| 日韩欧美国产电影 | 亚洲一区二区黄 | 黄色片免费| 久久久久国产精品 | 亚洲天堂中文字幕 |