打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
自制1.8寸GPS授时时钟(程序 电路图 制作详情)
    利用中午午休的一些零星时间设计制作了一款1.8寸GPS授时时钟,现将自己的制作过程和经验教训写下来和大家分享和共同学习。

    提到GPS,大家现在都在使用智能手机,很快就想到了GPS定位、导航等功能。没错,GPS系统随着科技的进步已经走到了你的身边,并不是想象中的那么神秘。其实GPS收到卫星型号后会接收到相当多的卫星定位信息,比如:日期、时间、坐标经纬度、海拔高度等等数据。本时钟就是利用GPS模块配合GPS天线收到GPS卫星信息获取其中的时间数据来校正和显示当前精准的时间。
优良的GPS模块当然价格也不菲,往往售价都在几百元,现在网上淘得几元钱一个的二手GPS模块也是相当的不错了,本时钟选用了价格便宜的Ublox LEA-4A GPS模块,还有GPS天线。GPS模块和天线都是51hei提供的.
                              



   本作一物多用的原则,制作前考虑到使用4个1.8寸数码管共阳红(外型尺寸38x56MM),使用5V电源不能够驱动点亮数码管,需要9V至12V的电源,但又不想使用专用的电源接口和电源,考虑到通用性,固将电源接口采用MicroUSB接口(也就是平时智能手机常用的充电和数据线接口),电源也可使用手机的充电电源,方便灵活又不需专门配备电源,由于Ublox LEA系列的GPS模块自带有USB接口,即可将模块中的USB引脚接入到这个MicroUSB电源接口上,这样就可以将本时钟作为具有USB接口的外部GPS模块和电脑PC想连接,使用专门的GPS驱动和软件,就可以在PC机上使用定位导航功能了,比如谷歌地球、高明的地图软件。另外可以将本时钟添加一些常用的单元部分进行功能扩展,让其成为一个多用途的1.8寸显示的C51单片机实验和学习板,增加了可玩性。加入的单元部分有:1.    C51-ISP编程接口(可以通过该接口方便的编程单片机程序);2.    DS18B20温度集成(可以通过该探头获取环境温度)3.    4个按键(可以根据需要编写具有按键功能的时钟)4.    VS1838红外接收头(可以通过编程加入红外遥控功能)5.    24C02存储芯片(可以编写一些具有存储功能的程序)6.    DS1302时钟芯片(可以编写时钟程序)7.    蜂鸣器(可以编写闹钟和一些声响的程序)8.    XL6009升压模块(可以通过电位器调节数码管的亮度)9.  GPS模块的MicroUSB接口(可以通过手机数据线作为电源或和PC机联机成为外部GPS模块) 电路图设计如下:
PCB板背面图

PCB板正面图

原理图和PCB板图均使用Altium Designer 14软件进行设计,在使用Altium Designer14设计时也是不断学习的一个过程,元件图库、PCB元件封装库、3D元件库、布局、排版等,有时一个元件的绘制都会花去你很多时间,很多元件都是我自己拿着元件测量尺寸和参照网上的封装图来手绘,还是很辛苦的。为了学习,这个PCB板特制作了3D效果图:
PCB正面3D






PCB背面3D





PCB部分放大3D






    设计好后拿去PCB打样几块,板子收到后,看似做工非常漂亮。

