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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

GPS信息獲取UTC轉換單片機源程序(LCD1602顯示)

[復制鏈接]
跳轉到指定樓層
樓主



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

  5. //定義變量
  6. unsigned char KEY_NUM = 0;
  7. bit Page = 0;
  8. unsigned char xdata Display_GPGGA_Buffer[68];
  9. unsigned char xdata Display_GPRMC_Buffer[68];
  10. bit Flag_OV = 0;
  11. bit Flag_Calc_GPGGA_OK = 0;
  12. bit Flag_Calc_GPRMC_OK = 0;
  13. extern bit flag_gps_ok;
  14. extern u8 rx2_buffer[68];


  15. void IO_init();          //真對 IAP15W4K61S4  IO口初始化
  16. //****************************************************
  17. //主函數
  18. //****************************************************
  19. void main()
  20. {
  21.         unsigned char i = 0;
  22.         IO_init();
  23.         Init_LCD1602();
  24.         LCD1602_write_com(0x80);                                                //指針設置
  25.         LCD1602_write_word("Welcome to use!");

  26.         Delay_ms(10000);


  27.         Uart2Init();
  28.         EA=1;

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

  49.                         Min_High = Display_GPGGA_Buffer[9];
  50.                         Min_Low = Display_GPGGA_Buffer[10];
  51.        
  52.                         Sec_High = Display_GPGGA_Buffer[11];
  53.                         Sec_Low = Display_GPGGA_Buffer[12];

  54.                         Flag_Calc_GPGGA_OK = 1;
  55.                 }

  56.                 if(Page == 0 && Flag_Calc_GPGGA_OK == 1)
  57.                 {
  58.                         LED1 = ~LED1;
  59.                         Flag_Calc_GPGGA_OK = 0;
  60.                         LCD1602_write_com(0x80);                        //設置指針
  61.                         LCD1602_write_data(Hour/10+0x30);
  62.                         LCD1602_write_data(Hour%10+0x30);

  63.                         LCD1602_write_data(':');

  64.                         LCD1602_write_data(Min_High);
  65.                         LCD1602_write_data(Min_Low);

  66.                         LCD1602_write_data(':');
  67.        
  68.                         LCD1602_write_data(Sec_High);
  69.                         LCD1602_write_data(Sec_Low);

  70.                         LCD1602_write_word("  ");
  71.                        
  72.                         LCD1602_write_data(Display_GPGGA_Buffer[54]);       
  73.                         LCD1602_write_data(Display_GPGGA_Buffer[55]);       
  74.                         LCD1602_write_data(Display_GPGGA_Buffer[56]);       
  75.                         LCD1602_write_data(Display_GPGGA_Buffer[57]);
  76.                         LCD1602_write_word("m");
  77.        
  78.                         LCD1602_write_com(0x80+0x40);                        //設置指針
  79.                        
  80.                         LCD1602_write_data(Display_GPGGA_Buffer[28]);                        //N 或者 S

  81.                         LCD1602_write_data(Display_GPGGA_Buffer[17]);                        //緯度
  82.                         LCD1602_write_data(Display_GPGGA_Buffer[18]);                        //緯度
  83.                         LCD1602_write_data(0xdf);                                                                //度
  84.                         LCD1602_write_data(Display_GPGGA_Buffer[19]);                        //緯度
  85.                         LCD1602_write_data(Display_GPGGA_Buffer[20]);                        //緯度
  86.                         LCD1602_write_word("'");                                                                //秒
  87.                        
  88.                         LCD1602_write_data(Display_GPGGA_Buffer[42]);                        //E 或者 W

  89.                         LCD1602_write_data(Display_GPGGA_Buffer[30]);                        //經度
  90.                         LCD1602_write_data(Display_GPGGA_Buffer[31]);       
  91.                         LCD1602_write_data(Display_GPGGA_Buffer[32]);       
  92.                         LCD1602_write_data(0xdf);                                                               
  93.                         LCD1602_write_data(Display_GPGGA_Buffer[33]);                       
  94.                         LCD1602_write_data(Display_GPGGA_Buffer[34]);               
  95.                         LCD1602_write_word("'");

  96.                                                
  97.                 }
  98.                
  99.                 if(flag_gps_ok == 1 && rx2_buffer[3] == 'R' && rx2_buffer[4] == 'M' && rx2_buffer[5] == 'C')                        //確定是否收到"GPRMC"這一幀數據
  100.                 {
  101.                         for( i = 0; i < 68 ; i++)
  102.                         {
  103.                                 Display_GPRMC_Buffer[i] = rx2_buffer[i];       
  104.                         }

  105.                         Year_High = Display_GPRMC_Buffer[57];
  106.                         Year_Low = Display_GPRMC_Buffer[58];

  107.                         Month_High = Display_GPRMC_Buffer[55];
  108.                         Month_Low = Display_GPRMC_Buffer[56];

  109.                         Day_High = Display_GPRMC_Buffer[53];
  110.                         Day_Low = Display_GPRMC_Buffer[54];


  111.                         if(Flag_OV == 1)                        //有進位
  112.                         {
  113.                                 UTCDate2LocalDate();                        //UTC日期轉換為北京時間               
  114.                         }

  115.                         Flag_Calc_GPRMC_OK = 1;
  116.                 }

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

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

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

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

  170.         Year_High = Year%100/10 + 0x30;                        //轉換年份值為ASCII
  171.         Year_Low = Year%10 + 0x30;                       
  172. }

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

  210. //****************************************************
  211. //閏年檢測
  212. //****************************************************
  213. bit IsLeapYear(unsigned int uiYear)
  214. {
  215.         return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
  216. }


  217. //****************************************************
  218. //按鍵掃描程序
  219. //****************************************************
  220. void Scan_Key()
  221. {
  222.         if( KEY4 == 0 )                                                 //按鍵1掃描
  223.         {
  224.                 Delay_ms(10);                                        //延時去抖
  225.                 if( KEY4 == 0 )
  226.                 {
  227.                         while(KEY4 == 0);                        //等待松手
  228.                         KEY_NUM = 3;
  229.                         Page = ~Page;
  230.                         LCD1602_write_com(0X01);        //清屏
  231.                 }
  232.         }
  233. }
  234. //****************************************************
  235. //MS延時函數(12M晶振下測試)
  236. //****************************************************
  237. void Delay_ms(unsigned int n)
  238. {
  239.         unsigned int  i,j;
  240.         for(i=0;i<n;i++)
  241.                 for(j=0;j<123;j++);
  242. }
  243. //真對 IAP15W4K61S4   STC15W4K56S4 系列 IO口初始化
  244. //io口初始化 P0 P1 P2 P3 P4 為準雙向IO口   
  245. //注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為
  246. //      高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用
  247. //相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
  248. //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
  249. void IO_init(void)
  250. {
  251.   P0M0 = 0X00;
  252.   P0M1 = 0X00;

  253.   P1M0 = 0X00;
  254.   P1M1 = 0X00;

  255.   P2M0 = 0X00;
  256.   P2M1 = 0X00;

  257.   P3M0 = 0X00;
  258.   P3M1 = 0X00;

  259.   P4M0 = 0X00;
  260.   P4M1 = 0X00;  
  261. ……………………

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

所有資料51hei提供下載:
GPS信息獲取(LCD1602顯示)UTC轉換.rar (175.7 KB, 下載次數: 32)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:296923 發表于 2018-3-25 20:47 | 只看該作者
這個好


支持一下
回復

使用道具 舉報

板凳
ID:296886 發表于 2018-3-25 21:36 | 只看該作者
挺好的啊
回復

使用道具 舉報

地板
ID:263750 發表于 2018-4-17 20:38 | 只看該作者
我買了一個GPS模塊,送的程序跟你上面的程序一模一樣,我什么東西都弄好了,但就是按鍵沒有用。你的程序上按鍵程序是空的,請補全,謝謝。
回復

使用道具 舉報

5#
ID:315748 發表于 2018-4-24 21:51 | 只看該作者
最近在弄這個 但是都是需要金幣才能下載 好煩啊  求幫助QQ1427635432
回復

使用道具 舉報

6#
ID:269211 發表于 2018-5-23 21:46 | 只看該作者
這個程序是有問題的,不全
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费一二三区 | 国产精品九九九 | 作爱视频免费看 | 精品国产欧美一区二区三区成人 | 成人午夜视频在线观看 | 欧美亚洲一级 | 中文二区| 午夜视频在线免费观看 | 四虎影院在线观看免费视频 | 成人精品| 男人av的天堂 | 黄 色 毛片免费 | 国产精品99久久久久久动医院 | 国产农村一级片 | 在线观看中文字幕 | 99热在线播放 | 在线免费视频一区 | 成人精品视频99在线观看免费 | 欧美日韩专区 | 久久网国产 | 岛国精品 | 欧美精品一区二区在线观看 | 99在线观看视频 | 久久精品国产久精国产 | 精品美女视频在线观看免费软件 | 一区二区三区欧美在线 | 一级毛片播放 | 日日夜夜精品视频 | 欧美在线视频网站 | 久久中文字幕电影 | 久久精品色欧美aⅴ一区二区 | av第一页 | 久久久久久一区 | 亚洲精品久久久蜜桃网站 | 精品美女| 91久久精品日日躁夜夜躁国产 | 亚洲欧美激情国产综合久久久 | 久久久涩 | 中文字幕视频在线观看 | 91综合网 | 精品二区 |