微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于reb3571 + STC12C5A60S2 + LCD12864 + 18650的便携GPS定位系统

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

时间:10-02 整理:3721RD 点击:

前段时间受朋友影响,决定买个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和升压模块


初始化状态


测试的结果



有技术参数吗?

哪部分的参数?

用u_blox的GPS可以吗

我程序是按照串行通信收取的GPS数据,波特率4800BPS,我觉得只要你买的模块遵守NMEA0183协议 哪家的GPS模块都差不多 我用那个模块是因为它便宜 好不好还真不知道 我就是为了学习一下 所以哪个便宜买哪个  

不错!值得学习!

顶起,不错的,不知道是用的哪家的GPS模块

好好学习

求分享,求开源!

顶。

新手学习一下!

挺好,呵呵

谢谢小编分享

强烈要求小编开源 哈哈哈  至少做下简单说明 谢谢

好好学习天天向上谢谢lz

赶不上啊

好好学习了

还可以撒

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top