本文将介绍如何使用PIC单片机从GPS模块获取时间和日期。
要求使用MPLAB X的计算机和XC8编译器。
PICKIT 3.5或同等的PIC编程器。
一个GPS模块,发送NMEA句子。
面包板和跳线,LCD和5K锅。
零件清单中的零件。
介绍
在之前的文章中 使用Arduino 制作GPS时钟并使用PICAXE制作GPS时钟,我使用Arduino 和 PICAXE制作了GPS时钟。在本文中,我使用的是PIC16F628A。
在本文中,我使用的GPS模块与之前的文章不同。波特率是9600,所以我必须配置uart端口以匹配它。为了读出时间,我将使用GPRMC句子。这句话看起来像这样:
$ GPRMC,161229.487,A,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上未使用的引脚如果我要为项目添加更多功能,我希望将其路由到焊盘以便于访问。这不是这里的情况,因为电路是面包板的。
点击图片为全尺寸。
零件清单
以下是EagleCAD中BOM ulp的编辑列表。
软件
该软件已被评论,但我将在此处详细介绍。
首先是包含库,配置位,变量声明和函数原型。然后我有驱动LCD显示器的功能。要使LCD显示器正常工作,您必须遵循某个配方。之后,uart函数和两个函数在收到的时间和日期无效时显示消息。
主程序以一些指令开始:关闭比较器,设置端口的正确方向,并将所有端口设置为低。然后初始化LCD端口和uart端口。在主while循环中,RX上接收的每个字节都放在一个变量中。比较变量以查看它是否是美元符号$。如果它是一个美元符号,我现在知道我正处于NMEA判决的开头,但我不知道哪一个。然后它读取接下来的六个字节并将它们放入一个数组中。然后将该数组与预定义的数组进行比较。如果它是平等的,那么我知道两件事:一,我有一句话和两句,我有正确的句子。现在遵循许多for循环,读取并将正确的值放在正确的位置。在这个例子中,它读取时间,日期,纬度和经度IC。
当程序接近主while循环结束时,它会在LCD上显示时间和日期。显示的时间通常称为GPS ZULU时间。
结论
在本文中,我向您展示了使用PIC单片机从GPS模块获取时间和日期的一种方法。通过对代码进行少量更改,您可以在不同的PIC上使用它。该程序读取时间,日期,纬度和经度,但它只显示时间和日期。我挑战读者显示lat和lon。
这是面包板的一些图片。
启动屏幕。
在PIC接收有效数据之前。
该模块有一个小型备用电池,有助于在卫星修复之前更快地启动时钟。