最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 最新DIY >

DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

时间:2017-07-09 13:44来源:数码之家 作者:aqxgm 点击:
楼主是一名非专业的电子“发烧友”,经常DIY一些小东西来打发一下业余时间,比如说功放、收音机啊等等电子爱好者经常玩的东东。这些日子又迷上了单片机,做过好几个时钟,做好后发现这些时钟不管怎么调试都存在时间并不十分准确的问题,前些日子受手头PCB大小
楼主是一名非专业的电子“发烧友”,经常DIY一些小东西来打发一下业余时间,比如说功放、收音机啊等等电子爱好者经常玩的东东。这些日子又迷上了单片机,做过好几个时钟,做好后发现这些时钟不管怎么调试都存在时间并不十分准确的问题,前些日子受手头PCB大小限制做了一个4位的数码管时钟,一直用着还算不错。但是感觉没有秒显示有点对不住GPS的精准,就去淘了些空PCB,开工DIY6位时钟。

再恶补一下GPS的数据格式,接收到的一帧数据如下图所示:
DIY 6位数码管GPS授时时钟,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 绘制)
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)
当显示GPS的时间时,时钟是精确的无须调整;但是当没有GPS信号或没有插入GPS模块时,时间是需要调整的,就加入了一个红外接收头,这样就可以用遥控器调整时间了。

制作PCB使用的方法是热转印。
先把PCB图打印到热转印纸上
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

裁好一段空覆铜板,用砂纸或钢丝球打磨干净
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

加热工具是一把老式的电熨斗,当温度达到180度左右时开始转印(激光打印机的碳粉熔化温度大约是180度左右)。
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


转印好后用三氯化铁腐蚀。做好的PCB涂一层松香酒精溶液防氧化
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


打孔、焊接好了
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


单片机型号是PLCC封装的STC89C52RC,手头没有IC座就将管脚折出来当贴片用。因为需要串口通信晶振频率选择了11.0592mhz
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


这是使用的遥控器
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


放在窗台上面的GPS模块,其实放在室内也是可以正常使用的,只是初始化速度慢一点。
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

硬件做好后开始了漫长的程序调试,用了几个晚上的时间,反复烧写多次后终于达到了自己的设计要求。
这是从网络获取的标准北京时间
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


这是DIY时钟的当前时间
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

插入GPS后,自动与卫星同步,时间就想当的准确了
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

使用5V的电源,没有插入GPS模块时电流100ma左右,功耗大约是0.5W
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

插入GPS后,电流增加了一倍多,不过1W左右的功耗也不算太大。
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)

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

为了DIY“作品”的美观,特意从网上订购的半透明亚克力。个人认为还是非常简洁漂亮的。
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


再来一张漂亮的效果图
DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享)


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

公布邮箱后收到了好几个兄弟的邮件,发送太麻烦了。还是上传到这里吧
C程序、原理图及PCB DIY 6位数码管GPS授时时钟,GPS数据格式讲解(开源共享) 6位GPS授时数码管时钟.rar (475 K) 下载次数:434





[ 此帖被aqxgm在2015-01-23 19:36重新编辑 ]
(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
相关文章
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容