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

QQ登錄

只需一步,快速開始

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

51單片機(jī)GPS定位12864顯示程序與原理圖

  [復(fù)制鏈接]
ID:237838 發(fā)表于 2017-10-24 19:58 | 顯示全部樓層 |閱讀模式
系統(tǒng)硬件電路主要有GPS、液晶顯示器、STC12C5A60S2、LED狀態(tài)指示單片機(jī)上電復(fù)位和電源等部分組成。GPS發(fā)送的串行數(shù)據(jù)送至單片機(jī)串行口經(jīng)處理后通過鍵盤選擇要顯示的信息,送至LCD液晶顯示器。LCD液晶顯示器會(huì)定時(shí)更新,更新周期約為1 s。上電復(fù)位電路為單片機(jī)上電提供上電復(fù)位。電源電路為各個(gè)電路提供穩(wěn)定的電源。

電路圖用AD畫的

原理圖截圖

原理圖截圖

0.png

程序截圖

程序截圖


STC12C5A60S2單片機(jī)源程序如下:
  1. #include "STC12C5A.H"
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "string.h"
  5. #include "uart.h"
  6. #include "timer0.h"
  7. #include "key.h"
  8. #include "lcd12864.h"
  9. #include "GPS.h"
  10. #include "GPS_PacketQueue.h"

  11. extern unsigned long Timer0_Count;             // 系統(tǒng)時(shí)基

  12. unsigned char Display_Flag = 0;                          // 顯示界面(0 - 時(shí)間經(jīng)緯度,1 - 速度等)

  13. unsigned char xdata DateTime[7] = {0};                // 時(shí)間和日期緩沖:秒,時(shí),分,日,月,星期,年

  14. /*-------------GPS相關(guān)變量-------- --------------------*/
  15. GPS_INFO   xdata GPS;  
  16. unsigned char GPS_Flag = 0;                 // GPS數(shù)據(jù)有效標(biāo)志

  17. // 函數(shù)聲明
  18. void LCD_Display_DateTime(unsigned char *pDataTime);    // LCD顯示時(shí)間,日期
  19. void LCD_Display_Longitude_Latitude(GPS_INFO *GPS);     // LCD顯示經(jīng)緯度
  20. void LCD_Display_Speed(GPS_INFO *GPS);                  // LCD顯示速度,航向等


  21. /****************************************
  22.         主函數(shù)       
  23. /****************************************/
  24. void main(void)
  25. {       
  26.     char key_value = 0;
  27.            struct timer  Display_Time;
  28.         struct timer  Flag_Time;
  29.         struct timer  Error_Time;
  30.     GPS_PACKET *Packet = NULL;
  31.     memset(&GPS,0,sizeof(GPS));             // 一定要清0
  32.          
  33.         timer_set(&Display_Time, CLOCK_SECOND/5);        // 200ms
  34.         timer_set(&Error_Time,   CLOCK_SECOND*2);        // 2S
  35.         timer_set(&Flag_Time,   CLOCK_SECOND*5);        // 3S
  36.     LCD_Init();   
  37.     GPS_PacketInit();                       // 接收緩沖區(qū)初始化
  38.    
  39.     UART_Init();                            // 初始化UART
  40.     Timer0_Init();                          // 啟動(dòng)定時(shí)器
  41.     while(1)
  42.     {                  
  43.         /*  處理GPS信號(hào) */
  44.         Packet = NULL;
  45.         Packet = (GPS_PACKET *)GPS_GetPacket();

  46.         if( Packet ){      
  47.             timer_restart(&Error_Time);                         // 接收正確更新時(shí)間
  48.             if(Packet->DataType == 1){
  49.                 if(GPS_RMC_Parse(Packet->DataBuffer, &GPS))     // 解析GPRMC     
  50.                 {
  51.                     memset(Packet,0,sizeof(GPS_PACKET));   
  52.                     DateTime[6] = GPS.D.year;
  53.                     DateTime[4] = GPS.D.month;
  54.                     DateTime[3] = GPS.D.day;
  55.                     DateTime[2] = GPS.D.hour;
  56.                     DateTime[1] = GPS.D.minute;
  57.                     DateTime[0] = GPS.D.second;                                       
  58.                     GPS_Flag = 1;
  59.                 }
  60.                 else{                                           // 解析錯(cuò)誤要清空緩沖區(qū)
  61.                     memset(Packet,0,sizeof(GPS_PACKET));
  62.                 }
  63.             }
  64.             else if(Packet->DataType == 2){
  65.                 if(GPS_GGA_Parse(Packet->DataBuffer, &GPS)){               
  66.                     memset(Packet,0,sizeof(GPS_PACKET));
  67.                     GPS_Flag = 1;
  68.                 }
  69.                 else{                                           // 解析錯(cuò)誤要清空緩沖區(qū)
  70.                     memset(Packet,0,sizeof(GPS_PACKET));
  71.                 }
  72.             }
  73.         }
  74.         else{
  75.                         // 接收錯(cuò)誤,且時(shí)長超過100*20ms = 2S,復(fù)位硬件
  76.                         if( timer_expired(&Error_Time) )
  77.                         {                               
  78.                                 UART_Init();
  79.                                 GPS_PacketInit();
  80.                                 timer_restart(&Error_Time);
  81.                                 GPS_Flag = 0;
  82.                         }
  83.         }
  84.                
  85.         
  86.                 if( timer_expired(&Flag_Time) )                         // 切換畫面
  87.         {
  88.                         Display_Flag = ++Display_Flag % 2;
  89.                         LCD_Clear();
  90.                         timer_reset(&Flag_Time);
  91.                 }
  92.                
  93.         if( timer_expired(&Display_Time) )
  94.         {
  95.             timer_reset(&Display_Time);
  96.                        
  97.                         if(GPS_Flag == 0)
  98.                         {
  99.                                 memset(DateTime,0,sizeof(DateTime));
  100.                                 memset(&GPS,0,sizeof(GPS));
  101.                         }
  102.                         if(Display_Flag == 0)
  103.             {
  104.                                 LCD_Display_DateTime(DateTime);                 // 時(shí)間顯示
  105.                                 LCD_Display_Longitude_Latitude(&GPS);                                
  106.            }
  107.                    else
  108.                    {
  109.                 LCD_Display_Speed(&GPS);   
  110.            }
  111.         }
  112.     }       
  113. }

  114. /*
  115.     日期和時(shí)間顯示
  116. */
  117. void LCD_Display_DateTime(unsigned char *pDataTime)
  118. {
  119.     unsigned char temp_buffer[9] = {0};
  120.    
  121.     // 顯示年,月,日
  122.     temp_buffer[0] = pDataTime[6]/10+0x30;
  123.     temp_buffer[1] = pDataTime[6]%10+0x30;   
  124.     Display_String(1,1,"20");
  125.     Display_String(2,1,temp_buffer);   
  126.         Display_String(3,1,"年");

  127.     temp_buffer[0] = pDataTime[4]/10+0x30;
  128.     temp_buffer[1] = pDataTime[4]%10+0x30;
  129.     Display_String(4,1,temp_buffer);   
  130.     Display_String(5,1,"月");

  131.     temp_buffer[0] = pDataTime[3]/10+0x30;
  132.     temp_buffer[1] = pDataTime[3]%10+0x30;
  133.     Display_String(6,1,temp_buffer);
  134.     temp_buffer[8] = '\0';
  135.         Display_String(7,1,"日");       
  136.    
  137.     // 顯示時(shí),分,秒
  138.     temp_buffer[0] = pDataTime[2]/10+0x30;
  139.     temp_buffer[1] = pDataTime[2]%10+0x30;
  140.     temp_buffer[2] = ':';
  141.     temp_buffer[3] = pDataTime[1]/10+0x30;
  142.     temp_buffer[4] = pDataTime[1]%10+0x30;
  143.     temp_buffer[5] = ':';
  144.     temp_buffer[6] = pDataTime[0]/10+0x30;
  145.     temp_buffer[7] = pDataTime[0]%10+0x30;
  146.     temp_buffer[8] = '\0';
  147.     Display_String(1,2,temp_buffer);
  148.    
  149.     // 顯示星期
  150.     switch(DateTime[5]%10 -1)
  151.         {
  152.                 case 0:        Display_String(6,2,"星期日\0");break;
  153.                 case 1:        Display_String(6,2,"星期一\0");break;
  154.                 case 2:        Display_String(6,2,"星期二\0");break;
  155.                 case 3:        Display_String(6,2,"星期三\0");break;
  156.                 case 4: Display_String(6,2,"星期四\0");break;
  157.                 case 5:        Display_String(6,2,"星期五\0");break;
  158.                 case 6:        Display_String(6,2,"星期六\0");break;
  159.                 default: break;
  160.         }
  161. }

  162. /*
  163.     顯示緯度和經(jīng)度
  164. */
  165. void LCD_Display_Longitude_Latitude(GPS_INFO *GPS)
  166. {
  167.     unsigned char ch, i;
  168.     char info[20];
  169.    
  170.     if (GPS->NS == 'N')                                              //判斷是北緯還是南緯
  171.         {
  172.         Display_String(1,3,"北緯");
  173.     }
  174.         else if (GPS->NS == 'S')
  175.     {
  176.         Display_String(1,3,"南緯");
  177.     }

  178.         if (GPS->EW == 'E')                                              //判斷是東經(jīng)還是西經(jīng)
  179.         {
  180.         Display_String(1,4,"東經(jīng)");
  181.     }       
  182.         else if (GPS->EW == 'W')
  183.     {
  184.         Display_String(1,4,"西經(jīng)");
  185.     }

  186.     sprintf(info,":%3d\0",GPS->latitude_Degree);
  187.         LCD_XY(3, 3);
  188.         i = 0;
  189.         while(info[i] != '\0')
  190.         {
  191.                 ch = info[i++];
  192.                 LCD_Write_Data(ch);
  193.         }
  194.         LCD_Write_Data(0xA1);
  195.         LCD_Write_Data(0xE3);

  196.         Int_To_Str(GPS->latitude_Cent, info);   
  197.         i = 0;
  198.         while(info[i] != '\0')
  199.         {
  200.                 ch = info[i++];
  201.                 LCD_Write_Data(ch);
  202.         }
  203.         LCD_Write_Data(0xA1);
  204.         LCD_Write_Data(0xE4);

  205.         Int_To_Str(GPS->latitude_Second, info);
  206.         i = 0;
  207.         while(info[i] != '\0')
  208.         {
  209.                 ch = info[i++];
  210.                 LCD_Write_Data(ch);
  211.         }

  212.     sprintf(info,":%3d\0",GPS->longitude_Degree);
  213.     LCD_XY(3, 4);
  214.         i = 0;
  215.         while(info[i] != '\0')
  216.         {
  217.                 ch = info[i++];
  218.                 LCD_Write_Data(ch);
  219.         }
  220.         LCD_Write_Data(0xA1);
  221.         LCD_Write_Data(0xE3);

  222.         Int_To_Str(GPS->longitude_Cent, info);
  223.         i = 0;
  224.         while(info[i] != '\0')
  225.         {
  226.                 ch = info[i++];
  227.                 LCD_Write_Data(ch);
  228.         }
  229.         LCD_Write_Data(0xA1);
  230.         LCD_Write_Data(0xE4);

  231.         Int_To_Str(GPS->longitude_Second, info);  
  232.         i = 0;
  233.         while(info[i] != '\0')
  234.         {
  235.                 ch = info[i++];
  236.                 LCD_Write_Data(ch);
  237.         }

  238. }

  239. /*
  240.     把浮點(diǎn)數(shù)fla顯示在LCD的坐標(biāo)(x,y)位置
  241. */
  242. void Show_Float(float fla, unsigned char x, unsigned char y)
  243. {
  244.         int integar;
  245.         char Info[10],ch;
  246.         unsigned char i;
  247.        
  248.         LCD_XY(x, y);               
  249.         integar = (int)fla;             // 得到浮點(diǎn)數(shù)的整數(shù)部分
  250.         Int_To_Str(fla, Info);      
  251.         i = 0;
  252.         while(Info[i] !='\0')
  253.         {
  254.                 ch=Info[i++];
  255.                 LCD_Write_Data(ch);
  256.         }
  257.         LCD_Write_Data('.');   
  258.         fla = fla - integar;            // 得到浮點(diǎn)數(shù)的小數(shù)部分      
  259.        
  260.         fla =  fla * 10;                // 小數(shù)位第一位      
  261.         integar = (int)fla;
  262.         fla = fla - integar;            
  263.         ch = integar + 0x30;
  264.         LCD_Write_Data(ch);
  265.        
  266.         fla =  fla*10;                  // 小數(shù)位第二位                  
  267.         integar = (int)fla;
  268.         fla = fla - integar;
  269.         ch = integar + 0x30 ;
  270.     LCD_Write_Data(ch);
  271. }


  272. /*
  273.     顯示速度,航向,海拔
  274. ……………………

  275. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
1. DXP版本原理圖 & PCB.rar (478.27 KB, 下載次數(shù): 291)
3. 程序.rar (172.8 KB, 下載次數(shù): 310)



回復(fù)

使用道具 舉報(bào)

ID:293622 發(fā)表于 2018-3-18 17:20 來自手機(jī) | 顯示全部樓層
為啥出來一片亂碼[驚訝.jpg]
回復(fù)

使用道具 舉報(bào)

ID:293738 發(fā)表于 2018-3-19 16:30 | 顯示全部樓層
以前見過一篇相近的 ,這次有源碼,看看
回復(fù)

使用道具 舉報(bào)

ID:300840 發(fā)表于 2018-5-7 12:05 | 顯示全部樓層
請(qǐng)問這個(gè)程序能用于stc89c52上嗎
回復(fù)

使用道具 舉報(bào)

ID:348732 發(fā)表于 2018-6-10 14:12 | 顯示全部樓層
不是很懂為什么編譯報(bào)錯(cuò)*** ERROR L107: ADDRESS SPACE OVERFLOW
回復(fù)

使用道具 舉報(bào)

ID:373174 發(fā)表于 2018-7-21 19:53 | 顯示全部樓層
樓主用的是什么型號(hào)的gps呢
回復(fù)

使用道具 舉報(bào)

ID:407830 發(fā)表于 2018-10-10 23:38 | 顯示全部樓層
樓主用的是什么型號(hào)的gps呢
回復(fù)

使用道具 舉報(bào)

ID:424298 發(fā)表于 2018-11-10 22:17 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:424298 發(fā)表于 2018-11-10 22:19 | 顯示全部樓層
GPS用的是芯片是什么,是用現(xiàn)成的模塊嗎
回復(fù)

使用道具 舉報(bào)

ID:462450 發(fā)表于 2019-1-5 14:26 | 顯示全部樓層
什么型號(hào)呀
回復(fù)

使用道具 舉報(bào)

ID:148126 發(fā)表于 2019-3-4 16:47 | 顯示全部樓層
這個(gè)有沒有成品
回復(fù)

使用道具 舉報(bào)

ID:417470 發(fā)表于 2019-3-4 17:29 | 顯示全部樓層
成品是啥樣子的?
回復(fù)

使用道具 舉報(bào)

ID:99056 發(fā)表于 2019-4-24 21:45 | 顯示全部樓層
下載來學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:111376 發(fā)表于 2020-1-4 09:00 | 顯示全部樓層
謝謝分享,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:393707 發(fā)表于 2020-4-27 09:00 | 顯示全部樓層
樓主用的是什么型號(hào)的gps呢
回復(fù)

使用道具 舉報(bào)

ID:600952 發(fā)表于 2020-4-27 10:22 | 顯示全部樓層
GPS、液晶顯示器、STC12C5A60S2實(shí)現(xiàn)的51單片機(jī)GPS定位12864顯示,學(xué)習(xí)到了,謝謝分享!
我對(duì)GPS項(xiàng)目比較感興趣,覺得比較高級(jí),問一下樓主用的是什么型號(hào)的gps?新手買什么GPS模塊比較好呢?再問一下可以用舊手機(jī)的GPS模塊連到單片機(jī)上用嗎?
回復(fù)

使用道具 舉報(bào)

ID:47032 發(fā)表于 2021-7-14 22:38 | 顯示全部樓層
GPS都是通知的串口通信,應(yīng)該是不分型號(hào)
回復(fù)

使用道具 舉報(bào)

ID:1111461 發(fā)表于 2024-3-2 19:37 | 顯示全部樓層
謝謝樓主有這么好的程序
回復(fù)

使用道具 舉報(bào)

ID:98880 發(fā)表于 2024-3-12 11:20 | 顯示全部樓層
謝謝了,我分析測試一下?茨苡貌唬
回復(fù)

使用道具 舉報(bào)

ID:98880 發(fā)表于 2024-3-12 11:24 | 顯示全部樓層
12864的主控是什么的?
回復(fù)

使用道具 舉報(bào)

ID:164146 發(fā)表于 2024-3-20 17:18 | 顯示全部樓層
homedou 發(fā)表于 2024-3-12 11:24
12864的主控是什么的?

看代碼,能帶字庫的,大概率是 ST7920,有PSB引腳的
回復(fù)

使用道具 舉報(bào)

ID:229502 發(fā)表于 2024-4-19 18:49 | 顯示全部樓層
準(zhǔn)備做個(gè)gps時(shí)鐘。感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:229502 發(fā)表于 2024-4-19 18:58 | 顯示全部樓層
樓主,沒看到key.c文件?
---
文件夾里看到了。再次感謝
回復(fù)

使用道具 舉報(bào)

ID:688460 發(fā)表于 2024-4-20 08:29 | 顯示全部樓層
編譯通過,0個(gè)錯(cuò)誤,1個(gè)警告。OK
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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