开始焊接第一块样板,焊接完后检查无误后通电测试,接下来就遇到了几个问题:
1.  通过ISP口写入程序后,单片机不运行程序,再次检查焊接没问题后,仔细查看原理图后发现,在设计原理图时忙于考虑各IO口的分配问题却忽略了29脚EA/VPP,将其悬空了,应将29脚接到5V电源上,让单片机执行内部程序。更改后单片机正常运行了。
2.  Q2工作不正常,经检查后发现,在设计时将NPN三极管和PNP三极管都用了相同的PCB封装库PNP,和原理图的NPN封装对应脚不一样,C、E脚刚好相反了,焊下Q2,将其反面安装焊接,问题得到解决。
3.  Q3、Q4、Q5、Q6,这4个位驱动不起作用,由于想省掉一个ULN2003的集成,借用了1.5寸的位驱动用4个3极管,没考虑到使用的是1.8寸的数码管将其位电压已经提高到9V至12V,致使这4个位驱动处于放大状态失去了开关的作用,将这4个位驱动加一级3极管,测试位驱动正常。
4.  由于错误的将购买的GPS天线认为是无源天线,设计的时候按无源天线的线路设计,导致GPS模块无法收到GPS信息,经反复的实验测试和查阅GPS模块参数资料,得知购买的是有源GPS天线,需要给天线加载电源天线才能有放大作用,根据有源天线原理,切断GPS模块12、24、19引脚的接地,将18(VCC_RF)、19(V_ANT)脚连接,使其16(RF_IN)脚天线输入端加载3.3V左右的电压,为有源天线提供电源。
5.  经过以上4步修改后接入GPS有源天线发现单片机还是没能正确的接收到需要的信息,将USB线连接到电脑安装驱动和GPS模块测试软件u-center7.0软件进行联机查看,单片机程序是来自于网友编制的,波特率设置为9600(TH1 = 0xFD;   //9600波特率的初值),而GPS模块查看为4800的波特率,通讯协议上不一致,看到LEA-4A资料上说可以修改波特率,在软件中将波特率修改为9600
这次可以正常收到GPS信息并把时间显示出来了。但是将电源切断后从新加电,又无法收到信息了,再用软件查看模块波特率又回到了4800,也就是说没有保存起,再查看模块相关资料得知LEA-4A模块是ROM经济型产品并无flash存储器,无法保存设置,可以通过改变硬件方式改变波特率,为了减少硬件改动,固将单片机程序修改成波特率4800(TH1 = 0xFA; //4800波特率的初值)来适应模块的默认4800波特率。这下终于成功了。
测试中发现:接收到的日期和时间信息比较快,快时约12秒,慢时半分钟,这个天线摆放的位置和角度有一定关系。该天线下部带有吸铁,可以吸在金属物体上,发现吸在具有大面积金属板上接收到信息时间会缩短,也许是有反射面的缘故吧。

至于连接PC用软件定位和导航这里就不作更多的解释了。
最后完成

上电未接收到GPS卫星信号时,电压5V,电流0.25A

接收到GPS卫星信号并校准显示时间,电压5V,电流0.16A

总结:通过以上5点故障分析,在设计电路时应做到思路清晰,小到每个零件的校对,查看元件满足正常运行的条件,要做到每个元件、模块功能参数熟悉,最好是经过实验仿真后再制作PCB板,有串口通讯协议的应先考虑和确认协议的一致性,尽量少走弯路和犯低级性错。

附言:整套 制作成本大约六十多。



这里附上单片机源程序:

#include 'reg52.h'

#define LEDPORT P0

sbit D1=P3^5;
sbit D2=P3^4;
sbit D3=P3^6;
sbit D4=P3^7;
sbit LED=P0^7;

unsigned char hour,min,sec;
bit rev_start,rev_stop;

//unsigned char code tab[]={0xA0,0xBE,0x64,0x2C,0x3A,0x29,0x21,0xBC,0x20,0x28,0xff};//数码管
//unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//数码管
unsigned char code tab[]={0x3F,0x0C,0x5B,0x5E,0x6C,0x76,0x77,0x1C,0x7F,0x7E,0x00};//0-9,灭

unsigned char  buf[80]; //请把GPS那货发来的数据放到我的肚子里

void TimerInit()
{
TMOD=0x21;
TH0 = 0xF1; //4ms左右
    TL0 = 0x9A;
EA=1;
ET0=1;
TR0=1;
SCON = 0x50;//使用串行工作方式1,10位异步收发8位数据,波特率可变(由T1的溢出率控制)
//    TH1 = 0xFD;//9600波特率的初值
TH1 = 0xFA;//4800波特率的初值
    TL1 = TH1;//9600波特率的初值
    ES = 1;
    TR1 = 1;
}


void Display(unsigned char hour,min)   //数码管显示
{
static unsigned char i;
LEDPORT=0x00;
switch (i)
{
case 0: if(hour/16) LEDPORT=tab[hour/16]; else LEDPORT=tab[10];D1=1;D2=D3=D4=0;break;
case 1: LEDPORT=tab[hour%16];  D2=1;D1=D3=D4=0;    break;
case 2: LEDPORT=tab[min/16];D3=1;D1=D2=D4=0;break;
case 3: LEDPORT=tab[min%16];D4=1;D2=D3=D1=0;break;
}
i++;
if(i==4)i=0;
}


void main()
{

TimerInit();
while(1)
{
if((rev_stop==1)&&(buf[5]=='C'))//如果接收到GPRMC
{
ES=0;
hour= (buf [7]-0x30)* 16+ buf[8] -0x30;
min=  (buf [9]-0x30)* 16+ buf[10]-0x30;
sec=  (buf[11]-0x30)* 16+ buf[12]-0x30;
    hour=  hour / 16 * 10 + hour % 16;
LED=!LED;
hour= (hour+8) % 24;//UTC Time换算成北京时间
hour=hour/10*16+hour%10;

ES=1;
rev_stop=0;
}
   

}

}

void Timer0() interrupt 1
{
TH0 = 0xF1;
        TL0 = 0x9A;
Display(hour,min);//定时器兄弟简单而单调的工作,很轻松的。每4ms刷新下数码管,全年无休哦
}

/***************************************************************/
/*************************串口数据接收**************************/
/***************************************************************/
void Uart_Receive(void) interrupt 4
{
unsigned char ch,num;
ES = 0;

if (RI)//如果接收完成则进入
{
ch = SBUF;
if (ch == '$')  //如果收到字符'$',便开始接收
{
rev_start = 1;
rev_stop  = 0;  //接收停止标志
}

if (rev_start == 1)       //标志位为1,开始接收
{
buf[num++] = ch;  //字符存到数组中
if (ch == '\n')       //如果接收到换行
{
buf[num] = '\n';
rev_start = 0;
rev_stop  = 1;  //接收停止标志
num = 0;
}
}
}
RI = 0; //RI清0,重新接收
ES = 1; //串口1中断允许
}




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【学术论文】基于STM32的多源数据采集板卡设计
LTE基站类型与设备
主板参数全程图解
74ls02中文资料汇总(74ls02引脚图及功能
彻底了解LTE基站,此文足以
FPGA实现串口UART自收发
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服