使用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句子中有有效信息。
好,抛光的项目。
我需要一个相当准确的时间来源,用于房屋周围的项目(可编程恒温器等)所以这将是理想的。
我一般不使用Picaxe并坚持arduino(没有时间学习其他东西)所以可以合理地使用你的Arduino版本
谢谢你的计划。这也可以通过在PIC32上运行MMbasic来实现。很少的部分,而且工作出色。看一下这个项目…
http://geoffg.net/micromite_gps_clock.html.
只需要8个部件就可以了。
ViscomJim
我尝试在Proteus 8上用编译成功的软件模拟这个电路,但是没有成功,我想知道为什么!