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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16298|回復: 23
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
系統硬件電路主要有GPS、液晶顯示器、STC12C5A60S2、LED狀態指示單片機上電復位和電源等部分組成。GPS發送的串行數據送至單片機串行口經處理后通過鍵盤選擇要顯示的信息,送至LCD液晶顯示器。LCD液晶顯示器會定時更新,更新周期約為1 s。上電復位電路為單片機上電提供上電復位。電源電路為各個電路提供穩定的電源。

電路圖用AD畫的




STC12C5A60S2單片機源程序如下:
  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;             // 系統時基

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

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

  14. /*-------------GPS相關變量-------- --------------------*/
  15. GPS_INFO   xdata GPS;  
  16. unsigned char GPS_Flag = 0;                 // GPS數據有效標志

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


  21. /****************************************
  22.         主函數       
  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();                       // 接收緩沖區初始化
  38.    
  39.     UART_Init();                            // 初始化UART
  40.     Timer0_Init();                          // 啟動定時器
  41.     while(1)
  42.     {                  
  43.         /*  處理GPS信號 */
  44.         Packet = NULL;
  45.         Packet = (GPS_PACKET *)GPS_GetPacket();

  46.         if( Packet ){      
  47.             timer_restart(&Error_Time);                         // 接收正確更新時間
  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{                                           // 解析錯誤要清空緩沖區
  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{                                           // 解析錯誤要清空緩沖區
  70.                     memset(Packet,0,sizeof(GPS_PACKET));
  71.                 }
  72.             }
  73.         }
  74.         else{
  75.                         // 接收錯誤,且時長超過100*20ms = 2S,復位硬件
  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);                 // 時間顯示
  105.                                 LCD_Display_Longitude_Latitude(&GPS);                                
  106.            }
  107.                    else
  108.                    {
  109.                 LCD_Display_Speed(&GPS);   
  110.            }
  111.         }
  112.     }       
  113. }

  114. /*
  115.     日期和時間顯示
  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.     // 顯示時,分,秒
  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.     顯示緯度和經度
  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')                                              //判斷是東經還是西經
  179.         {
  180.         Display_String(1,4,"東經");
  181.     }       
  182.         else if (GPS->EW == 'W')
  183.     {
  184.         Display_String(1,4,"西經");
  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.     把浮點數fla顯示在LCD的坐標(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;             // 得到浮點數的整數部分
  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;            // 得到浮點數的小數部分      
  259.        
  260.         fla =  fla * 10;                // 小數位第一位      
  261.         integar = (int)fla;
  262.         fla = fla - integar;            
  263.         ch = integar + 0x30;
  264.         LCD_Write_Data(ch);
  265.        
  266.         fla =  fla*10;                  // 小數位第二位                  
  267.         integar = (int)fla;
  268.         fla = fla - integar;
  269.         ch = integar + 0x30 ;
  270.     LCD_Write_Data(ch);
  271. }


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

  275. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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



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

使用道具 舉報

沙發
ID:293622 發表于 2018-3-18 17:20 來自手機 | 只看該作者
為啥出來一片亂碼[驚訝.jpg]
回復

使用道具 舉報

板凳
ID:293738 發表于 2018-3-19 16:30 | 只看該作者
以前見過一篇相近的 ,這次有源碼,看看
回復

使用道具 舉報

地板
ID:300840 發表于 2018-5-7 12:05 | 只看該作者
請問這個程序能用于stc89c52上嗎
回復

使用道具 舉報

5#
ID:348732 發表于 2018-6-10 14:12 | 只看該作者
不是很懂為什么編譯報錯*** ERROR L107: ADDRESS SPACE OVERFLOW
回復

使用道具 舉報

6#
ID:373174 發表于 2018-7-21 19:53 | 只看該作者
樓主用的是什么型號的gps呢
回復

使用道具 舉報

7#
ID:407830 發表于 2018-10-10 23:38 | 只看該作者
樓主用的是什么型號的gps呢
回復

使用道具 舉報

8#
ID:424298 發表于 2018-11-10 22:17 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:424298 發表于 2018-11-10 22:19 | 只看該作者
GPS用的是芯片是什么,是用現成的模塊嗎
回復

使用道具 舉報

10#
ID:462450 發表于 2019-1-5 14:26 | 只看該作者
什么型號呀
回復

使用道具 舉報

11#
ID:148126 發表于 2019-3-4 16:47 | 只看該作者
這個有沒有成品
回復

使用道具 舉報

12#
ID:417470 發表于 2019-3-4 17:29 | 只看該作者
成品是啥樣子的?
回復

使用道具 舉報

13#
ID:99056 發表于 2019-4-24 21:45 | 只看該作者
下載來學習學習
回復

使用道具 舉報

14#
ID:111376 發表于 2020-1-4 09:00 | 只看該作者
謝謝分享,學習了
回復

使用道具 舉報

15#
ID:393707 發表于 2020-4-27 09:00 | 只看該作者
樓主用的是什么型號的gps呢
回復

使用道具 舉報

16#
ID:600952 發表于 2020-4-27 10:22 | 只看該作者
GPS、液晶顯示器、STC12C5A60S2實現的51單片機GPS定位12864顯示,學習到了,謝謝分享!
我對GPS項目比較感興趣,覺得比較高級,問一下樓主用的是什么型號的gps?新手買什么GPS模塊比較好呢?再問一下可以用舊手機的GPS模塊連到單片機上用嗎?
回復

使用道具 舉報

17#
ID:47032 發表于 2021-7-14 22:38 | 只看該作者
GPS都是通知的串口通信,應該是不分型號
回復

使用道具 舉報

18#
ID:1111461 發表于 2024-3-2 19:37 | 只看該作者
謝謝樓主有這么好的程序
回復

使用道具 舉報

19#
ID:98880 發表于 2024-3-12 11:20 | 只看該作者
謝謝了,我分析測試一下。看能用不?
回復

使用道具 舉報

20#
ID:98880 發表于 2024-3-12 11:24 | 只看該作者
12864的主控是什么的?
回復

使用道具 舉報

21#
ID:164146 發表于 2024-3-20 17:18 | 只看該作者
homedou 發表于 2024-3-12 11:24
12864的主控是什么的?

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

使用道具 舉報

22#
ID:229502 發表于 2024-4-19 18:49 | 只看該作者
準備做個gps時鐘。感謝樓主
回復

使用道具 舉報

23#
ID:229502 發表于 2024-4-19 18:58 | 只看該作者
樓主,沒看到key.c文件?
---
文件夾里看到了。再次感謝
回復

使用道具 舉報

24#
ID:688460 發表于 2024-4-20 08:29 | 只看該作者
編譯通過,0個錯誤,1個警告。OK
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: h片在线观看网站 | 日韩精品一区二区三区 | 精品国产乱码久久久久久蜜臀 | 欧美视频免费 | 欧美综合久久 | 欧美激情精品久久久久久变态 | 免费黄色片在线观看 | aaa大片免费观看 | 欧美中文在线 | 久久国产婷婷国产香蕉 | 91精品久久久久久久久久小网站 | 99久久精品免费看国产免费软件 | 久久久激情视频 | 欧美日韩1区2区 | 国产日韩欧美精品一区二区三区 | 日韩在线一区二区三区 | 成人在线播放 | av毛片| 欧美性大战xxxxx久久久 | 久久五月婷 | 亚洲精品天堂 | 国产高清精品在线 | 婷婷在线视频 | 视频三区 | 欧美bondage紧缚视频 | 精品国产91 | 污污免费网站 | 婷婷毛片 | 97高清国语自产拍 | 九九热免费看 | 狠狠干网站 | 99久久精品免费看国产免费软件 | 精品成人一区二区 | a级片在线观看 | 久久国产免费看 | 逼逼视频| 亚洲精品乱码8久久久久久日本 | 久久久久久蜜桃一区二区 | 国产精品一区二区在线免费观看 | 欧美大片一区二区 | 国产精品一区二区三区在线 |