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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機GPS定位LCD1602液晶顯示經緯度海拔及時間日期的實物制作

  [復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次(中獎概率 30%)
跳轉到指定樓層
樓主
此貼與我上一帖所用元器件一樣,只是對程序做了改進,加了一個切屏按鍵,附上原理圖
原理圖.pdf (83.78 KB, 下載次數: 255)

制作出來的實物圖如下:


單片機源程序如下:
  1. #include "main.h"
  2. #include "LCD1602.h"
  3. #include "GPS.h"

  4. //定義變量
  5. unsigned char KEY_NUM = 0;
  6. bit Page = 0;
  7. unsigned char xdata Display_GPGGA_Buffer[68];
  8. unsigned char xdata Display_GPRMC_Buffer[68];
  9. bit Flag_OV = 0;
  10. bit Flag_Calc_GPGGA_OK = 0;
  11. bit Flag_Calc_GPRMC_OK = 0;

  12. //****************************************************
  13. //主函數
  14. //****************************************************
  15. void main()
  16. {
  17.         unsigned char i = 0;
  18.         Init_LCD1602();
  19.         LCD1602_write_com(0x80);                                                //指針設置
  20.         LCD1602_write_word("Welcome to use!");

  21.         Delay_ms(1000);


  22.         Uart_Init();

  23.         while(1)
  24.         {
  25.                 Scan_Key();
  26.                 if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')                        //確定是否收到"GPGGA"這一幀數據
  27.                 {
  28.                         for( i = 0; i < 68 ; i++)
  29.                         {
  30.                                 Display_GPGGA_Buffer[i] = RX_Buffer[i];        
  31.                         }
  32.                         Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8;                        //UTC時間轉換到北京時間                UTC+8
  33.                                                                                                                                                                                                 //0x30為ASCII轉換為數字
  34.                         if( Hour >= 24)                                //溢出
  35.                         {
  36.                                 Hour %= 24;                                //獲取當前Hour
  37.                                 Flag_OV = 1;                        //日期進位
  38.                         }
  39.                         else
  40.                         {
  41.                                 Flag_OV = 0;
  42.                         }

  43.                         Min_High = Display_GPGGA_Buffer[9];
  44.                         Min_Low = Display_GPGGA_Buffer[10];
  45.         
  46.                         Sec_High = Display_GPGGA_Buffer[11];
  47.                         Sec_Low = Display_GPGGA_Buffer[12];

  48.                         Flag_Calc_GPGGA_OK = 1;
  49.                 }

  50.                 if(Page == 0 && Flag_Calc_GPGGA_OK == 1)
  51.                 {
  52.                         LED1 = ~LED1;
  53.                         Flag_Calc_GPGGA_OK = 0;
  54.                         LCD1602_write_com(0x80);                        //設置指針
  55.                         LCD1602_write_data(Hour/10+0x30);
  56.                         LCD1602_write_data(Hour%10+0x30);

  57.                         LCD1602_write_data(':');

  58.                         LCD1602_write_data(Min_High);
  59.                         LCD1602_write_data(Min_Low);

  60.                         LCD1602_write_data(':');
  61.         
  62.                         LCD1602_write_data(Sec_High);
  63.                         LCD1602_write_data(Sec_Low);

  64.                         LCD1602_write_word("  ");
  65.                         
  66.                         LCD1602_write_data(Display_GPGGA_Buffer[54]);        
  67.                         LCD1602_write_data(Display_GPGGA_Buffer[55]);        
  68.                         LCD1602_write_data(Display_GPGGA_Buffer[56]);        
  69.                         LCD1602_write_data(Display_GPGGA_Buffer[57]);
  70.                         LCD1602_write_word("m");
  71.         
  72.                         LCD1602_write_com(0x80+0x40);                        //設置指針
  73.                         
  74.                         LCD1602_write_data(Display_GPGGA_Buffer[28]);                        //N 或者 S

  75.                         LCD1602_write_data(Display_GPGGA_Buffer[17]);                        //緯度
  76.                         LCD1602_write_data(Display_GPGGA_Buffer[18]);                        //緯度
  77.                         LCD1602_write_data(0xdf);                                                                //度
  78.                         LCD1602_write_data(Display_GPGGA_Buffer[19]);                        //緯度
  79.                         LCD1602_write_data(Display_GPGGA_Buffer[20]);                        //緯度
  80.                         LCD1602_write_word("'");                                                                //秒
  81.                         
  82.                         LCD1602_write_data(Display_GPGGA_Buffer[42]);                        //E 或者 W

  83.                         LCD1602_write_data(Display_GPGGA_Buffer[30]);                        //經度
  84.                         LCD1602_write_data(Display_GPGGA_Buffer[31]);        
  85.                         LCD1602_write_data(Display_GPGGA_Buffer[32]);        
  86.                         LCD1602_write_data(0xdf);                                                               
  87.                         LCD1602_write_data(Display_GPGGA_Buffer[33]);                        
  88.                         LCD1602_write_data(Display_GPGGA_Buffer[34]);               
  89.                         LCD1602_write_word("'");

  90.                                                 
  91.                 }
  92.                
  93.                 if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',')                        //確定是否收到"GPRMC"這一幀數據
  94.                 {
  95.                         for( i = 0; i < 68 ; i++)
  96.                         {
  97.                                 Display_GPRMC_Buffer[i] = RX_Buffer[i];        
  98.                         }

  99.                         Year_High = Display_GPRMC_Buffer[57];
  100.                         Year_Low = Display_GPRMC_Buffer[58];

  101.                         Month_High = Display_GPRMC_Buffer[55];
  102.                         Month_Low = Display_GPRMC_Buffer[56];

  103.                         Day_High = Display_GPRMC_Buffer[53];
  104.                         Day_Low = Display_GPRMC_Buffer[54];


  105.                         if(Flag_OV == 1)                        //有進位
  106.                         {
  107.                                 UTCDate2LocalDate();                        //UTC日期轉換為北京時間               
  108.                         }

  109.                         Flag_Calc_GPRMC_OK = 1;
  110.                 }

  111.                 if(Page == 1 && Flag_Calc_GPRMC_OK == 1)
  112.                 {
  113.                         LED1 = ~LED1;
  114.                         Flag_Calc_GPRMC_OK = 0;
  115.                         LCD1602_write_com(0x80);                        //設置指針
  116.                         LCD1602_write_word("20");
  117.                         LCD1602_write_data(Year_High);
  118.                         LCD1602_write_data(Year_Low);
  119.                         LCD1602_write_data('-');
  120.         
  121.                         LCD1602_write_data(Month_High);
  122.                         LCD1602_write_data(Month_Low);
  123.                         LCD1602_write_data('-');
  124.         
  125.                         LCD1602_write_data(Day_High);
  126.                         LCD1602_write_data(Day_Low);
  127.                         
  128.                         
  129.                         LCD1602_write_com(0x80+0x40);                        //設置指針
  130.                         LCD1602_write_word("Speed:");                                //顯示內容

  131.                         LCD1602_write_data(Display_GPRMC_Buffer[46]);               
  132.                         LCD1602_write_data(Display_GPRMC_Buffer[47]);               
  133.                         LCD1602_write_data(Display_GPRMC_Buffer[48]);                        
  134.                         LCD1602_write_data(Display_GPRMC_Buffer[49]);        
  135.                         LCD1602_write_data(Display_GPRMC_Buffer[50]);
  136.                         
  137.                         LCD1602_write_word("m/s");                                
  138.                 }               
  139.         }
  140. }
  141. //****************************************************
  142. //UTC日期與當地日期轉換
  143. //****************************************************
  144. void UTCDate2LocalDate(void)
  145. {
  146.         Day = (Day_High - 0x30) * 10 + (Day_Low-0x30) + 1;                //日  加一
  147.         Month = (Month_High - 0x30) * 10 + (Month_Low - 0x30);
  148.         Year = 2000 + (Year_High - 0x30) * 10 + (Year_Low - 0x30);
  149.         
  150.         MaxDay = GetMaxDay(Month,Year);                                //獲取當月 天數 最大值
  151.         if(Day > MaxDay)                //溢出
  152.         {
  153.                 Day = 1;
  154.                 Month += 1;
  155.                 if(Month > 12)
  156.                 {
  157.                         Year+=1;
  158.                 }
  159.         }

  160.         Day_High = Day/10 + 0x30;                                //轉換日期值為ASCII
  161.         Day_Low = Day%10 + 0x30;

  162.         Month_High = Month/10 + 0x30;                        //轉換月份值為ASCII
  163.         Month_Low = Month%10 + 0x30;

  164.         Year_High = Year%100/10 + 0x30;                        //轉換年份值為ASCII
  165.         Year_Low = Year%10 + 0x30;                        
  166. }

  167. //****************************************************
  168. //獲取當月日期最大值
  169. //****************************************************
  170. unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value)
  171. {
  172.         unsigned char iDays;
  173.         switch(Month_Value)
  174.         {
  175.                 case 1:
  176.                 case 3:
  177.                 case 5:
  178.                 case 7:
  179.                 case 8:
  180.                 case 10:
  181.                 case 12:
  182.                         {
  183.                                 iDays = 31;
  184.                         }
  185.                         break;
  186.                 case 2:
  187.                         {
  188.                                 //2月份比較特殊,需要根據是不是閏年來判斷當月是28天還29天
  189.                                 iDays = IsLeapYear(Year_Value)?29:28;
  190.                         }
  191.                         break;
  192.                 case 4:
  193.                 case 6:
  194.                 case 9:
  195.                 case 11:
  196.                         {
  197.                                 iDays = 30;
  198.                         }
  199.                         break;
  200.                 default : break;
  201.         }
  202.         return(iDays);                                                
  203. }

  204. //****************************************************
  205. //閏年檢測
  206. //****************************************************
  207. bit IsLeapYear(unsigned int uiYear)
  208. {
  209. ……………………

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

所有資料51hei提供下載:
GPS程序.zip (203.45 KB, 下載次數: 412)




評分

參與人數 2黑幣 +65 收起 理由
tieq1952 + 15 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:221028 發表于 2019-4-2 00:10 | 只看該作者
GPS模塊是哪個?
回復

使用道具 舉報

板凳
ID:253767 發表于 2019-4-2 07:27 | 只看該作者
謝謝分享!!!
回復

使用道具 舉報

地板
ID:520570 發表于 2019-4-24 16:10 | 只看該作者
謝謝分享學習一個
回復

使用道具 舉報

5#
ID:537143 發表于 2019-5-19 14:19 | 只看該作者
請問一下,為什么我用計算機串口模擬gps信息給單片機發送,液晶屏就有顯示。而我用gps給單片機串口發送就不好使呢
回復

使用道具 舉報

6#
ID:549706 發表于 2019-5-28 22:28 | 只看該作者
我覺得這個GPS模塊還是挺有開發價值的
回復

使用道具 舉報

7#
ID:525478 發表于 2019-5-28 23:47 | 只看該作者
這個太牛了
回復

使用道具 舉報

8#
ID:468878 發表于 2019-5-30 20:12 | 只看該作者
大君 發表于 2019-5-19 14:19
請問一下,為什么我用計算機串口模擬gps信息給單片機發送,液晶屏就有顯示。而我用gps給單片機串口發送就不 ...

你在單片機發送和讀取程序之間增加一段延時。有時候是因為模塊還沒來得及反應過來,單片機就讀取數據,導致讀取錯誤。
回復

使用道具 舉報

9#
ID:568756 發表于 2019-7-26 17:39 | 只看該作者
請問,GPS模塊與單片機如何聯接呢?
回復

使用道具 舉報

10#
ID:58591 發表于 2019-10-19 10:18 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

11#
ID:628031 發表于 2019-10-22 09:30 | 只看該作者
樓主有沒有gps仿真圖
回復

使用道具 舉報

12#
ID:628894 發表于 2019-10-23 16:16 | 只看該作者
我覺得可以試試
回復

使用道具 舉報

13#
ID:535249 發表于 2019-10-23 16:28 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

14#
ID:512122 發表于 2019-10-23 21:16 | 只看該作者
GPS模塊是什么型號的?
回復

使用道具 舉報

15#
ID:525068 發表于 2019-11-17 22:51 | 只看該作者
謝謝大神的分享
回復

使用道具 舉報

16#
ID:667639 發表于 2019-12-18 18:32 | 只看該作者
有仿真圖嗎
回復

使用道具 舉報

17#
ID:408809 發表于 2019-12-30 14:26 | 只看該作者
昨天我點下載,提示忙,幣也扣了,資料沒見著
回復

使用道具 舉報

18#
ID:408809 發表于 2019-12-30 16:50 | 只看該作者
下載看看,行不行在反饋
回復

使用道具 舉報

19#
ID:572970 發表于 2019-12-30 22:35 | 只看該作者
效果很不錯
回復

使用道具 舉報

20#
ID:8222 發表于 2019-12-30 22:51 | 只看該作者
謝謝分享。這個能精確到秒嗎?1分精度有點低。
回復

使用道具 舉報

21#
ID:130345 發表于 2019-12-31 14:26 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

22#
ID:646809 發表于 2019-12-31 18:08 | 只看該作者
現在這個一個簡單APP就能實現了,玩玩好了。
回復

使用道具 舉報

23#
ID:23844 發表于 2019-12-31 19:45 | 只看該作者
謝謝分享學習一下
回復

使用道具 舉報

24#
ID:636219 發表于 2020-1-5 16:27 | 只看該作者
把這個程序移植到STC15上可以直接用么,還是要改程序,LCD才能顯示
回復

使用道具 舉報

25#
ID:408809 發表于 2020-1-30 10:18 | 只看該作者
樓主你好。我在此程序基礎上增加 DS 18B20  測溫功能,結果是只有溫度 沒有GPS信息了。!
回復

使用道具 舉報

26#
ID:648281 發表于 2020-1-30 10:31 | 只看該作者
機電男神 發表于 2020-1-5 16:27
把這個程序移植到STC15上可以直接用么,還是要改程序,LCD才能顯示

你好!
1、顯示部分有可能直接能用
2、需要改程序初始化部分
3、帶有延時的地方,需要修改
回復

使用道具 舉報

27#
ID:648281 發表于 2020-1-31 16:09 | 只看該作者
ynzsc001 發表于 2020-1-30 10:18
樓主你好。我在此程序基礎上增加 DS 18B20  測溫功能,結果是只有溫度 沒有GPS信息了。!

你好!沒有程序沒有圖紙,沒法知道是因為什么
回復

使用道具 舉報

28#
ID:678200 發表于 2020-4-25 20:40 | 只看該作者
樓主為什么我用虛擬gps串口通訊,lcd顯示黑塊

XE~6Y8F9C]8D5$JEVDAQ(62.png (5.05 KB, 下載次數: 141)

XE~6Y8F9C]8D5$JEVDAQ(62.png
回復

使用道具 舉報

29#
ID:600952 發表于 2020-4-26 11:45 | 只看該作者
真厲害!用的是什么GPS模塊?
一直想做單片機GPS定位,學習到了,謝謝分享!
回復

使用道具 舉報

30#
ID:438811 發表于 2020-5-4 10:41 | 只看該作者
這個資料真的很棒!已經使用過了,顯示效果很好,頂。。
回復

使用道具 舉報

31#
ID:868146 發表于 2020-12-26 11:08 | 只看該作者
請問GPS模塊用的什么型號?
回復

使用道具 舉報

32#
ID:868295 發表于 2020-12-26 15:16 | 只看該作者
請問樓主單片機和GPS模塊怎么連接?
回復

使用道具 舉報

33#
ID:748788 發表于 2020-12-26 17:37 | 只看該作者
正點原子的,ATK1218-BD或ATK-S1216,價格在百元左右
回復

使用道具 舉報

34#
ID:847716 發表于 2020-12-30 17:10 | 只看該作者
本人請問有小白請問有32的,請問大佬有3有32的源代碼嗎
回復

使用道具 舉報

35#
ID:628580 發表于 2021-2-4 11:27 | 只看該作者
啊,我是個小白,想問問這種怎么做上位機呢
回復

使用道具 舉報

36#
ID:769558 發表于 2021-4-11 22:56 | 只看該作者
有原理圖嗎,樓主
回復

使用道具 舉報

37#
ID:69115 發表于 2021-4-12 00:28 | 只看該作者
這個定位制作,太有用了.
回復

使用道具 舉報

38#
ID:28992 發表于 2021-4-12 03:18 | 只看該作者
excellent job, thank you Sir!
回復

使用道具 舉報

39#
ID:81196 發表于 2021-4-12 08:48 | 只看該作者
簡單的產品定位操作還可以,如果是實時的,比如車載,那么這個就滿足不了實際需求,存在飄移的問題.這個GPS目測是串口的吧.看著和UBLOX相似.
回復

使用道具 舉報

40#
ID:929517 發表于 2021-6-2 14:35 | 只看該作者
這個不錯 挺簡單的 正好需要
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费在线播放视频 | 免费h在线 | 欧美精品一区二区三区四区五区 | 精品不卡| 中文字幕人成乱码在线观看 | 欧美一区二区精品 | 国产精品无码永久免费888 | 成人小视频在线观看 | 国产精品视频在线观看 | 黄免费在线| 国产精品综合色区在线观看 | 免费观看一级毛片视频 | 手机在线一区二区三区 | 在线观看涩涩视频 | 欧美一级免费看 | 成人av网站在线观看 | 精品自拍视频在线观看 | 亚洲成人一区二区在线 | 日韩中文字幕一区 | 91操操操| av色噜噜 | 久久91精品久久久久久9鸭 | 亚洲一区电影 | 精品国产乱码久久久久久老虎 | 有码在线| 久久久国产一区二区三区 | 久草在线中文888 | 中文在线a在线 | 二区在线观看 | 在线免费亚洲视频 | 国产馆| 久久久999免费视频 999久久久久久久久6666 | 天天看天天操 | 二区三区视频 | 国产精品自拍视频 | 日韩视频 中文字幕 | 在线午夜 | 二区高清 | 精品欧美一区二区在线观看欧美熟 | 日本免费一区二区三区视频 | 国产一区二区三区四区区 |