找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6482|回复: 11
收起左侧

一个简易的GPS数据显示器

[复制链接]
ID:71235 发表于 2014-12-28 00:40 | 显示全部楼层 |阅读模式


    前几天已经测试了LCM显示的驱动,基本能稳定显示了,偶尔启动时不能执行清屏命令。
    昨天下去去小C处买了个串口挡板,为的是用挡板上的公头DB9插座。晚上即开始制作这个GPS数据显示器了。
    硬件非常简单,一个TTL-RS232兼容的GPS接收器,这个早就从淘宝上买过来了,比起蓝牙的接收器来便宜很多,才75块钱,一个89C51最小系统(只有复位、晶振线路),成本不过6块来钱,这个89C51也是好多年前买的,板子还没焊,因为仿真器还没到货,程序测试是在XL1000开发板上做的,因为硬件实在太简单了,而且这个开发板还支持USB串口,这样就省得来回拔串口插头了。
    程序测试不是很顺利,在排除了硬件上的问题后,初步测试了串口的功能,可以正常的从接收器上接收数据了,因为串口接收是采用中断方式的,不是软件查询,所以需要设置不少的标志变量,而且程序的流程也变得不可捉摸起来,到11点的时候,已经可以处理纬度数据了,只是相同的数据,相同的程序,经度数据怎么也显示不出来,看到的只是一堆乱码。
    今天早上很早就起来,仍然想着要搞清楚昨晚的问题,搞了很久还是不行,只好先接收个纬度半球表示(即N或者S)试试,没想到经度数据竟然可以显示出来了。到下午午觉醒来的时候,整理了一下程序,添加了“度”符号显示功能,可用卫星数目、信号质量显示功能。到写这篇日志为止只有一个问题没搞清楚,其实是和经度显示问题相似的,就是经度半球标识显示不正常,老是显示个乱码或者“E”(正常情况下应该显示E的)或者一个“,”(这是GPS数据的分隔符),程序里怎么也看不出问题来,因为纬度半球标识显示是正常的。
    到目前为止程序只耗费了700来字节,其中LCM驱动就花了300多字节,程序空间还绰绰有余,RAM空间已经用了48字节,倒有点让人担心,毕竟89C51只有128字节的RAM。
回复

使用道具 举报

ID:71235 发表于 2014-12-28 00:40 | 显示全部楼层


    其实星期五就送到了,一直就躺在办公室里,下午去的时候还向卖给我的人要快递单号。
    包装盒有点旧,在人家手里已经1年了,也难怪了。打开包装,说明书,软件光盘、装箱单躺在最上面,下面发泡盒子里则有仿真器主机,电源、一个标准51仿真头,最让人高兴的是有一个51转2051的转换头,这下省得去网上去买了,仿真头上套着个针脚保护器。盒子底层是一长一短的排线和一条串口连接线。
    定了定神,开始拆包装准备试机。先试试能不能用在XL1000开发板上,取下开发板上的89s52,插上仿真头,连接仿真器,打开仿真器电源,开发板电源,仿真头上红灯亮起,没闻到异味,这起码说明了仿真器电源和开发板电源并不冲突。接着插上串口电缆,打开PC上的TKStudio仿真软件,新建一个工程,设置正确后点DEBUG键,通讯失败!又打开KEILC,按照说明书安装后驱动,再联机还是失败,启动串口调试助手软件,可用正常打开COM1端口,看来不是串口硬件的原因。抱着试试看的心情,从楼下取来笔记本电脑,这是一台旧笔记本,还有一个串口可用的,安装好仿真软件,联机成功!突然明白了一个问题,原来PC上自制的的串口延长线只有2,3,5三根线,而这三根线用在单片机上是足够了,但是用在速度、稳定性要求高得多的仿真器上显然是不行的,于是换下自制的线换上标准的线,再次联机,这回马上成功了,接下来试了试全速运行,单步运行,断点,都行的,这也就放心了。
    这次试机弄清楚了三个问题,一是仿真器硬件是好的,二是仿真器串口用的是标准的9线制,三是开发板可以用作目标板,这样一般的小项目就可以不用立刻做实验板了。
回复

使用道具 举报

ID:71235 发表于 2014-12-28 00:41 | 显示全部楼层
    前天拿到的仿真器,当天就有了用武之地,在单步仿真的时候,发现了程序中的一个漏洞,一个计数用变量没有被及时清零,显示数据的时候总是只有纬度值是正确的(因为他是第一个被解析的,计数初值是零,不像以后的计数值因没清零所以被累积起来了),而其他的显示内容总是变幻莫测,这就是给我造成困扰的原因。昨天晚上又对$GPRMC语句进行了解析,现在可以显示时间、日期、高度、速度了(度量变换还没来得及做)。
    今天一整天的测试发现了一个比较严重的问题,那就是程序只能正常运行10来分钟,以后显示就会出错,按键也没了反应,用GPS实测或者用串口调试软件模拟数据结果是相同的,怀疑是程序跑飞了,刚刚给程序加了看门狗,10几分钟后,问题照旧,看来不是程序跑飞的问题了,去群里问了问,没人回答。如果这个问题不解决,这次做的这个东西就没了实用价值!
回复

使用道具 举报

