楼主是一名非专业的电子“发烧友”,经常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重新编辑 ]