搜索
bottom↓
回复: 32

大奎的GPS记录仪项目(尚未开始)

[复制链接]

出0入0汤圆

发表于 2011-12-30 15:31:37 | 显示全部楼层 |阅读模式
【背景】
对GPS很感兴趣,寒假里准备做一个GPS记录仪。
在论坛发个帖子,算是给自己一个督促,也记录下思考过程。欢迎批评。

【具体想法】
1.用STC单片机,经纬度准备记录到片内EEPROM,或者片外
2.可以定时或者手动记录
3.串口读出到电脑,在google地球里生成路径
4.考虑其他功能

【元器件】
1.GPS模块KET GWG6103,串口的,不知道好坏呢,ttl 3.3v电平,正考虑与5V单片机通信问题。

出0入0汤圆

 楼主| 发表于 2012-1-2 17:37:18 | 显示全部楼层
【考虑到的步骤】
0.单片机最小系统测试
1.片内EEPROM读写与显示
2.片外EEPROM读写
3.串口通信
4.串口信息存储
5.GPS信息获取与显示
6.GPS信息存储
7.定时和手动记录
8.数据传输到上位机
9.数据生成KML文件
10.其它

出0入0汤圆

 楼主| 发表于 2012-1-8 15:27:44 | 显示全部楼层
【进度】
0.单片机最小系统测试 完成
1.片内EEPROM读写与现实。 完成
整了一个stc89c52的读写片内EEPROM的头文件,函数摘自郭天祥的课本。
stc89eeprom.h
//ISP操作命令
#define RdCommand 0x01
#define PrgCommand 0x02
#define EraseCommand 0x03
//成败
#define Error 1
#define Ok 0
#define WaitTime 0x01//定义等待时间
//寄存器
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
//打开ISPIAP功能
void ISP_IAP_enable(void)
{
        EA=0;
        ISP_CONTR=ISP_CONTR&0x18;
        ISP_CONTR=ISP_CONTR|WaitTime;
        ISP_CONTR=ISP_CONTR|0x80;
}
//关闭ISPIAP功能
void ISP_IAP_disable(void)
{
        ISP_CONTR=ISP_CONTR&0x7f;
        ISP_TRIG=0x00;
        EA=1;
}
//公用触发功能
void ISPgoon(void)
{
        ISP_IAP_enable();
        ISP_TRIG=0x46;
        ISP_TRIG=0xb9;
        _nop_();
}
//字节读
unsigned char byte_read(unsigned int byte_addr)
{
        ISP_ADDRH=(unsigned char)(byte_addr>>8);
        ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);
        ISP_CMD=ISP_CMD&0xf8;
        ISP_CMD=ISP_CMD|RdCommand;
        ISPgoon();
        ISP_IAP_disable();
        return (ISP_DATA);
}
//字节写
unsigned char byte_write(unsigned int byte_addr,unsigned char original_data)
{
        ISP_ADDRH=(unsigned char)(byte_addr>>8);
        ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);
        ISP_CMD=ISP_CMD&0xf8;
        ISP_CMD=ISP_CMD|PrgCommand;
        ISP_DATA=original_data;
        ISPgoon();
        ISP_IAP_disable();
}
//扇区擦出
void SectorErase(unsigned int sector_addr)
{
        unsigned int iSectorAddr;
        iSectorAddr=(sector_addr & 0xfe00);
        ISP_ADDRH=(unsigned char)(iSectorAddr>>8);
        ISP_ADDRL=0x00;
        ISP_CMD=ISP_CMD&0xf8;
        ISP_CMD=ISP_CMD|EraseCommand;
        ISPgoon();
        ISP_IAP_disable();
}


在主函数里调用eeprom89c52.c
#include<stc89eeprom.h>
在main函数中
if(byte_read(0x2000)==255)
        byte_write(0x2000,128);
while(1){
    display_num(2,0,byte_read(0x2000));//调用1602显示
}
【硬件】