ID:71235 发表于 2014-12-28 00:42 | 显示全部楼层
    这次的DIY经过了4个阶段:
    1.1602液晶显示驱动测试;
    2.GPS模块与单片机的通讯测试;
    3.GPS数据处理显示程序设计;
    4.硬件安装调试.

    1602液晶显示器的驱动调试经历一点点的波折,好在网上共享的程序不少,费了点时间也就找到适用的程序了.
而GPS模块与单片机的串行通讯则要自己来写了,好在N年前就写过类似的程序,还有串口调试助手之类的软件可以用,所以这一关也就过去了.接下来是数据处理,GPS送出的数据是ASCII字符串,每个数据字段用","隔开,若干个字段组成一个协议字符串,每个协议字符串又有一个$打头的6个字符组成一个协议标志,通过判读这个标志来区分不同的协议,这个过程看似很简单,确实如果用PC来实现的话是再容易不过的事情了,但是单片机不行,它没有什么字符串处理函数可以随意调用,而且单片机的运算速度远不如PC,如何把发过来的字符串拆分成一个一个的字段是个很要紧的事情,好在在一本书上看到了一种思路,就是对","进行计数,通过判读这个计数值来区分不同的字段,试验证明这种方法很有效,接下来的实际编程碰到了不少的问题,最后发现都是程序流程的问题,用软件仿真或者仿真器仿真一下也就可以解决了.
     前天开始做安装机壳,焊接线路板,机壳是上次从江苏买的,线路板还是3毛5分一块的实验板,另外买回若干中XH2.54系列的接插件及铜柱,电源插座等等,开液晶显示的空花了不少时间,还废掉了一个小切割砂轮片;等板子插座都焊接好了,才发现机壳内部乱的不行,而且也就显示器和主板的距离挨得太近,安装比较困难,只好用砂轮打磨了一下铜柱,让两块板子距离尽量的远些,好歹把所有的东西都装进去了,放电池盒的地方也所剩无几了,索性不用电池供电了.通电测试,主板运行不起来,花了一天的时间思考这个问题,老是怀疑是晶振电路不起振,把个晶振拆了装,装了拆,好好的线路板焊片也给烫坏了,翻书找89C51的最小系统电路图,对比自己的电路似乎没有问题,但是同样的程序在开发板上是能正常运行的,问题还是出在电路上,后来看一个BLOG找到一张最小系统的电路,这才看到89C51出PSEN/VPP引脚要接VCC的,赶紧焊接好,程序马上运行正常,原来这个引脚接正电源的时候,程序要从能不ROM开始运行的,否则从外部ROM运行,我的程序全在内部,而这只引脚又是悬空的,当然运行不正常了;这里要批判一下那些所谓的单片机入门书工具书,电路图是N年前8031时代的书上抄的,程序又是运行89c51系统上的,整个书上没一点说明,真是害人不浅.
    昨天下午坐上老婆的车出去测试了一下,基本正常,今天早上又换成了24M的晶体,显示器背光加了限流电阻,整机的耗电量因此下降了2/3,运行速度明显加快,至于换了晶振以后的问题就暂且不去理会了,毕竟不是很大的问题,再说这个DIY说到底还是拿来练练手的,离实用还有不少距离,那些问题就留在以后有心情的时候再解决吧.
    以下是实物照片,纪念一下:

杂乱的工作台


外面


内部


回复

使用道具 举报

ID:71235 发表于 2014-12-28 00:42 | 显示全部楼层
    GPS接收终端安装好这么多天,运行一直比较正常,唯一感到遗憾的是液晶显示器初始化不正常,经常在上电或者复位的时候显示空白,而主程序运行是正常的,就是显示不出字符,需要反复复位才会成功一次,调整参数数次还是不行。昨晚偶尔看一篇博客,讲到1602显示器初始化容易失败的问题,作者认为应该给初始化语句以足够的延时,千万不可为图显示快些而减少延时。我的CPU晶振原来用的是12m的,没发现这个问题,现在换成24m的问题就出现了,看来问题就是出在这里,其实以前也已经认识到这个问题,只是没下狠心加大延时。早上又一次打开机壳,安装上修改后的程序,现在无论怎么上电或者复位,显示器都能正常显示了!
回复

使用道具 举报

ID:73962 发表于 2015-3-1 21:14 | 显示全部楼层
願闻其详……
回复

使用道具 举报

ID:28571 发表于 2015-4-17 22:48 | 显示全部楼层
好东西,学习一下,谢谢!
回复

使用道具 举报

ID:78060 发表于 2015-4-26 23:32 | 显示全部楼层
谢谢分享!学习收藏
回复

使用道具 举报

ID:82930 发表于 2015-6-14 10:12 | 显示全部楼层
您有 GPS  89C52 用1602显示的程序么
回复

使用道具 举报

ID:82930 发表于 2015-6-14 10:13 | 显示全部楼层
        if(tmp == '$')//起始标志
    {
        Command = 0;
        ReceivingF = 1;
        Bytes_counter = 0;
        Segment = 0;               //清空语句段计数器
        return;
    } 下的一个程序 这里 好像就进不去了
回复

使用道具 举报

ID:82930 发表于 2015-6-14 10:14 | 显示全部楼层
哪位大师 能够 帮助一下啊
回复

使用道具 举报

ID:110866 发表于 2016-4-18 09:15 | 显示全部楼层
资料没上传
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表