[51单片机] gps串口接收数据,显示时间到1602上,可全是0!求助

[复制链接]
1221|0
 楼主| huihui1011 发表于 2014-4-28 20:26 | 显示全部楼层 |阅读模式
  1. #include <reg52.H>
  2. #include <stdio.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. //char code TIME_AREA= 8;                  //时区
  6. //GPS数据存储数组
  7. unsigned char JD[10];                  //经度
  8. unsigned char JD_a;                  //经度方向
  9. unsigned char WD[9];                  //纬度
  10. unsigned char WD_a;                  //纬度方向
  11.         uchar time[6];            //时间
  12. //串口中断需要的变量
  13. unsigned char seg_count;            //逗号计数器
  14. //unsigned char dot_count;            //小数点计数器
  15. unsigned char byte_count;            //位数计数器
  16. unsigned char cmd_number;            //命令类型
  17. unsigned char mode;                        //0:结束模式,1:命令模式,2:数据模式
  18. unsigned char buf_full;                  //1:整句接收完成,相应数据有效。0:缓存数据无效。
  19. unsigned char cmd[5];                  //命令类型存储数组
  20. unsigned char speed[4];
  21. unsigned char date[6];

  22. uchar xianshi[]={'0','1','2','3','4','5','6','7','8','9'} ;


  23. sbit lcden=P2^7;
  24. sbit lcdrw=P2^5;
  25. sbit lcdrd=P2^6;

  26. void lcddelay(uint z);
  27. void lcdwritecom(uchar com);
  28. void lcdwritedata(uchar date);
  29. void lcdinit();

  30. //显示需要的变量
  31. unsigned int dsp_count;            //刷新次数计数器
  32. unsigned char time_count;
  33. void sys_init(void);





  34. main()
  35. {
  36.      unsigned char i;
  37.          sys_init();
  38.          while(1)
  39.          {
  40.                                                             
  41.                                  lcdwritecom(0x80);
  42.                                  lcdwritedata('s');
  43.                                   lcdwritedata('j');
  44.                                
  45.                                          
  46.                                  lcdwritecom(0x80+0x40);
  47.                                  for(i=0;i<6;i++)
  48.                                  {
  49.                                  lcdwritedata(xianshi[time[i]]);
  50.                                  lcddelay(5);
  51.                                  }//显示时间
  52.                                  
  53.                      
  54. }
  55. }

  56.                     

  57. //系统初始化
  58. void sys_init()
  59. {
  60. //     unsigned char i;
  61.      SCON = 0x50;      
  62.      TMOD = 0x20;      /* TMOD: timer 1, mode 2, 8-bit reload */
  63.      TH1=TL1=0xfd;       /* TH1: reload value for 4800 baud [url=home.php?mod=space&uid=72445]@[/url] 11.059MHz */
  64.      TR1 = 1;            /* TR1: timer 1 run */
  65.      lcdinit();            //初始化LCD
  66.        
  67.    //         ClearAS();
  68.      IE=0x90;                  //开总中断、串口中断
  69. }

  70. //串口接收中断
  71. void uart(void) interrupt 4
  72. {
  73.      unsigned char tmp;
  74.      if(RI){
  75.            tmp=SBUF;
  76.            switch(tmp)
  77.                    {
  78.                  case ':
  79.                        cmd_number=0;            //命令类型清空
  80.                        mode=1;                  //接收命令模式
  81.                        byte_count=0;            //接收位数清空
  82.                        break;
  83.                
  84.                                  case ',':
  85.                        seg_count++;            //逗号计数加1
  86.                        byte_count=0;
  87.                        break;
  88.                
  89.                              case '*':
  90.                        mode=0;
  91.                                                      buf_full=1;
  92.                        break;
  93.                  
  94.                                  default:
  95.                        if(mode==1){//命令种类判断
  96.                              
  97.                              cmd[byte_count]=tmp;                  //接收字符放入类型缓存
  98.                              if(byte_count>=4){                        //如果类型数据接收完毕,判断类型
  99.                                    if(cmd[0]=='G'){
  100.                                          if(cmd[1]=='P'){
  101.                                                if(cmd[2]=='R'){
  102.                                                    if(cmd[3]=='M'){
  103.                                                           if(cmd[4]=='C'){
  104.                                                                  cmd_number=1;
  105.                                                                  mode=2;
  106.                                                                  seg_count=0;
  107.                                                                  byte_count=0;
  108.                                                                                             }
  109.                                                                    }
  110.   
  111.                                           
  112.                                                              }
  113.                                                        }
  114.                                                  }
  115.                                              }
  116.                                    }
  117.                           else if((mode==2)&cmd_number){
  118.                            
  119.                                                                                                                 //接收数据处理 GPGGA,132920.487,,n,,w,0,00,,,M,0.0,M,,0000*56
  120.                                                //$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10
  121.                                                                                   //$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
  122.                                          switch(seg_count){
  123.                                                                                   case 1:
  124.                                                      if(byte_count<6){                                //时间处理
  125.                                                            time[byte_count]=tmp;      
  126.                                                      }
  127.                                                      break;
  128.                                                                                                                                                                                                                  
  129.                                                case 3:                                                //纬度处理
  130.                                                      if(byte_count<9){
  131.                                                            WD[byte_count]=tmp;
  132.                                                      }
  133.                                                      break;
  134.                                                                                                                                                                                                                  
  135.                                                case 4:                                                //纬度方向处理
  136.                                                      if(byte_count<1){
  137.                                                            WD_a=tmp;
  138.                                                      }
  139.                                                      break;
  140.                                                                                                                                                                                                                  
  141.                                                case 5:                                                //经度处理
  142.                                                      if(byte_count<10){
  143.                                                            JD[byte_count]=tmp;
  144.                                                      }
  145.                                                      break;
  146.                                                                                                                                                                                                                  
  147.                                                case 6:                                                //经度方向处理
  148.                                                      if(byte_count<1){
  149.                                                            JD_a=tmp;
  150.                                                      }
  151.                                                      break;
  152.                                                                                                                                                                                                                  
  153.                                                                                     case 7:                                                //speed
  154.                                                      if(byte_count<4){
  155.                                                            speed[byte_count]=tmp;
  156.                                                      }
  157.                                                      break;
  158.                                                                                                                                                                                                                  
  159.                                                                                         //        case 9:                                                //date
  160.                                             //         if(byte_count<6){
  161.                                              //              date[byte_count]=tmp;
  162.                                              //        }
  163.                                              //       break;
  164.                                                                }
  165.                                       
  166.                                                                                              }
  167.                        
  168.                            byte_count++;            //接收数位加1
  169.                            break;
  170.                                         }
  171.            }
  172.      RI=0;
  173. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部