(原文件名:图像1145.jpg)

出0入0汤圆

 楼主| 发表于 2012-1-9 21:43:16 | 显示全部楼层
【进度】
2.片外EEPROM读写
片外存储单元采用AT24C02测试,生成环境可能使用24c16
头文件24C02.H
sbit sda = P0^0;
sbit scl = P0^1;
void start(){sda=1;delayns();scl=1;delayns();sda=0;delayns();}
void stop(){sda=0;delayns();scl=1;delayns();sda=1;delayns();}
void response(){uchar i;scl=1;delayns();while((sda==1)&&(i<250))i++;scl=0;delayns();}
void init(){sda=1;delayns();scl=1;delayns();}
void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delayns();sda=CY;delayns();scl=1;delayns();}scl=0;delayns();scl=1;delayns();}
uchar read_byte(){uchar i,k;scl=0;delayns();sda=1;delayns();for(i=0;i<8;i++){scl=1;delayns();k=(k<<1)|sda;scl=0;delayns();}return k;}
void write_add(uchar address,uchar date){start();write_byte(0xa0);response();write_byte(address);        response();write_byte(date);response();stop();}
uchar read_add(uchar address){uchar date;start();write_byte(0xa0);response();write_byte(address);response();start();write_byte(0xa1);response();date=read_byte();stop();return date;}
在主函数里调用
display_num(1,0,read_add(1));//使用lcd显示地址1(第一扇区)读出的内容
write_add(3,128);//在地址3写入数据128

出0入0汤圆

 楼主| 发表于 2012-1-10 15:05:04 | 显示全部楼层
【进度】
3.串口通信(这里只是实现了串口的读,从单片机读出到电脑上)
//波特率9600调用时先初始化,再用comm函数即可
void com_init(void){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xfd;TL1=0xfd;TR1=1;}
void comm(char *parr){do{SBUF=*parr++;while(!TI);TI=0;}while(*parr);}
void comm_num(int a)
{SBUF=a;while(!TI)TI=0;}
void comm_char(char a)
{SBUF=a;while(!TI)TI=0;}
头像被屏蔽

出0入0汤圆

发表于 2012-1-10 17:13:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-1-10 23:44:15 | 显示全部楼层
关注一下~

出0入0汤圆

 楼主| 发表于 2012-1-12 21:25:49 | 显示全部楼层
【进展】这几日事情挺多,时间比较少,正在折腾串口收的程序
刚刚参考坛子里的贴,把18B20的函数加了关中断,现在串口收发不乱DS18B20了
继续收函数

出0入0汤圆

 楼主| 发表于 2012-1-17 16:22:09 | 显示全部楼层
