找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10544|回复: 14
打印 上一主题 下一主题
收起左侧

基于reb3571 + STC12C5A60S2 + LCD12864 + 18650的便携GPS定位系统

  [复制链接]
跳转到指定楼层
楼主
ID:70481 发表于 2014-12-17 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间受朋友影响,决定买个GPS模块学习一下这东西怎么用,写这帖子是为了和大家共同学习这模块,为了控制这模块搭建了一套简单的测试电路,希望能给也想了解这模块的朋友来个参考,废话不多说,有图有真相;在使用12864的时候发现点问题,请教高人,12864检测忙的时候就是不好使,总忙为啥呢?无奈换套路用延时,我每次给12864送指令都需要延时;还有个问题就是我在12864显示的时候 最早用STC89C58正常,但是换STC12C5A60S2的时候,屏幕会闪的很厉害(相应延时已由12T的调整为1T的),调整延时后还是闪,最后在main里添加延时后好多了,但是程序一变化相应的延时也得变,有啥办法能让屏幕不闪呢,是因为1T的单片机太快了,12864跟不上节奏吗? 请高人指点 谢谢
应大家要求 做下说明:
本系统初衷是本人为了 了解GPS模块而做的测试,GPS模块用的是上文提到的REB3571,其实我觉得市面上卖的GPS模块基本都遵循NMEA0183协议,所以在整体设计的时候只要为单片机留出串口就行了,一般的GPS模块都会引出TTL电平的TXD和RXD引脚,我用的GPS模块采用5V供电,跟51供电相同所以不用电压转换;单片机其实最早我用的是AT89S52,但是因为程序编译后大概20K左右,所以放弃了52选用STC的89C58,买芯片的时候发现STC89C58和STC12C5A60S2一个价,所以就一样买了一片(在电子市场买的,卖家比较黑一片要我12块钱),源程序在58上进行的测试,后来移植到1T的STC12C5A60S2上,因为STC12C5A60S2有俩串口,以后可以扩展,所以果断弃掉58转投STC12C5A60S2;液晶方面用的是12864(控制器芯片 ST7920 ),我也是刚知道LCD还有控制器芯片;最初的测试是用的USB供电,但是做完之后只能在电脑旁测试也没速度;就想了个招用4节5号电池的电池盒(一般的1元钱4节的电池,4节加一起都能达到6.8V,为了供电稳定可以考虑串1n4007,或是上7805稳压,我觉得1117的5V芯片挺好使,其间也试过LM317),最后还是采用了18650(这就是笔记本的电芯,一般都2000mh以上),加个一个升压模块(模块上有可调的电位器,自己调整电压感觉需要比5V高点,因为测试的时候没接负载呢,也不知道这么想对不?哈哈希望高人指点谢谢);我整理一下 回头上传电路图。

各位论坛的好朋友实在抱歉,由于一些原因好长、好长时间都没碰单片机了,差点就放弃这个专业了,
附上解码的程序 大家共同学习研究,有需要电路图的朋友请留言,我得好好找找都不知道放哪里了。

