找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3618|回复: 5
收起左侧

GPS信息获取UTC转换单片机源程序(LCD1602显示)

[复制链接]
ID:253445 发表于 2018-3-25 00:13 | 显示全部楼层 |阅读模式
自己模块.jpg
0.jpg

单片机源程序如下:
  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, 下载次数: 31)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:296923 发表于 2018-3-25 20:47 | 显示全部楼层
这个好


支持一下
回复

使用道具 举报

ID:296886 发表于 2018-3-25 21:36 | 显示全部楼层
挺好的啊
回复

使用道具 举报

ID:263750 发表于 2018-4-17 20:38 | 显示全部楼层
我买了一个GPS模块,送的程序跟你上面的程序一模一样,我什么东西都弄好了,但就是按键没有用。你的程序上按键程序是空的,请补全,谢谢。
回复

使用道具 举报

ID:315748 发表于 2018-4-24 21:51 | 显示全部楼层
最近在弄这个 但是都是需要金币才能下载 好烦啊  求帮助QQ1427635432
回复

使用道具 举报

ID:269211 发表于 2018-5-23 21:46 | 显示全部楼层
这个程序是有问题的,不全
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表