【进度】3.串口通信
在串口中断里处理数据,这是编程大忌讳。不过现在也只能这么整了。
首先在GPS.H里定义数据结构
typedef struct
{
        UCHAR Block;
        UCHAR BlockIndex;
        UCHAR UTCTime[10];        //hhmmss.mmm
        UCHAR Status;         //A- 有效定位 V-无效定位
        UCHAR Latitude[9];        //ddmm.mmmm
        UCHAR NS;                //N/S
        UCHAR Longitude[10];        //dddmm.mmmm
        UCHAR EW;                //E/W
        UCHAR Speed[5];        //速率000.0~999.9节
        UCHAR Course[5];        //航向000.0~359.9度
        UCHAR UTCDate[6];        //ddmmyy
}stru_GPSRMC;
然后再串口里对读入的数据进行分析【5】
void Serial() interrupt 4
{
        COMMLED=1;
        if(RI)
        {
                RI=0;//
                if(GPSDataStart)
                {
                        switch(GPSDataTypeStrBuffIndex)
                        {
                                case 6:if(GPSDataTypeStrBuff[5]=='C')GPSDataType=GPS_GPRMC;if(SBUF==',') GPSDataTypeStrBuffIndex=255;break;
                                case 255:if(GPSDataType==GPS_GPRMC)
                                                        switch(SBUF)
                                                        {
                                                                case '*':GPSDataStart=0;GPSDataTypeStrBuffIndex=0;ReciveFlag=1;break;
                                                                case ',':GPS_RMC_Data.Block++;GPS_RMC_Data.BlockIndex=0;break;
                                                                default :{switch(GPS_RMC_Data.Block){case 0:GPS_RMC_Data.UTCTime[GPS_RMC_Data.BlockIndex]=SBUF;break;                                                                                case 1:GPS_RMC_Data.Status=SBUF;break;                                             case 2:GPS_RMC_Data.Latitude[GPS_RMC_Data.BlockIndex]=SBUF;break;                                                                                case 3:GPS_RMC_Data.NS=SBUF;break;                                                                                case 4:GPS_RMC_Data.Longitude[GPS_RMC_Data.BlockIndex]=SBUF;break;                                                                                case 5:GPS_RMC_Data.EW=SBUF;break;                                                                                case 6:GPS_RMC_Data.Speed[GPS_RMC_Data.BlockIndex]=SBUF;break;                                         case 7:GPS_RMC_Data.Course[GPS_RMC_Data.BlockIndex]=SBUF;break;                                        case 8:GPS_RMC_Data.UTCDate[GPS_RMC_Data.BlockIndex]=SBUF;break;                                                                        }                                                                        GPS_RMC_Data.BlockIndex++;}break;//break default
                                                        }//swtich sbuf
                                                break;//break 255
                                default:GPSDataTypeStrBuff[GPSDataTypeStrBuffIndex++]=SBUF;        break;//break default
                        }
                }
                if(SBUF=='$')
                {
                        GPSDataStart=1;
                        GPS_RMC_Data.Block=0;
                        GPS_RMC_Data.BlockIndex=0;
                        GPSDataTypeStrBuffIndex=1;
                }
        }
        COMMLED=0;
}
【参考】
1.GPS开源活动,用C3-370C+STM32+SD卡+nokia5110液晶做GPS信息显示和路径记录(更新)+送PCB板(快递费自理) http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4908287&bbs_page_no=1&bbs_id=3072
2.【配阿莫的gps开源我发个最简单的gps信息显示项目】兄弟篇 nmea0183协议
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4391290&bbs_page_no=1&bbs_id=3072
3.GPS用到的协议及工具
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5011361&bbs_page_no=1&bbs_id=3072
4.发个GPS NMEA协议解码方法
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4290303&bbs_page_no=1&bbs_id=3072
5.第一版 DIY GPS 记录器硬件完成, 征求大家的意见修改, 第二版酝酿中...
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4281969&bbs_page_no=1&bbs_id=3072

出0入0汤圆

 楼主| 发表于 2012-1-18 22:34:21 | 显示全部楼层
【进度】
4.串口信息存储
片外EEPROM读写,可能需要一定的延时才能保证数据存储进EEPROM,但同时有可能打乱部分元器件的时序,很是混乱,应该有一套解决的办法。
5.GPS信息获取与显示
GPS模块KET GWG6103 支持3.3V到5v的电压,红正黑负棕txd黄rxd,这里没有用到rxd所以不接它,接上电之后红灯亮,表示通电。在户外的话,绿灯开始闪烁,表示正在搜星,绿灯常亮表示数据定位成功。时间大概要五分钟左右。
这里使用【进度】3.里的串口解析方法,进行解析。
定位成功,在Google earth里验证,误差不超过10m。

出0入0汤圆

 楼主| 发表于 2012-1-18 22:39:39 | 显示全部楼层
你这个软件,我下载下来了,但是不能用。我现在使用的是winfast navigator,不带地图,比较简单易用。谢谢你

回复【5楼】armecos  
上位机程序用这个吧,不用自己写了。

图片 (原文件名:yydemo.jpg)
程序 (原文件名:yygps.rar)
-----------------------------------------------------------------------