int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
{
        uchar ch, status, tmp;
        float lati_cent_tmp, lati_second_tmp;
        float long_cent_tmp, long_second_tmp;
        float speed_tmp;
        char *buf = line;
        ch = buf[5];
        status = buf[GetComma(2, buf)];

        if (ch == 'C')  //如果第五个字符是C,($GPRMC)      
        {
                if (status == 'A')  //如果数据有效,则分析      
                {
                        GPS -> NS       = buf[GetComma(4, buf)];
                        GPS -> EW       = buf[GetComma(6, buf)];

                        GPS->latitude   = Get_Double_Number(&buf[GetComma(3, buf)]);
                        GPS->longitude  = Get_Double_Number(&buf[GetComma( 5, buf)]);

                       GPS->latitude_Degree  = (int)GPS->latitude / 100;       //分离纬度     
                        lati_cent_tmp         = (GPS->latitude - GPS->latitude_Degree * 100);
                        GPS->latitude_Cent    = (int)lati_cent_tmp;
                        lati_second_tmp       = (lati_cent_tmp - GPS->latitude_Cent) * 60;
                        GPS->latitude_Second  = (int)lati_second_tmp;

                        GPS->longitude_Degree = (int)GPS->longitude / 100;        //分离经度   
                        long_cent_tmp         = (GPS->longitude - GPS->longitude_Degree * 100);
                        GPS->longitude_Cent   = (int)long_cent_tmp;   
                        long_second_tmp       = (long_cent_tmp - GPS->longitude_Cent) * 60;
                        GPS->longitude_Second = (int)long_second_tmp;

                        speed_tmp      = Get_Float_Number(&buf[GetComma(7, buf)]);    //速度(单位:海里/时)   
                        GPS->speed     = speed_tmp * 1.85;                           //1海里=1.85公里   
                        GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度                           

                        GPS->D.hour    = (buf[7] - '0') * 10 + (buf[8] - '0');                //时间   
                        GPS->D.minute  = (buf[9] - '0') * 10 + (buf[10] - '0');
                        GPS->D.second  = (buf[11] - '0') * 10 + (buf[12] - '0');
                        tmp = GetComma(9, buf);
                        GPS->D.day     = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期   
                        GPS->D.month   = (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0');
                        GPS->D.year    = (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000;

                        UTC2BTC(&GPS->D);

                        return 1;
                }               
        }

        return 0;
}


int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
{
        uchar ch, status;
        char *buf = line;
        ch = buf[4];
        status = buf[GetComma(2, buf)];

        if (ch == 'G')  //$GPGGA
        {
                if (status != ',')
                {
                        GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
//                        GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
                        GPS->height_ground = Get_Float_Number(&buf[GetComma(10, buf)]);  //要的是大地水平高度,应该解析第10个逗号之后的数据

                        return 1;
                }
        }

        return 0;
}







液晶部分 焊个电位器 调对比度



电源部分 为了到户外测试方便 加个18650和升压模块



初始化状态



测试的结果






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:70653 发表于 2014-12-17 21:41 | 只看该作者
最近也在搞这个,学习一下
回复

使用道具 举报

板凳
ID:70653 发表于 2014-12-17 21:45 | 只看该作者
楼主,原理图和程序请共享一下,谢谢。5279751@qq.com
回复

使用道具 举报

地板
ID:70104 发表于 2014-12-19 15:57 | 只看该作者
你搞什么飞机~~原理和程序呢
回复

使用道具 举报

5#
ID:71046 发表于 2014-12-24 22:13 | 只看该作者
楼主,原理图和程序请共享一下,谢谢598804594@qq.com
回复

使用道具 举报

6#
ID:74471 发表于 2015-4-8 07:43 | 只看该作者
楼主,程序和原理图能分享吗?谢谢  1419214137@qq.com
回复

使用道具 举报

7#
ID:87835 发表于 2015-8-7 14:23 | 只看该作者

楼主,原理图和程序请共享一下,谢谢754433618@qq.com
回复

使用道具 举报

8#
ID:72559 发表于 2016-5-12 16:50 | 只看该作者
楼主我来晚了,不知道还能不能将原理图和程序请共享一下,605102025@qq.com
还有就是我也做得GPS定位,之前用的STC89C52现在也是改用了STC12C5A60S2,液晶显示出现了乱码的情况,我也不清楚怎么办才好,延时也改了,不知道还需要改哪些,希望楼主可以指导一下
回复

使用道具 举报

9#
ID:122417 发表于 2016-5-21 18:49 | 只看该作者
最近想学一下GPS,跪求楼主的程序和原理图。谢谢楼主 1318537276@qq.com
回复

使用道具 举报

10#
ID:99590 发表于 2016-11-9 21:12 | 只看该作者
最近正在弄GPS,跪求楼主的程序和原理图。谢谢楼主 420301282@qq.com
回复

使用道具 举报

11#
ID:169296 发表于 2017-4-9 12:13 | 只看该作者
楼主,可以分享一下程序和原理图吗?非常感谢! 1587254004@qq.com
回复

使用道具 举报

12#
ID:213928 发表于 2017-7-2 17:55 | 只看该作者
可以分享一下程序和原理图吗?非常感谢! 1065304416@qq.com
回复

使用道具 举报

13#
ID:430659 发表于 2018-12-16 17:23 | 只看该作者
可以分享一下程序和原理图吗?万分感谢! 308378000@qq.com
回复

使用道具 举报

14#
ID:523982 发表于 2019-4-29 20:02 | 只看该作者
可以分享一下程序和原理图吗?万分感谢!
回复

使用道具 举报

15#
ID:914953 发表于 2021-5-2 18:35 | 只看该作者
可以分享一下程序和原理图吗?万分感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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