切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 54782阅读
  • 260回复

[工仪]DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享) [复制链接]

上一主题 下一主题
离线aqxgm
 

发帖
6039
M币
17555
专家
161
粉丝
532
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2015-01-20
— 本帖被 mydigit 设置为精华,作者+3000M币+5专家(2015-01-22) —
楼主是一名非专业的电子“发烧友”,经常DIY一些小东西来打发一下业余时间,比如说功放、收音机啊等等电子爱好者经常玩的东东。这些日子又迷上了单片机,做过好几个时钟,做好后发现这些时钟不管怎么调试都存在时间并不十分准确的问题,前些日子受手头PCB大小限制做了一个4位的数码管时钟,一直用着还算不错。但是感觉没有秒显示有点对不住GPS的精准,就去淘了些空PCB,开工DIY6位时钟。

再恶补一下GPS的数据格式,接收到的一帧数据如下图所示:



我们最关心的时间,日期、经纬度、速度、海拔等信息都在这里了,用逗号分隔,两个逗号之间为空说明没有数据
主要数据解读:
$GPGGA
114839.914 这是标准时间,比北京时间晚8个小时,这里换算成北京时间就是19:48:39点后面的914是毫秒,但GPS输出的毫秒并不怎么准确。
XXXX.2743, N: 纬度信息,N是北纬
XXXXX.5447,E:经度信息, E是东经
1:质量因子 (0=没有定位 1=实时GPS 2=差分GPS)
04 :可使用的卫星数(0~8)
2.4:水平精度(1.0~99.9)
151.0,M:天线高程 (海平面 -9999.9~99999.9单位:m)
3.0,M:(大地椭球面相对海平面的高度-999.9-9999.9,单位:m)
0000 :差分基准站号(0000~1023)实时GPS为0000
$GPRMC
114839.914 这是标准时间,比北京时间晚8个小时,这里换算成北京时间就是19:48:39。
A:成功定位(未能定位这里是V)
XXXX.2743, N: 纬度信息,N是北纬
XXXXX.5447,E:经度信息, E是东经
0.00和空数据:相对位移速度和位移方向(在这里因为是固定使用,速度是0,所以移动方向的数据为空)
041114:日期(数据格式为dd/mm/yy)即2014年11月14日

    从解读的这两组主要数据可以看出,如果只是做简单的时间日期显示,只用最下面的一行$GPRMC就可以了。
    在串口中断里面不停的接收GPS发过来的数据,然后将这些数据保存到一个数组(buf[10])里面,然后取出时间来显示就行了,程序如下:
   void Uart_Receive(void) interrupt 4     //串口中断,用于GPS数据接收
   {
       unsigned char ch,num;
       ES = 0;
       if (RI)                    //如果接收完成则进入
       {
           ch = SBUF;
           if (ch == 'R')  //如果收到字符'$',便开始接收
           {
               rev_start = 1;
               rev_stop  = 0;          //接收停止标志
           }

           if (rev_start == 1)       //标志位为1,开始接收
           {
               buf[num++] = ch;  //字符存到数组中
               if (ch == '.')       //如果接收到换行
               {
                   buf[num] = '\n';
                   rev_start = 0;
                   rev_stop  = 1;      //接收停止标志
                   num = 0;
               }
           }
       }
       RI = 0;     //RI清0,重新接收
       ES = 1;     //串口1中断允许            
   }        

     显示方式选择了比较实用的数码管,用8550三极管来驱动位。选择了4个1.5英寸的显示小时和分钟,2个0.8英寸的用来显示秒,这样看起来比较协调一点。由于晚上拉上窗帘后就收不到GPS信号了,就加了一片实时时钟DS1302,这样在没有GPS信号的时候也能正常使用。

电路图和PCB(使用Altium Designer 绘制)


当显示GPS的时间时,时钟是精确的无须调整;但是当没有GPS信号或没有插入GPS模块时,时间是需要调整的,就加入了一个红外接收头,这样就可以用遥控器调整时间了。

制作PCB使用的方法是热转印。
先把PCB图打印到热转印纸上


裁好一段空覆铜板,用砂纸或钢丝球打磨干净


加热工具是一把老式的电熨斗,当温度达到180度左右时开始转印(激光打印机的碳粉熔化温度大约是180度左右)。



转印好后用三氯化铁腐蚀。做好的PCB涂一层松香酒精溶液防氧化



打孔、焊接好了





单片机型号是PLCC封装的STC89C52RC,手头没有IC座就将管脚折出来当贴片用。因为需要串口通信晶振频率选择了11.0592mhz



这是使用的遥控器



放在窗台上面的GPS模块,其实放在室内也是可以正常使用的,只是初始化速度慢一点。


硬件做好后开始了漫长的程序调试,用了几个晚上的时间,反复烧写多次后终于达到了自己的设计要求。
这是从网络获取的标准北京时间



这是DIY时钟的当前时间


插入GPS后,自动与卫星同步,时间就想当的准确了


使用5V的电源,没有插入GPS模块时电流100ma左右,功耗大约是0.5W


插入GPS后,电流增加了一倍多,不过1W左右的功耗也不算太大。


数码管倒装,用左上角的小点指示GPS信号的有无。当没有GPS信号时,小点不亮,从DS1302里读出时间来显示;当有GPS信号时,自动与卫星同步并将准确的时间写入DS1302,这样即使GPS信号消失,在一段时间内还是相当的准确的(时间长短与DS1302的精度有关)


为了DIY“作品”的美观,特意从网上订购的半透明亚克力。个人认为还是非常简洁漂亮的。




再来一张漂亮的效果图



后记:
     本次DIY以实用为主,没有添加日期、星期、闹钟等功能,因为我需要的只是一个时间精准的钟,DIY爱好者可以根据需要自行添加。如果有疑问可以联系,定当知无不言,让我们共同进步。

公布邮箱后收到了好几个兄弟的邮件,发送太麻烦了。还是上传到这里吧
C程序、原理图及PCB





[ 此帖被aqxgm在2015-01-23 19:36重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共149条打赏M币+504专家+5
123456...15下一页
到第
离线aqxgm

发帖
6039
M币
17555
专家
161
粉丝
532
只看该作者 1楼 发表于: 2015-01-20
请登录后查看
[ 此帖被aqxgm在2015-01-20 21:24重新编辑 ]
本帖最近打赏记录:共24条打赏M币+85专家+1
离线希望

发帖
17340
M币
11
专家
5
粉丝
4654
只看该作者 2楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线hongo

发帖
53039
M币
149632
专家
275
粉丝
15184
只看该作者 3楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共2条打赏M币+2
离线aqxgm

发帖
6039
M币
17555
专家
161
粉丝
532
只看该作者 4楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线72hour

发帖
438
M币
4380
专家
5
粉丝
30
只看该作者 5楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共2条打赏M币+4
离线aqxgm

发帖
6039
M币
17555
专家
161
粉丝
532
只看该作者 6楼 发表于: 2015-01-20
回 72hour 的帖子
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线jpdd521

发帖
25693
M币
8005
专家
15
粉丝
350
只看该作者 7楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线bluenight

发帖
10992
M币
78
专家
29
粉丝
99
只看该作者 8楼 发表于: 2015-01-20
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线jpyj299

发帖
286
M币
171
专家
0
粉丝
10
只看该作者 9楼 发表于: 2015-01-20
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个