所有关于电路
项目

用PIC微控制器制作一个GPS时钟

2016年1月29日通过Jens Christoffersen

在本文中,我将向您展示一种使用PIC微控制器从GPS模块获取时间和日期的方法。

使用PIC单片机从GPS模块获取时间和日期。

需求

介绍

在前面的文章中用Arduino做一个GPS时钟用picaxe制作一个gps时钟我用Arduino和PICAXE做了GPS时钟。在本文中,我使用的是PIC16F628A。简要介绍GPS和导航,请阅读第一个链接中的文章。

在本文中,我使用的GPS模块与以前的文章中不同。波特率是9600,所以我必须配置uart端口来匹配它。我将用GPRMC这句话来读出时间。这个句子是这样的:

GPRMC美元,161229.487,,3723.2475,N, 12158.3416 W, 0.13,309.62, 120598 * 10

GPRMC语句和其他语句每秒钟发送一次。软件将搜索正确的一个,并使用其中的信息。

硬件

下面的原理图是建立在面包板上的。注意显示器LCD输出块。D6和D7连接到PICs引脚12和13。这是PGC和PGD,编程引脚。我不打算从LCD读取,所以我接地的RW引脚。我还禁足了D0-D3。像这样接地未使用的引脚是一个很好的实践,然而,如果我要向项目添加更多的功能,我喜欢将安装在PCB上的PIC上的未使用的引脚路由到一个pad,以便方便访问。这里的情况并非如此,因为电路是用面包板制作的。

点击图像的完整大小。

零件清单

以下是来自EagleCAD中的BOM ulp的编辑列表。

软件

软件被评论了,但是我将在这里大致地介绍一下。

首先是包含库、配置位、变量声明和函数原型。然后我有驱动液晶显示的功能。为了让液晶显示器正常工作,你必须遵循特定的配方。之后是uart函数和两个函数,当接收到的时间和日期无效时显示消息。

主程序以一些指令开始:关闭比较器,设置端口的正确方向,并将所有端口s设置为低。然后初始化LCD端口和uart端口。在主while循环中,RX接收到的每个字节都放在一个变量中。比较变量,看它是否是美元符号$。如果它是一个美元符号,我现在知道我在一个NMEA句子的开头,但我不知道是哪个。然后读取接下来的6个字节,并将它们放入一个数组中。然后将此数组与预定义数组进行比较。如果相等,那么我就知道两件事:一,我有一个句子,二,我有一个正确的句子。现在遵循大量的for循环,读取并将正确的值放在正确的位置。在这个例子中,它读取时间、日期、纬度和经度,但是只有时间和日期显示在LCD上。

当程序接近主while循环的末尾时,它会在LCD上显示时间和日期。所显示的时间通常被称为GPS祖鲁时间。

您可以下载下面的c源代码。

jc_pic16f628a-gpsclock-v2.c.zip

结论

在本文中,我向您展示了一种使用PIC微控制器从GPS模块获取时间和日期的方法。只需对代码做一些小修改,就可以在不同的PIC上使用它。该程序读取时间、日期、纬度和经度,但它只显示时间和日期。我要求读者把纬度和长度显示出来。

图片和视频

这是一些面包板的图片。

启动屏幕。

PIC接收到有效数据之前。

该模块有一个小的备用电池,可以帮助在卫星修复之前更快地启动时钟。

现在在NMEA句子中有有效信息。

为自己提供这个项目!的物料清单

17日评论
  • P
    Phil-S 2016年2月6日

    好,抛光的项目。
    我需要一个相当准确的时间来源,用于房屋周围的项目(可编程恒温器等)所以这将是理想的。
    我一般不使用Picaxe并坚持arduino(没有时间学习其他东西)所以可以合理地使用你的Arduino版本

    喜欢的。 回复
  • 吉姆点哦 2016年2月6日

    谢谢你的计划。这也可以通过在PIC32上运行MMbasic来实现。很少的部分,而且工作出色。看一下这个项目…

    http://geoffg.net/micromite_gps_clock.html.

    只需要8个部件就可以了。

    ViscomJim

    喜欢的。 回复
  • F
    FGV. 2016年4月15日

    我尝试在Proteus 8上用编译成功的软件模拟这个电路,但是没有成功,我想知道为什么!

    喜欢的。 回复