论坛风格切换切换到宽版
  • 23872阅读
  • 72回复

用AVR ATmega8515单片机+12864显示屏玩GPS解码 [复制链接]

上一主题 下一主题
离线BG4UVR
 
发帖
11209
只看楼主 倒序阅读 0楼 发表于: 2007-05-15
原来的gps制作帖太长太乱了,重新开个帖。

效果见图。接线图和烧片文件见rar。

需要注意的是:烧写芯片时,熔丝需要设置使用内部8mhz的rc振荡器。

声明:由于使用了rc振荡器,所以可能会造成频率不稳定,从而无法正确对gps数据进行解码。我测试的情况是,可以非常稳定的工作。如果你的程序不能稳定工作,可以考虑外接8m晶体振荡器,并对熔丝进行相应设置。

我系统装了adobe 的dpf制作软件也不好使,所以直接上ddb文件了,protel99se格式的,好心人给转成pdf吧。

说明
1、本例子需要使用速率为9600bps的gps,并且需要有gpzda语句输出,gps需要使用nema0183协议输出。
2、本次例子删除了原所有版权显示信息,取消所以硬件设置、软件设置。本例子将只发布这一版代码,不再发布适合多种gps接口速率、多种速度单位、多种时间信息语句选择、多种mcu型号的版本。

感谢bg6agb帮忙转换电路图为pdf文件。

源程序已上传,main.txt,使用winavr-20070122编译通过。



2007.8.12编辑:

原代码中发现新的bug。就是显示语句,判断缓存数据是否有效时,使用了

if(buf_full|0x01)...

这样的语句,昨天在改写这个程序时,才发现。这根本不能正确判断缓存数据是否有效,应该改成:

if(buf_full&0x01)

附件中的文件未经修改,请自行改正,抱歉



2011.3.5:
1、解密期限到,上传完整的工程代码。大家不用再为那个12864的驱动而苦恼了
附件: SCH.pdf (0 K) 下载次数:1272
附件: 8515_GPS_12864_bigfont.rar (0 K) 下载次数:387
离线BD4VNF
发帖
1208
只看该作者 1楼 发表于: 2007-05-15
显示效果不错
离线coco001229
发帖
88
只看该作者 2楼 发表于: 2007-05-15
顶 使用avr 16行吗 8515太贵了哟 呵呵
离线bd8te
发帖
4221
只看该作者 3楼 发表于: 2007-05-16
屏那里有售?8515阿莫有15圆一片
离线BD8NCF
发帖
2079
只看该作者 4楼 发表于: 2007-05-16
'
顶 使用avr 16行吗 8515太贵了哟 呵呵
'
m16应该可以吧,不知道12864的驱动部分会有多大

偶用m8+1602+trimblegps做了一个,m8的空间只用了一半左右
改天整个12864来玩玩
离线BG4UVR
发帖
11209
只看该作者 5楼 发表于: 2007-05-16
我用8515的原因是,我原来和实验板全是51的,后来学习avr,为了能用上原来这些东西,不再重新买实验板,就用了这个8515,因为它的引脚和51是兼容的。

8515是flash是8kb的,m16应该是16kb的吧,所以装下这个代码是完全没有问题的,不过程序需要重新编译。
离线BG4UVR
发帖
11209
只看该作者 6楼 发表于: 2007-05-16
'
屏那里有售?8515阿莫有15圆一片
'