出0入4汤圆

发表于 2012-1-18 22:59:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-19 10:38:56 | 显示全部楼层
lz 在庄里上班?
有兴趣可以 来我们这看看

出0入0汤圆

 楼主| 发表于 2012-1-19 11:26:18 | 显示全部楼层
回复【12楼】3466756555  
-----------------------------------------------------------------------
呵呵,在庄里。

出0入0汤圆

发表于 2012-1-19 11:46:29 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2012-1-20 21:17:22 | 显示全部楼层
【进度】
5.获得当前UTC时间、速度以及航向。使用1602显示不开,加入了红外遥控器。根据按键选择显示的内容。当然这有点麻烦,不如加几个按钮了。

出0入0汤圆

发表于 2012-1-20 22:24:40 | 显示全部楼层
鼓励一下

出0入0汤圆

 楼主| 发表于 2012-1-21 21:02:37 | 显示全部楼层
【进度】
6.GPS信息存储
使用at24c02将当前信息两位一块存成char型数据。数据结构为mmddhhmmssddmmssssddmmssss在24C02的第0位存当前存成的信息个数。其它以13位递增求存储和读取地址。

出0入0汤圆

 楼主| 发表于 2012-1-27 15:10:11 | 显示全部楼层
【进度】
7.定时和手动记录
目前采用扫描按钮的方式实现了手动记录,不再考虑定时记录。
下一步是实现读出和转换为KML文件。

出0入0汤圆

 楼主| 发表于 2012-1-30 21:19:01 | 显示全部楼层
【进度】
7.定时和手动记录
按键接到P1,四键功能。

出0入0汤圆

发表于 2012-1-30 21:59:17 | 显示全部楼层
回复【10楼】gong3721  大奎
-----------------------------------------------------------------------
怎么使用的?我的弹出消息?

出0入0汤圆

 楼主| 发表于 2012-1-31 12:00:23 | 显示全部楼层
回复【20楼】sundingding  
-----------------------------------------------------------------------
安装好程序之后,要注意设置波特率等信息和GPS模块一致,插上模块就可以用了。

出0入0汤圆

 楼主| 发表于 2012-2-1 18:03:05 | 显示全部楼层
【进度】
8.数据传输到上位机
这里为了简单起见,直接使用stc-isp的串口调试器功能。发给单片机一个读指令@,读出at24c02中存储的数据
9.数据生成KML文件
使用java程序,将存储数据解析成转换器可以接受的格式。在线转换器 http://www.gpsvisualizer.com/map_input?form=googleearth
生成kmz文件,使用google earth打开即可以看到跟踪路径。

出0入0汤圆

 楼主| 发表于 2012-2-1 18:18:24 | 显示全部楼层
整机图如下:

(原文件名:整机.jpg)
java处理程序

(原文件名:java.JPG)
最终在google earth效果图

(原文件名:kmz.JPG)

出0入0汤圆

发表于 2012-2-1 20:47:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-3 13:21:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-3 16:08:21 | 显示全部楼层
楼上的电路也太复杂了吧。

出0入0汤圆

 楼主| 发表于 2012-2-5 13:22:30 | 显示全部楼层
哦,用的是万能版。看起来比较乱的缘故。
回复【26楼】dianzichina  
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-2-5 13:29:17 | 显示全部楼层
8L解析RMC数据的方法看着太让人头大了,在论坛中有别的方法可以用呢。

存储数据时建议不要用单片机内部所谓的EEPROM了,很容易出问题,建议AT45DB161这样的芯片。

出0入0汤圆

 楼主| 发表于 2012-2-12 15:59:55 | 显示全部楼层
回复【29楼】XA144F  
-----------------------------------------------------------------------
恩,的确解析部分相当乱。现在用的是AT24C02。内部EEPROM只是测试玩呢。

出0入0汤圆

发表于 2012-3-29 10:08:59 | 显示全部楼层
LZ全能,支持个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 15:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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