找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7861|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机串口接收并解析GPS数据+12864显示源程序

  [复制链接]
跳转到指定楼层
楼主
ID:334214 发表于 2018-12-9 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近玩了一下GPS, 把GPS的数据通过单片机串口接收并解析和显示出来,效果还不错,分享给大家 希望对有需要的人能起到帮助!

单片机源程序如下:

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit duan=P2^6;
  5. sbit wei=P2^7;
  6. sbit A=P1^0;
  7. sbit lcd_en=P2^7;
  8. sbit lcd_rs=P2^6;
  9. sbit lcd_rw=P2^5;
  10. sbit lcd_psb=P3^2;
  11. uchar a,b,c,d,i,flag,temp;
  12. uchar table0[64];
  13. void delay(uint z);
  14. void write_com(uchar com);
  15. void write_date(uchar date);
  16. void init();
  17. void main()
  18. {
  19.        init();
  20.        write_com(0x90);
  21.        for(a=0;a<17;a++)//局部定义数组并写入液晶(局部定义极大的节省RAM)
  22.        {   
  23.               uchar table[]="51黑单片机";
  24.               write_date(table[a]);
  25.        }
  26.        delay(5000);

  27.        write_com(0x01);//清屏

  28.        write_com(0x90);//局部定义数组并写入液晶
  29.        for(a=0;a<16;a++)
  30.        {
  31.               uchar table1[]="GPS 信号接收中";   
  32.               write_date(table1[a]);
  33.        }
  34.        write_com(0x8b);//局部定义数组并写入液晶
  35.        for(a=0;a<10;a++)
  36.        {
  37.               uchar table2[]={"请稍后…………"};
  38.               write_date(table2[a]);
  39.        }
  40.        delay(6000);
  41.        ES=1;
  42.        while(1)
  43.        {
  44.               if(flag==1)
  45.               {   
  46.                
  47.                      if(table0[4]=='M')//确定是否收到"GPGGA"这一帧数据
  48.                      {           
  49.                             d++;
  50.                             if((d>=0)&&(d<=15))//前15秒显示经纬度
  51.                             {
  52. //以下给液晶写经纬度内容
  53.                                    uchar table3[]="纬度:";
  54.                                    uchar table4[]="经度:";
  55.                                    if(d==1)
  56.                                           write_com(0x01);//显示之前清屏
  57.                                    write_com(0x80);
  58.                                    for(a=0;a<7;a++)
  59.                                           write_date(table3[a]);                 
  60.                                    write_com(0x88);
  61.                                    for(a=0;a<7;a++)
  62.                                           write_date(table4[a]);

  63.                                    write_com(0x92);
  64.                                    for(a=0;a<11;a++)
  65.                                           write_date(table0[a+18]);            
  66.                                    write_com(0x9a);
  67.                                    for(a=0;a<12;a++)
  68.                                           write_date(table0[a+30]);
  69.                                    ES=1;
  70.                                    flag=0;
  71.                             }
  72.                             if((d>=16)&&(d<=30))//后15秒显示时间和高度
  73.                             {                                       
  74.                                    uchar temp1,temp2,shi_1,shi_2,i,j,k;
  75.                                    uchar code sj[]="0123456789";
  76.                                    uchar table5[]="时间:";
  77.                                    uchar table6[]="日期:";
  78.                                                                    uchar table7[]="年";
  79.                                                                    uchar table8[]="月";
  80.                                                                    uchar table9[]="日";
  81.                                    uchar GD[8];
  82.                                    a=0;
  83.                                    for(b=0;b<64;b++)//这里完成日期数据分离
  84.                                           {
  85.                                                  if(table0[b]==',')
  86.                                                         {
  87.                                                                a++;
  88.                                                                if(a==9)
  89.                                                                       {
  90.                                                                       for(c=0;c<6;c++)
  91.                                                                              {
  92.                                                                                     GD[c]=table0[b+c+1];//将分离的日期内容写入高度数组
  93.                                                                              }
  94.                                                                       }
  95.                                                         }
  96.                                           }
  97.                                    if(d==30)
  98.                                    d=0;
  99.                                    if(d==16)            
  100.                                    write_com(0x01);//显示之前清屏
  101. //以下给液晶写高度内容
  102.                                    write_com(0x80);
  103.                                    for(a=0;a<6;a++)
  104.                                           write_date(table5[a]);   //发送时间到12864上显示

  105.                                    write_com(0x88);
  106.                                    for(a=0;a<6;a++)
  107.                                           write_date(table6[a]);    //发送日期到12864上显示                                          

  108.                                    write_com(0x98+2);
  109.                                    for(a=0;a<8;a++)
  110.                                           {
  111.                                                                                        for(i=4;i<6;i++)
  112.                                                                                        {
  113.                                                                                            write_date(GD[i]);
  114.                                                                                            }
  115.                                                                                            write_com(0x9B);
  116.                                                                                            for(i=0;i<2;i++)
  117.                                                                                            {
  118.                                                                                            write_date(table7[i]);
  119.                                                                                            }
  120.                                                                                            for(j=2;j<4;j++)
  121.                                                                                         {
  122.                                                                                                  write_date(GD[j]);
  123.                                                                                                 }
  124.                                                                                                 write_com(0x9D);
  125.                                                                                                 for(j=0;j<2;j++)
  126.                                                                                                 {
  127.                                                                                                 write_date(table8[j]);
  128.                                                  }
  129.                                                                                            for(k=0;k<2;k++)
  130.                                                                                            {
  131.                                                                                                  write_date(GD[k]);
  132.                                                                                            }
  133.                                                                                            write_com(0x9F);
  134.                                                                                            for(k=0;k<8;k++)
  135.                                                                                            {
  136.                                                                                            write_date(table9[k]);
  137.                                                                                            }

  138. //                                                 if(GD[a]==',')
  139. //                                                 {
  140. //                                                        a=9;
  141. //                                                        write_date('M');//无数据提前退出写入同时结尾补写单位'M'
  142. //                                                 }
  143. //                                                 else
  144. //                                                        write_date(GD[a]);
  145.                                           }

  146.                                    switch(table0[7])//分离字符串
  147.                                    {   
  148.                                           case '0':
  149.                                           temp1=0;
  150.                                           break;
  151.       
  152.                                           case '1':
  153.                                           temp1=1;
  154.                                           break;
  155.       
  156.                                           case '2':
  157.                                           temp1=2;
  158.                                           break;
  159.                                    }
  160.                                    switch(table0[8])//分离字符串
  161.                                    {
  162.                                           case '0':
  163.                                           temp2=0;
  164.                                           break;
  165.       
  166.                                           case '1':
  167.                                           temp2=1;
  168.                                           break;
  169.       
  170.                                           case '2':
  171.                                           temp2=2;
  172.                                           break;
  173.       
  174.                                           case '3':
  175.                                           temp2=3;
  176.                                           break;
  177.       
  178.                                           case '4':
  179.                                           temp2=4;
  180.                                           break;
  181.       
  182.                                           case '5':
  183.                                           temp2=5;
  184.                                           break;
  185.       
  186.                                           case '6':
  187.                                           temp2=6;
  188.                                           break;
  189.       
  190.                                           case '7':
  191.                                           temp2=7;
  192.                                           break;
  193.       
  194.                                           case '8':
  195.                                           temp2=8;
  196.                                           break;
  197.       
  198.                                           case '9':
  199.                                           temp2=9;
  200.                                           break;
  201.                                    }   
  202.                                    c=temp1*10+temp2;//时差转换(即转换为北京时间)
  203.                                    if(c>=16,c<=23)
  204.                                    {
  205.                                           shi_1=0;
  206.                                           shi_2=c-16;
  207.                                    }
  208.                                    if(c>=2,c<=15)
  209.                                    {
  210.                                           c+=8;
  211.                                           shi_1=c/10;
  212.                                           //shi_2=c;
  213.                                                                                   shi_2=c%10;
  214.                                    }
  215.                                    if(c>=0,c<=1)
  216.                                    {
  217.                                           shi_1=0;
  218.                                           shi_2=c+8;
  219.                                    }
  220. //以下给液晶写时间内容
  221.                                    write_com(0x90);
  222.                                    write_date(sj[shi_1]);

  223.                                    write_com(0x90+1);
  224.                                    write_date(sj[shi_2]);

  225.                                    write_com(0x90+2);
  226.                                    write_date(':');

  227.                                    write_com(0x90+3);
  228.                                    write_date(table0[9]);
  229.                                    write_com(0x90+4);
  230.                                    write_date(table0[10]);

  231.                                    write_com(0x90+5);
  232.                                    write_date(':');

  233.                                    write_com(0x90+6);
  234.                                    write_date(table0[11]);

  235.                                    write_com(0x90+7);
  236.                                    write_date(table0[12]);
  237.                                    ES=1;
  238.                                    flag=0;
  239.                             }
  240.                      }
  241.                      else
  242.                      ES=1;   
  243.                      flag=0;
  244.               }
  245.        }
  246. }
  247. void write_com(uchar com)//写指令函数
  248. {
  249.        lcd_rs=0;
  250.        lcd_rw=0;
  251.        lcd_en=0;
  252.        P0=com;
  253.        delay(5);
  254.        lcd_en=1;
  255.        delay(5);
  256.        lcd_en=0;
  257. }
  258. void write_date(uchar date)//写数据函数
  259. {
  260.        lcd_rs=1;
  261.        lcd_rw=0;
  262.        lcd_en=0;
  263.        P0=date;
  264.        delay(5);
  265.        lcd_en=1;
  266.        delay(5);
  267.        lcd_en=0;
  268. }
  269. void init()//初始化液晶、接收中断方式
  270. {
  271.        duan=0;
  272.        wei=0;
  273.        i=0;

  274.        lcd_psb=1;
  275.        write_com(0x30);
  276.        delay(5);
  277.        write_com(0x0c);
  278.        delay(5);
  279.        write_com(0x01);
  280.        delay(5);

  281.        TMOD=0x20;
  282.        TH1=0xFD;
  283.        TL1=0xFD;

  284.        SM0=0;
  285.        SM1=1;
  286.        REN=1;

  287.        EA=1;
  288.        TR1=1;  
  289. }
  290. void delay(uint z)//延时函数
  291. {
  292.        uint x,y;
  293.        for(x=z;x>0;x--)
  294.               for(y=110;y>0;y--);
  295. }
  296. void ser()interrupt 4//串口中断、初次分离'特殊符号无法显示'开头的字符串,并写入接收数组
  297. {
  298. uchar ok=1;
  299.        RI=0;   
  300.            temp=SBUF;
  301.        table0[i++]=temp;
  302.            SBUF=temp;
  303.            while(!TI);TI=0;
  304.       if(table0[0] == '特殊符号无法显示见附件' )//如果是此字符;马上接收数据
  305.        {         

  306. //               table0[i++]=temp;
  307.                          if(i==64)
  308.               {
  309.                      i=0;
  310.                      flag=1;
  311.                      ES=0;
  312.                                          A=0;
  313.               }
  314.        }
  315.        else
  316.        i=0;
  317.            
  318.                   
  319. }
复制代码

所有资料51hei提供下载:
GPS.zip (37.82 KB, 下载次数: 180)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:337569 发表于 2018-12-12 09:00 | 只看该作者
我想问一下,GPS TXD连接单片机RXD 为什么单片机一直进不去中断函数?
回复

使用道具 举报

板凳
ID:473537 发表于 2019-4-30 22:15 | 只看该作者
学习一下
回复

使用道具 举报

地板
ID:155299 发表于 2019-6-19 14:37 | 只看该作者
感谢楼主贡献,学习学习
回复

使用道具 举报

5#
ID:599401 发表于 2019-9-24 17:23 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

6#
ID:484435 发表于 2019-10-11 09:45 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:688460 发表于 2020-4-24 23:30 | 只看该作者
谢谢楼主的大公无私精神!谢谢!
回复

使用道具 举报

8#
ID:334214 发表于 2020-5-20 16:12 | 只看该作者
欧阳哲 发表于 2018-12-12 09:00
我想问一下,GPS TXD连接单片机RXD 为什么单片机一直进不去中断函数?

波特率设置对了吗
回复

使用道具 举报

9#
ID:65369 发表于 2022-2-21 11:20 | 只看该作者
例子真好的,多谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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