论坛风格切换切换到宽版
  • 3009阅读
  • 2回复

GPS中断还有点问题。 [复制链接]

上一主题 下一主题
离线lulei
 
发帖
47
只看楼主 倒序阅读 0楼 发表于: 2008-05-21
bg4uvr 大哥,我拿你的那个串口程序直接放到51上用的。不管使,我只改了那个串口的sbuf 还有每次中断进来然后ri清零。感觉这样就行了。结果不行。我在io的p0.0加了个二极管,如果进入中断就灭掉,然后回来执行显示程序,显示前我又点亮,结果点不亮了,buf_full好像总是等于零了。郁闷了。就在那等待了。就好像进入中断不出来了一样!nnd
离线lulei
发帖
47
只看该作者 1楼 发表于: 2008-05-21
pcon=0x80;
     tmod=0x20; //t1自动从装,方式2
     scon=0x40;//方式1
     th1=0xfa; //晶振为12m.波特率为9600
     tl1=0xfa;
     es=1;   //开串行中断
     ea=1;   //开总中断
     ren=1;   //允许串行接受
     tr1=1;       //开串行口波特率发生器(t1)
我用的是51的,这个初始化没问题。我看了也和别人的对比了一下!
离线lulei
发帖
47
只看该作者 2楼 发表于: 2008-05-21
//串口接收程序
void sbuff_receive() interrupt 4 using 2
{
     uchar pp;
     light=1;
     ri=0;
  pp=sbuf;
     switch(pp){
           case '$':
                 cmd_number=0;            //命令类型清空
                 mode=1;                        //接收命令模式
                 byte_count=0;            //接收位数清空
                 break;
           case ',':
                 seg_count++;            //逗号计数加1
                 byte_count=0;
                 break;
           case '*':
                 switch(cmd_number){
                       case 1:
                             buf_full|=0x01;
                             break;
                       case 2:
                             buf_full|=0x02;
                             break;
                       case 3:
                             buf_full|=0x04;
                             break;
                       case 4:
                             buf_full|=0x08;
                             break;
                       case 5:
                             buf_full|=0x16;
                             break;
          case 6:
                             buf_full|=0x32;
                             break;      
                 }
                 mode=0;
                 break;
           default:
                 if(mode==1){
                       //命令种类判断
                       cmd[byte_count]=pp;                  //接收字符放入类型缓存
                       if(byte_count>=4){                        //如果类型数据接收完毕,判断类型
                             if(cmd[0]=='g'){
                                   if(cmd[1]=='p'){
                                         if(cmd[2]=='v'){
                                               if(cmd[3]=='t'){
                                                     if(cmd[4]=='g'){
                                                           cmd_number=6;
                                                           mode=2;
                                                           seg_count=0;
                                                     }
                                               }
                                         }
                      if(cmd[2]=='g'){
                                               if(cmd[3]=='g'){
                                                     if(cmd[4]=='a'){
                                                           cmd_number=1;
                                                           mode=2;
                                                           seg_count=0;
                                                           byte_count=0;
                                                           high_num=0;
                                                     }
                                               }
                                               else if(cmd[3]=='s'){
                                                     if(cmd[4]=='v'){
                                                           cmd_number=2;
                                                           mode=2;
                                                           seg_count=0;
                                                           byte_count=0;
                        }
                                                     if(cmd[4]=='a'){
                                                        cmd_number=5;
                                                           mode=2;
                                                           seg_count=0;
                                                           byte_count=0;
                                                     }
                                                     
                                               }
                                         }
                                         else if(cmd[2]=='r'){
                                               if(cmd[3]=='m'){
                                                     if(cmd[4]=='c'){
                                                           cmd_number=3;
                                                           mode=2;
                                                           seg_count=0;
                                                           byte_count=0;
                                                           a_num=0;
                                                           s_num=0;
                                                     }
                                               }
                                         }
                                         else if(cmd[2]=='z'){
                                               if(cmd[3]=='d'){
                                                     if(cmd[4]=='a'){
                                                           cmd_number=4;
                                                           mode=2;
                                                           seg_count=0;
                                                           byte_count=0;
                                                     }
                                               }
                                         }
                                   }
                             }
                             
                       }
                 }
                 else if(mode==2){
                       //接收数据处理
                       switch (cmd_number){
                             case 1:                        //类型1数据接收。gpgga
                                   switch(seg_count){
                                         case 2:                                                //纬度处理
                                               if(byte_count<9){
                                                     wd[byte_count]=pp;
                                               }
                                               break;
                                         case 3:                                                //纬度方向处理
                                               if(byte_count<1){
                                                     wd_a=pp;
                                               }
                                               break;
                                         case 4:                                                //经度处理
                                               if(byte_count<10){
                                                     jd[byte_count]=pp;
                                               }
                                               break;
                                         case 5:                                                //经度方向处理
                                               if(byte_count<1){
                                                     jd_a=pp;
                                               }
                                               break;
                                         case 7:                                                //定位使用的卫星数
                                               if(byte_count<2){
                                                     use_sat[byte_count]=pp;
                                               }
                                               break;
                                         case 9:                                                //高度处理
                                               if(byte_count<6){
                                                     high[byte_count]=pp;
                                                     high_num++;
                                               }
                                               break;
                                   }
                                   break;
                             case 2:                        //类型2数据接收。gpgsv
                                   switch(seg_count){
                                         case 3:                                                //天空中的卫星总数
                                               if(byte_count<2){
                                                     total_sat[byte_count]=pp;
                                               }
                                               break;
                                   }
                                   break;
                             case 3:                        //类型3数据接收。gprmc
                                   switch(seg_count){
                                         case 2 :                                                //定位标志
                                               if(byte_count<1){
                                                     dw[byte_count]=pp;
                                            }
                                               break;
                                         case 7:                                                //速度处理,单位节,1节=1852m/h
                                               if(byte_count<5){
                                                     speed[byte_count]=pp;
                                                     s_num++;
                                               }
                                               break;
                                         case 8:                                                //方位角处理
                                               if(byte_count<5){
                                                     angle[byte_count]=pp;
                                                     //a_num++;
                                               }
                                               break;
                                   }
                                   break;
                             case 4:                        //类型4数据接收。gpzda
                                   switch(seg_count){
                                         case 1:
                                               if(byte_count<2){                        //时间处理
                          time_s[byte_count]=pp;      
                                               break;
                                               }
                                               if(byte_count<4){                        //时间处理
                                                     
                          time_s[byte_count]=pp;      
                                               break;
                                               }
                                               if(byte_count<6){                        //时间处理
                                                     
                          time_s[byte_count]=pp;      
                                               }
                                               break;
                                         case 2:
                                               if(byte_count<2){
                                                     date_d[byte_count]=pp;
                                               }
                                               break;
                                         case 3:
                                               if(byte_count<2){
                                                     date_m[byte_count]=pp;
                                               }
                                               break;
                                         case 4:
                                               if(byte_count<4){
                                                     date_y[byte_count]=pp;
                                               }
                                               break;                                          
                                   }
                                   break;
                             case 5:                        //类型数据接收。gpgsa
                                   switch(seg_count){
                                         case 2:
                                               if(byte_count<1){                        //二维三维定位标志处理
                          dd[byte_count]=pp;      
                                               }
                                               break;
                  }
                                   break;
                             case 6:                        //类型数据接收。gpvtg
                                   switch(seg_count){
                                         case 7:
                                               if(byte_count<5){                        //速度,单位km/h
                          speed_km[byte_count]=pp;      
                                               }
                                               break;
                  }
                                   break;
                       }
                 }
                 byte_count++;            //接收数位加1
                 break;
     }
}