屏阿莫也有,不过比较贵一些
离线BG4UVR
发帖
11209
只看该作者 7楼 发表于: 2007-05-16
'
原来的gps制作帖太长太乱了,重新开个帖。
效果见图。接线图和烧片文件见rar。
需要注意的是:烧写芯片时,熔丝需要设置使用内部8mhz的rc振荡器。
声明:由于使用了rc振荡器,所以可能会造成频率不稳定,从而无法正确对gps数据进行解码。我测试的情况是,可以非常稳定的工作。如果你的程序不能稳定工作,可以考虑外接8m晶体振荡器,并对熔丝进行相应设置。
我系统装了adobe 的dpf制作软件也不好使,所以直接上ddb文件了,protel99se格式的,好心人给转成pdf吧。
说明
1、本例子需要使用速率为9600bps的gps,并且需要有gpzda语句输出,gps需要使用nema0183协议输出。
2、本次例子删除了原所有版权显示信息,取消所以硬件设置、软件设置。本例子将只发布这一版代码,不再发布适合多种gps接口速率、多种速度单位、多种时间信息语句选择、多种mcu型号的版本。
3、如有需要,将公开除12864驱动部分以外的完整代码。
感谢bg6agb帮忙转换电路图为pdf文件。
源代码,使用winavr-20070122编译调试通过。(由于论坛bug,源代码需要使用“引用回复”才可见——非开玩笑)
  1. /*************************************
  2.      gps解码程序
  3.      作者:bg4uvr
  4. 最后更新:
  5. 2007.03.30
  6.      1.5版
  7.      1、改为使用12864点阵屏显示
  8. ***************************************/
  9. //包含头文件
  10. #include <avr/io.h>
  11. #include <util/delay.h>
  12. #include <avr/pgmspace.h>
  13. #include <avr/interrupt.h>
  14. #include <avr/eeprom.h>
  15. #include "ks0108.h"
  16. #define time_area 8
  17. //gps数据存储数组
  18. unsigned char jd[10]={"00000.0000"};                  //经度
  19. unsigned char jd_a='*'                  //经度方向
  20. unsigned char wd[9]={"0000.0000"};                  //纬度
  21. unsigned char wd_a='*'                  //纬度方向
  22. unsigned char time[6]={"000000"};            //时间
  23. unsigned char date[6]={"000000"};            //日期
  24. unsigned char speed[5];            //速度
  25. unsigned char high[6];            //高度
  26. unsigned char angle[5];            //方位角
  27. unsigned char use_sat[2]={"00"};            //使用的卫星数
  28. unsigned char total_sat[2]={"00"};      //天空中总卫星数
  29. //串口中断需要的变量
  30. unsigned char seg_count;            //逗号计数器
  31. unsigned char dot_count;            //小数点计数器
  32. unsigned char byte_count;            //位数计数器
  33. unsigned char cmd_number;            //命令类型
  34. unsigned char mode;                        //0:结束模式,1:命令模式,2:数据模式
  35. volatile unsigned char buf_full;                  //1:整句接收完成,相应数据有效。0:缓存数据无效。
  36. unsigned char cmd[5];                  //命令类型存储数组
  37. //显示需要的变量
  38. unsigned char dsp_count;            //刷新次数计数器
  39. unsigned char time_count;
  40. volatile unsigned char high_num,a_num,s_num;
  41. void init_set(void);
  42. void sys_init(void);
  43. unsigned char week(unsigned char year, unsigned char mon, unsigned char day);
  44. int main(void)
  45. {
  46.      unsigned char i;
  47.      unsigned char bhour=0,bday=0,bmonth=0;
  48.      unsigned int byear=0;
  49.      sys_init();
  50.      while(1){
  51.            if(buf_full==0)                        //无gps信号时
  52.            {
  53.                  dsp_count++;
  54.                  _delay_ms(10);
  55.                  if(dsp_count>=200){
  56.                        clean_screen();                  //清屏
  57.                        str_58_disp(0,0,pstr("no gps connect.."),0);
  58.                        while(buf_full==0);
  59.                        clean_screen();      
  60.                        dsp_count=0;
  61.                  }
  62.            }
  63.            else{                                    //有gps信号时
  64.                  if(buf_full|0x01){                        //gga语句
  65.                        ascii_58_disp(0,0,jd_a,0);                  //显示经度
  66.                        for(i=0;i<3;i++){
  67.                              ascii_58_disp(0,(i+1)*6,jd[i],0);
  68.                        }
  69.                        ascii_58_disp(0,24,'.',0);
  70.                        for(i=3;i<10;i++){
  71.                              ascii_58_disp(0,(i+2)*6,jd[i],0);
  72.                        }
  73.                        ascii_58_disp(1,0,wd_a,0);                  //显示纬度
  74.                        for(i=0;i<2;i++){
  75.                              ascii_58_disp(1,(i+2)*6,wd[i],0);
  76.                        }                  
  77.                        ascii_58_disp(1,24,'.',0);
  78.                        for(i=2;i<9;i++){
  79.                              ascii_58_disp(1,(i+3)*6,wd[i],0);
  80.                        }
  81.                        ascii_58_disp(2,96,use_sat[0],0);            //显示接收卫星数
  82.                        ascii_58_disp(2,102,use_sat[1],0);
  83.                        ascii_58_disp(2,108,'/',0);
  84.                        str_58_disp(2,0,pstr("hi:"),0);      
  85.                        if(high_num<6)                                          //高度显示
  86.                        {
  87.                              for(i=0;i<(6-high_num);i++)
  88.                              {
  89.                                    ascii_58_disp(2,(3+i)*6,0x20,0);
  90.                              }
  91.                        }
  92.                        for(i=0;i<high_num;i++)
  93.                        {                                    
  94.                              ascii_58_disp(2,(9-high_num+i)*6,high[i],0);
  95.                        }                        
  96.                        str_58_disp(2,54,pstr("m u/t:"),0);
  97.                        buf_full&=~0x01;
  98.                        dsp_count=0;
  99.                  }
  100.                  if(buf_full|0x02){                        //gsv语句
  101.                        ascii_58_disp(2,114,total_sat[0],0);
  102.                        ascii_58_disp(2,120,total_sat[1],0);
  103.                        buf_full&=~0x02;
  104.                        dsp_count=0;
  105.                  }
  106.                  if(buf_full|0x04)
  107.                  {
  108.                        str_58_disp(0,78,pstr("ag:"),0);//方位角显示
  109.                        if(a_num<5)
  110.                        {
  111.                              for(i=0;i<(5-a_num);i++)
  112.                              {
  113.                                    ascii_58_disp(0,(16+i)*6,0x20,0);
  114.                              }
  115.                        }
  116.                        for(i=0;i<a_num;i++)
  117.                        {                                    
  118.                              ascii_58_disp(0,(21-a_num+i)*6,angle[i],0);
  119.                        }      
  120.                        str_58_disp(1,78,pstr("sp:"),0);      //速度显示
  121.                        if(s_num<5)      
  122.                        {
  123.                              for(i=0;i<(5-s_num);i++)
  124.                              {
  125.                                    ascii_58_disp(1,(16+i)*6,0x20,0);
  126.                              }
  127.                        }
  128.                        for(i=0;i<s_num;i++)
  129.                        {                                    
  130.                              ascii_58_disp(1,(21-s_num+i)*6,speed[i],0);
  131.                        }      
  132.                        buf_full&=~0x04;
  133.                        dsp_count=0;
  134.                  }
  135.                  if(buf_full|0x08){
  136.                        if(bhour!=((time[0]-0x30)*10+time[1]-0x30)+time_area){
  137.                              bhour=((time[0]-0x30)*10+time[1]-0x30)+time_area;                  //北京时间转换
  138.                              bday=(date[0]-0x30)*10+date[1]-0x30;
  139.                              bmonth=(date[2]-0x30)*10+date[3]-0x30;
  140.                              byear=(date[4]-0x30)*10+date[5]-0x30+2000;
  141.                              if(bhour>=24){                              //如果小时数大于24
  142.                                    bhour-=24;                                    //小时数减24
  143.                                    bday++;                                          //日期数加1
  144.                                    switch(bday){                                    //判断日期
  145.                                          case 29:                                          //普通年的2月份
  146.                                                if((!((byear%400==0)||((byear%4==0)&&(byear%100!=0)))&&(bmonth==2))){
  147.                                                      bday=1;
  148.                                                      bmonth++;
  149.                                                }
  150.                                                break;
  151.                                          case 30:                                          //如果是闰年的2月
  152.                                                if(((byear%400==0)||((byear%4==0)&&(byear%100!=0)))&&(bmonth==2)){
  153.                                                      bday=1;
  154.                                                      bmonth++;
  155.                                                }
  156.                                                break;
  157.                                          case 31:
  158.                                                if((bmonth==4)||(bmonth==6)||(bmonth==9)||(bmonth==11)){
  159.                                                      bday=1;
  160.                                                      bmonth++;
  161.                                                }
  162.                                                break;
  163.                                          case 32:
  164.                                                bday=1;
  165.                                                bmonth++;
  166.                                                if(bmonth>=13){
  167.                                                      byear++;
  168.                                                      bmonth=1;
  169.                                                }
  170.                                                break;
  171.                                    }
  172.                              }
  173.                        }
  174.                        ascii_58_disp(3,0,ƈ',0);
  175.                        ascii_58_disp(3,6,Ɔ',0);
  176.                        ascii_58_disp(3,12,(byear%100)/10+0x30,0);
  177.                        ascii_58_disp(3,18,byear%10+0x30,0);
  178.                        ascii_58_disp(3,24,'/',0);
  179.                        ascii_58_disp(3,30,bmonth/10+0x30,0);
  180.                        ascii_58_disp(3,36,bmonth%10+0x30,0);
  181.                        ascii_58_disp(3,42,'/',0);
  182.                        ascii_58_disp(3,48,bday/10+0x30,0);
  183.                        ascii_58_disp(3,54,bday%10+0x30,0);
  184.                        
  185.                        switch(week(byear%100,bmonth,bday)){
  186.                              case 0:
  187.                                    str_58_disp(3,120,pstr("7"),0);
  188.                                    break;
  189.                              case 1:
  190.                                    str_58_disp(3,120,pstr("1"),0);
  191.                                    break;
  192.                              case 2:
  193.                                    str_58_disp(3,120,pstr("2"),0);
  194.                                    break;                                    
  195.                              case 3:
  196.                                    str_58_disp(3,120,pstr("3"),0);
  197.                                    break;                                    
  198.                              case 4:
  199.                                    str_58_disp(3,120,pstr("4"),0);
  200.                                    break;                                    
  201.                              case 5:
  202.                                    str_58_disp(3,120,pstr("5"),0);
  203.                                    break;                                    
  204.                              case 6:
  205.                                    str_58_disp(3,120,pstr("6"),0);
  206.                                    break;                                    
  207.                        }
  208.                        if(bhour/10!=0)
  209.                        {
  210.                              ascii_58_disp(3,66,bhour/10+0x30,0);
  211.                              num1632_disp(4,0,bhour/10,0);
  212.                        }
  213.                        else
  214.                        {
  215.                              ascii_58_disp(3,66,0x20,0);
  216.                              num1632_disp(4,0,11,0);
  217.                        }
  218.                        ascii_58_disp(3,72,bhour%10+0x30,0);
  219.                        ascii_58_disp(3,78,':',0);
  220.                        ascii_58_disp(3,84,time[2],0);
  221.                        ascii_58_disp(3,90,time[3],0);
  222.                        ascii_58_disp(3,96,':',0);
  223.                        ascii_58_disp(3,102,time[4],0);
  224.                        ascii_58_disp(3,108,time[5],0);
  225.                        
  226.                        num1632_disp(4,1,bhour%10,0);
  227.                        num1632_disp(4,2,10,0);
  228.                        num1632_disp(4,3,time[2]-0x30,0);
  229.                        num1632_disp(4,4,time[3]-0x30,0);
  230.                        num1632_disp(4,5,10,0);
  231.                        num1632_disp(4,6,time[4]-0x30,0);
  232.                        num1632_disp(4,7,time[5]-0x30,0);
  233.                        
  234.                        buf_full&=~0x08;
  235.                        dsp_count=0;
  236.                  }
  237.            }
  238.      }
  239. }
  240. //计算星期
  241. unsigned char week(unsigned char year, unsigned char mon, unsigned char day)
  242. {
  243.   const prog_uchar weekdays[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
  244.                           // 31 28 31 30 31 30 31 31 30 31 30
  245.   return (6-1 + (year>>2) + year + weekdays[mon-1] + day + (((year & 3) || mon > 2)? 1 : 0)) % 7;
  246.   //完整的计算星期的公式:
  247.   //(year>>2) - (year / 100) + (year/400) + year +
  248.   //   weekdays[mon-1] + day + ((!isleap(year) || mon > 2)? 1 : 0)) % 7;
  249. }
  250. //usart 初始化
  251. void init_usart(void)      
  252. {
  253.   ucsrc = (1<<ursel) | 0x06;                    //异步,8位数据,无奇偶校验,一个停止位,无倍速
  254.   ubrrl= (f_cpu/9600/16-1)%256;              //ubrr= (f_cpu/(baudrate*16))-1;
  255.   ubrrh= (f_cpu/9600/16-1)/256;
  256.   ucsra = 0x00;                                      //使能接收中断,使能接收,使能发送
  257.   ucsrb = (1<<rxcie)|(1<<rxen)|(1<<txen);
  258.      sei();                                                      //总中断允许      
  259. }
  260. //系统初始化
  261. void sys_init()
  262. {
  263.      lcd_reset();                        //初始化lcd
  264.      clean_screen();
  265.      init_usart();                  //初始化串口
  266. }
  267. //串口接收中断
  268. signal(sig_uart_recv) //串口接收中断服务程序
  269. {
  270.      unsigned char tmp;
  271.      tmp=udr;
  272.      switch(tmp){
  273.            case '$':
  274.                  cmd_number=0;            //命令类型清空
  275.                  mode=1;                        //接收命令模式
  276.                  byte_count=0;            //接收位数清空
  277.                  break;
  278.            case ',':
  279.                  seg_count++;            //逗号计数加1
  280.                  byte_count=0;
  281.                  break;
  282.            case '*':
  283.                  switch(cmd_number){
  284.                        case 1:
  285.                              buf_full|=0x01;
  286.                              break;
  287.                        case 2:
  288.                              buf_full|=0x02;
  289.                              break;
  290.                        case 3:
  291.                              buf_full|=0x04;
  292.                              break;
  293.                        case 4:
  294.                              buf_full|=0x08;
  295.                              break;
  296.                  }
  297.                  mode=0;
  298.                  break;
  299.            default:
  300.                  if(mode==1){
  301.                        //命令种类判断
  302.                        cmd[byte_count]=tmp;                  //接收字符放入类型缓存
  303.                        if(byte_count>=4){                        //如果类型数据接收完毕,判断类型
  304.                              if(cmd[0]=='g'){
  305.                                    if(cmd[1]=='p'){
  306.                                          if(cmd[2]=='g'){
  307.                                                if(cmd[3]=='g'){
  308.                                                      if(cmd[4]=='a'){
  309.                                                            cmd_number=1;
  310.                                                            mode=2;
  311.                                                            seg_count=0;
  312.                                                            byte_count=0;
  313.                                                            high_num=0;
  314.                                                      }
  315.                                                }
  316.                                                else if(cmd[3]=='s'){
  317.                                                      if(cmd[4]=='v'){
  318.                                                            cmd_number=2;
  319.                                                            mode=2;
  320.                                                            seg_count=0;
  321.                                                            byte_count=0;
  322.                                                      }
  323.                                                }
  324.                                          }
  325.                                          else if(cmd[2]=='r'){
  326.                                                if(cmd[3]=='m'){
  327.                                                      if(cmd[4]=='c'){
  328.                                                            cmd_number=3;
  329.                                                            mode=2;
  330.                                                            seg_count=0;
  331.                                                            byte_count=0;
  332.                                                            a_num=0;
  333.                                                            s_num=0;
  334.                                                      }
  335.                                                }
  336.                                          }
  337.                                          else if(cmd[2]=='z'){
  338.                                                if(cmd[3]=='d'){
  339.                                                      if(cmd[4]=='a'){
  340.                                                            cmd_number=4;
  341.                                                            mode=2;
  342.                                                            seg_count=0;
  343.                                                            byte_count=0;
  344.                                                      }
  345.                                                }
  346.                                          }
  347.                                    }
  348.                              }
  349.                        }
  350.                  }
  351.                  else if(mode==2){
  352.                        //接收数据处理
  353.                        switch (cmd_number){
  354.                              case 1:                        //类型1数据接收。gpgga
  355.                                    switch(seg_count){
  356.                                          case 2:                                                //纬度处理
  357.                                                if(byte_count<9){
  358.                                                      wd[byte_count]=tmp;
  359.                                                }
  360.                                                break;
  361.                                          case 3:                                                //纬度方向处理
  362.                                                if(byte_count<1){
  363.                                                      wd_a=tmp;
  364.                                                }
  365.                                                break;
  366.                                          case 4:                                                //经度处理
  367.                                                if(byte_count<10){
  368.                                                      jd[byte_count]=tmp;
  369.                                                }
  370.                                                break;
  371.                                          case 5:                                                //经度方向处理
  372.                                                if(byte_count<1){
  373.                                                      jd_a=tmp;
  374.                                                }
  375.                                                break;
  376.                                          case 7:                                                //定位使用的卫星数
  377.                                                if(byte_count<2){
  378.                                                      use_sat[byte_count]=tmp;
  379.                                                }
  380.                                                break;
  381.                                          case 9:                                                //高度处理
  382.                                                if(byte_count<6){
  383.                                                      high[byte_count]=tmp;
  384.                                                      high_num++;
  385.                                                }
  386.                                                break;
  387.                                    }
  388.                                    break;
  389.                              case 2:                        //类型2数据接收。gpgsv
  390.                                    switch(seg_count){
  391.                                          case 3:                                                //天空中的卫星总数
  392.                                                if(byte_count<2){
  393.                                                      total_sat[byte_count]=tmp;
  394.                                                }
  395.                                                break;
  396.                                    }
  397.                                    break;
  398.                              case 3:                        //类型3数据接收。gprmc
  399.                                    switch(seg_count){
  400.                                          case 7:                                                //速度处理
  401.                                                if(byte_count<5){
  402.                                                      speed[byte_count]=tmp;
  403.                                                      s_num++;
  404.                                                }
  405.                                                break;
  406.                                          case 8:                                                //方位角处理
  407.                                                if(byte_count<5){
  408.                                                      angle[byte_count]=tmp;
  409.                                                      a_num++;
  410.                                                }
  411.                                                break;
  412.                                    }
  413.                                    break;
  414.                              case 4:                        //类型4数据接收。gpzda
  415.                                    switch(seg_count){
  416.                                          case 1:
  417.                                                if(byte_count<6){                        //时间处理
  418.                                                      time[byte_count]=tmp;      
  419.                                                }
  420.                                                break;
  421.                                          case 2:
  422.                                                if(byte_count<2){
  423.                                                      date[byte_count]=tmp;
  424.                                                }
  425.                                                break;
  426.                                          case 3:
  427.                                                if(byte_count<2){
  428.                                                      date[byte_count+2]=tmp;
  429.                                                }
  430.                                                break;
  431.                                          case 4:
  432.                                                if((byte_count<4)&&(byte_count>1)){
  433.                                                      date[byte_count+2]=tmp;
  434.                                                }
  435.                                                break;                                          
  436.                                    }
  437.                                    break;
  438.                        }
  439.                  }
  440.                  byte_count++;            //接收数位加1
  441.                  break;
  442.      }
  443. }
  444. /*
  445. $gpgga,024518.00,3153.7225,n,12111.9951,e,1,04,1.48,-00009,m,007,m,,*4c
  446. $gpgll,3153.7225,n,12111.9951,e,024518.00,a,a*63
  447. $gpvtg,000.0,t,004.7,m,000.0,n,000.0,k,a*20
  448. $gpgsa,a,2,04,08,17,20,,,,,,,,,1.48,1.48,0.03*08
  449. $gpgsv,2,1,08,04,15,231,38,08,29,218,42,11,49,043,,19,09,082,*76
  450. $gpgsv,2,2,08,27,14,198,29,28,71,316,,17,32,300,36,20,45,124,43*70
  451. $gprmc,024518.00,a,3153.7225,n,12111.9951,e,000.0,000.0,280107,04.7,w,a*12
  452. $gpzda,024519.45,28,01,2007,,*62
  453. */
  454. /*
  455. 012345678901234567890
  456. e121.22.2231 ag:112.1
  457. n 23.23.2341 sp:234.1
  458. hi:12345.5m u/t:03/12
  459. 2007/12/13 23[s:23]53 7
  460. */
'

12345
离线hocool
发帖
20748
只看该作者 8楼 发表于: 2007-05-16
佩服楼主直接公布全部资料、有气魄。非平常diyer可比。
离线BD4VNF
发帖
1208
只看该作者 9楼 发表于: 2007-05-17
我也发一个玩玩
离线coco001229
发帖
88
只看该作者 10楼 发表于: 2007-05-17
'
原来的gps制作帖太长太乱了,重新开个帖。
效果见图。接线图和烧片文件见rar。
需要注意的是:烧写芯片时,熔丝需要设置使用内部8mhz的rc振荡器。
声明:由于使用了rc振荡器,所以可能会造成频率不稳定,从而无法正确对gps数据进行解码。我测试的情况是,可以非常稳定的工作。如果你的程序不能稳定工作,可以考虑外接8m晶体振荡器,并对熔丝进行相应设置。
我系统装了adobe 的dpf制作软件也不好使,所以直接上ddb文件了,protel99se格式的,好心人给转成pdf吧。
说明
1、本例子需要使用速率为9600bps的gps,并且需要有gpzda语句输出,gps需要使用nema0183协议输出。
2、本次例子删除了原所有版权显示信息,取消所以硬件设置、软件设置。本例子将只发布这一版代码,不再发布适合多种gps接口速率、多种速度单位、多种时间信息语句选择、多种mcu型号的版本。
感谢bg6agb帮忙转换电路图为pdf文件。
源程序已上传,main.txt,使用winavr-20070122编译通过。
'



谢谢提供源程序 可以编译使用 16啦 呵呵
离线coco001229
发帖
88
只看该作者 11楼 发表于: 2007-05-17
请教:有些gps模块一般缺省不提供gpzda输出,为什么不在rmc里直接提取时间信息,gpzda好像只有在与卫星同步后才有输出,精度比rmc高些吗
离线BG4UVR
发帖
11209
只看该作者 12楼 发表于: 2007-05-17
'
请教:有些gps模块一般缺省不提供gpzda输出,为什么不在rmc里直接提取时间信息,gpzda好像只有在与卫星同步后才有输出,精度比rmc高些吗
'

在gps模块接有备份电池的情况下,如果关机前定过位,那么一开机gpzda的时间就是一直准确的走的,即使没有定位。但rmc却需要再次定位后才有时间输出。

上面的说明有误,请看下面的帖子
离线coco001229
发帖
88
只看该作者 13楼 发表于: 2007-05-18
'
在gps模块接有备份电池的情况下,如果关机前定过位,那么一开机gpzda的时间就是一直准确的走的,即使没有定位。但rmc却需要再次定位后才有时间输出。
'

哦 明白 谢谢~~又学了一招
离线BD7LM
发帖
1367
只看该作者 14楼 发表于: 2007-05-22
'
在gps模块接有备份电池的情况下,如果关机前定过位,那么一开机gpzda的时间就是一直准确的走的,即使没有定位。但rmc却需要再次定位后才有时间输出。
'

不会的,rmc语句就算在没接天线的情况下也会输出实时时间的,相反rmc提供的速度是以
海里为单位,而zda提供的速度是以公里为单位,这样在编程方面是比较容易的.
离线BG4UVR
发帖
11209
只看该作者 15楼 发表于: 2007-05-22
$gprmc,031853.36,v,,,,,,,,,,n*74

$gpzda,031854.30,22,05,2007,,*6e

是了,刚看了一下,rmc不定位也是输出时间的。不过zda似乎不输出速度。
离线BG4UVR
发帖
11209
只看该作者 16楼 发表于: 2007-05-28
今天又试了一下程序,发现当初使用zda语句而没有使用rmc语句进行时间解码的原因是:

接有备份电池的情况下:
1、rmc语句在开机后未定位时,没有日期数据输出。
2、zda语句,如果曾经定过位,就一直有日期输出。
离线BG4UVR
发帖
11209
只看该作者 17楼 发表于: 2007-05-31
不错。不过好像还是没有日期啊?
离线HK大飛
发帖
336
只看该作者 18楼 发表于: 2007-05-31
好東西!有時間做個玩玩。
离线BG4UVR
发帖
11209
只看该作者 19楼 发表于: 2007-05-31
'
这回对了 [表情]
'

我以为我的程序又出bug了呢