找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3209|回复: 3
收起左侧

单片机接受不到信号怎么回事,已经确定gps连接没问题,求大神指导!!!!

[复制链接]
ID:114908 发表于 2016-5-7 23:34 | 显示全部楼层 |阅读模式
30黑币
main()
{
        unsigned char i;
        char Bhour;
        AUXR = AUXR|0x40;  // T1, 1T Mode
        sys_init();

        lock=1;
        use_sat[0]='0';
        use_sat[1]='0';
        total_sat[0]='0';
        total_sat[1]='0';

        while(1){
            if(buf_full==0)                                //无GPS信号时
                {
                        dsp_count++;
                        if(dsp_count>=65000){
                                LCD_cls();                        //清屏
                                LCD_write_string(0,0,"No GPS connect..");
                                LCD_write_string(0,1,"Please Check..");
                                while(buf_full==0);
                                LCD_cls();       
                                dsp_count=0;
                        }
                }
                else{                                                //有GPS信号时
/*************************************
        最大速度处理
*************************************/
                     dot_count=0;
                                          b=0;
                      for(i=0;i<5;i++)
                                          {
                                              if(speed[i]!='.')
                                                     dot_count++;
                                                  else

                                                     break ;
                                          }
                                          switch(dot_count)
                                          {
                                             
                                                 case 1:
                                                      b=((speed[0]-'0')*10+(speed[2]-'0'))*1.852;
                                                          break;
                                                 case 2:
                                                      b=((speed[0]-'0')*100+(speed[1]-'0')*10+(speed[4]-'0'))*1.852;
                                                          break;
                                                 case 3:
                                                      b=((speed[0]-'0')*1000+(speed[1]-'0')*100+(speed[2]-'0')*10+(speed[4]-'0'))*1.852;
                                                          break;
                                               
                                           }
                      if(b>maxspeed)
                                          {
                                            maxspeed=b;
                                      }


/*************************************
        最大速度处理
*************************************/





                        if(chk_key()){                                //检测到按键切换显示
                                page=!page;
                                LCD_cls();
                        }

                        if(!page){                                                //页面1


                                           
                                if(buf_full|0x01){                                //GGA语句
                                        if(lock==0){                                        //如果未定位
                                                LCD_write_string(0,0,"*---.--.----  ");
                                                LCD_write_string(0,1,"* --.--.----  ");                                       
                                        }else{                                                        //如果已定位


                                            LCD_write_char(0,0,JD_a);                        //显示经度
                                            for(i=0;i<3;i++)
                                                {
                                                  LCD_write_char(i+1,0,JD[i]);
                                                  }
                        LCD_write_char(4,0,'.');
                        for(i=3;i<10;i++)
                                                {
                                                  LCD_write_char(i+2,0,JD[i]);
                                                  }

                                                LCD_write_char(0,1,WD_a);                        //显示纬度
                                                LCD_write_char(1,1,' ');
                                            for(i=0;i<2;i++)
                                                {
                                                        LCD_write_char(i+2,1,WD[i]);
                                                }
                                                LCD_write_char(4,1,'.');

                        for(i=2;i<9;i++)
                                                {
                                                        LCD_write_char(i+3,1,WD[i]);
                                                }
                                                                                               
                                                }
                                        LCD_write_char(14,1,use_sat[0]);                //显示接收卫星数
                                        LCD_write_char(15,1,use_sat[1]);
                                        buf_full&=~0x01;
                                        dsp_count=0;
                        }
                                if(buf_full|0x02){                                //GSV语句
                                        LCD_write_char(14,1,total_sat[0]);
                                        LCD_write_char(15,1,total_sat[1]);
                                        buf_full&=~0x02;
                                        dsp_count=0;
                                }
                                if(buf_full|0x04){
                                        if(lock==0){                                        //如果未定位
                                                LCD_write_string(0,0,"*---.--.----  ");
                                                LCD_write_string(0,1,"* --.--.----  ");                                       
                                        }else{                                                        //如果已定位



                                LCD_write_char(0,0,JD_a);                        //显示经度
                                    for(i=0;i<3;i++)
                                        {
                                          LCD_write_char(i+1,0,JD[i]);
                                          }
                    LCD_write_char(4,0,'.');
                    for(i=3;i<10;i++)
                                        {
                                          LCD_write_char(i+2,0,JD[i]);
                                          }
                                        LCD_write_char(0,1,WD_a);                        //显示纬度
                               
                                        LCD_write_char(1,1,' ');
                        for(i=0;i<2;i++)
                                        {
                                                LCD_write_char(i+2,1,WD[i]);
                                        }
                                        LCD_write_char(4,1,'.');

                    for(i=2;i<9;i++)
                                        {
                                                LCD_write_char(i+3,1,WD[i]);
                                        }

                                     }
                                        LCD_write_char(14,0,use_sat[0]);                //显示接收卫星数
                                        LCD_write_char(15,0,use_sat[1]);
                                        buf_full&=~0x04;
                                        dsp_count=0;
                                }
                        }
                        else{                                                        //页面2
                                if(buf_full|0x01){                                //GGA语句
                                        buf_full&=~0x01;
                                        dsp_count=0;
                                }
                                if(buf_full|0x02){
                                        buf_full&=~0x02;
                                        dsp_count=0;
                                }
                                if(buf_full|0x04){                                //RMC语句
                                        Bhour=((time[0]-0x30)*10+time[1]-0x30)+TIME_AREA;
                                        if(Bhour>=24){
                                                Bhour-=24;
                                        }else if(Bhour<0){
                                                Bhour+=24;
                                        }

                                        LCD_write_char(0,1,date[4]);
                                        LCD_write_char(1,1,date[5]);
                                        LCD_write_char(2,1,date[2]);
                                        LCD_write_char(3,1,date[3]);
                                        LCD_write_char(4,1,date[0]);
                                        LCD_write_char(5,1,date[1]);

                                        LCD_write_char(8,1,Bhour/10+0x30);
                                        LCD_write_char(9,1,Bhour%10+0x30);
                                        LCD_write_char(10,1,':');
                                        LCD_write_char(11,1,time[2]);
                                        LCD_write_char(12,1,time[3]);
                                        LCD_write_char(13,1,':');
                                        LCD_write_char(14,1,time[4]);
                                        LCD_write_char(15,1,time[5]);

                                        LCD_write_string(5,0,"knot A");         

                                        if(lock=='0'){                                        //如果未定位
                                                LCD_write_string(0,0,"---.-");
                                                LCD_write_string(11,0,"---.-");
                                        }else{                                                      //已经定位,在此处做的改动。
/*******************************************************************************/


                     
                                                       
                           if(count<10)
                                                   {

                            for(i=0;i<5;i++)
                                                        {                       
                                                        LCD_write_char(i,0,speed[i]);//knot显示
                                                        }
                                                        count++;
                                                  }
                                                  else
                                                  {
                                                    if(count>15)
                                                    {  
                                                           count=0;
                                                        }

                                  hspeed[0]=maxspeed/1000+0x30;                     //把小数转成字符数组
                                                          hspeed[1]=(maxspeed/100)%10+0x30;
                                                          hspeed[2]=(maxspeed/10)%10+0x30;
                                                          hspeed[3]='.';
                                                          hspeed[4]= maxspeed%10+0x30;

                                                     
                                                    count++;
                                                        LCD_write_string(5,0,"Km/h A");
                            LCD_write_char(0,0,hspeed[0]);
                                                        LCD_write_char(1,0,hspeed[1]);       
                                                        LCD_write_char(2,0,hspeed[2]);
                                                        LCD_write_char(3,0,hspeed[3]);
                                                        LCD_write_char(4,0,hspeed[4]);        //最大速度显  */
                                                }

/*******************************************************************************/
                                                         for(i=0;i<5;i++){
                                                                LCD_write_char(11+i,0,angle[i]);
                                                }
                                        }
                                        buf_full&=~0x04;
                                        dsp_count=0;
                                }
                        }

                }
        }
}

bit chk_key(void)
{
        if(!KEY1){
                delayms(10);
                if(!KEY1){
                        while(!KEY1);
                        delayms(10);
                        return(1);
                }
        }
    LCD_cls();                        //清屏
        return(0);
}

//系统初始化
void sys_init() {
        unsigned char i;
        SCON = 0x50;         /* SCON: mode 1, 8-bit UART, enable rcvr */
        TMOD = 0x20;         /* TMOD: timer 1, mode 2, 8-bit reload */
        PCON = 0x00;
        if(GPS_SPD){
                TH1 = 0x70;                 /* TH1: reload value for 9600 baud @ 11.059MHz */
        }else{
                TH1 = 0x70;                        /* TH1: reload value for 4800 baud @ 11.059MHz */
        }
         EA = 1;
    ES = 1;
        TR1 = 1;                 /* TR1: timer 1 run */
        LCD_init(8);                //初始化LCD
        LCD_write_string(0,0," GPS SIRF II 2 ");
        LCD_write_string(0,1," 11-11-23 1342 ");



       
        for(i=1;i<4;i++){
                delayms(250);
        }
        //LCD_cls();
        IE=0x90;                        //开总中断、串口中断
}

//串口接收中断
void uart(void) interrupt 4
{
        unsigned char tmp;

        if(RI)
        {         RI = 0;
                tmp=SBUF;
                switch(tmp){
                        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;
                                }
                                mode=0;
                                break;
                        default:
                                if(mode==1){
                                        //命令种类判断

                                        cmd[byte_count]=tmp;                        //接收字符放入类型缓存
                                        if(byte_count>=4){                                //如果类型数据接收完毕,判断类型
                                                if(cmd[0]=='G'){
                                                        if(cmd[1]=='P'){
                                                                if(cmd[2]=='G'){
                                                                        if(cmd[3]=='G'){
                                                                                if(cmd[4]=='A'){
                                                                                        cmd_number=1;
                                                                                        mode=2;
                                                                                        seg_count=0;
                                                                                        byte_count=0;
                                                                                }
                                                                        }
                                                                        else if(cmd[3]=='S'){
                                                                                if(cmd[4]=='V'){
                                                                                        cmd_number=2;
                                                                                        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;
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                                else if(mode==2){
                                        //接收数据处理
                                        switch (cmd_number){
                                                case 1:                                //类型1数据接收。GPGGA
                                                        switch(seg_count){
                                                                case 2:                //纬度处理
                                                                        if(byte_count<9){
                                                                                WD[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 3:                //纬度方向处理
                                                                        if(byte_count<1){
                                                                                WD_a=tmp;
                                                                        }
                                                                        break;
                                                                case 4:                //经度处理
                                                                        if(byte_count<10){
                                                                                JD[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 5:                //经度方向处理
                                                                        if(byte_count<1){
                                                                                JD_a=tmp;
                                                                        }
                                                                        break;
                                                                case 6:                //定位判断
                                                                        if(byte_count<1){
                                                                                lock=tmp;
                                                                        }
                                                                        break;
                                                                case 7:                //定位使用的卫星数
                                                                        if(byte_count<2){
                                                                                use_sat[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 9:                //高度处理
                                                                        if(byte_count<6){
                                                                                high[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                        }
                                                        break;
                                                case 2:                                //类型2数据接收。GPGSV
                                                        switch(seg_count){
                                                                case 3:                //天空中的卫星总数
                                                                        if(byte_count<2){
                                                                                total_sat[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                        }
                                                        break;
                                                case 3:                                //类型3数据接收。GPRMC
                                                        switch(seg_count){
                                                                case 1:                //时间处理
                                                                        if(byte_count<6){                               
                                                                                time[byte_count]=tmp;       
                                                                        }
                                                                        break;
                                                                case 2:                //定位判断                                               
                                                                        if(byte_count<1){
                                                                          if (tmp=='A') {lock=1;}
                                                                          else{
                                                                            lock=0;}
                                                                        }
                                                                        break;
                                                                case 3:                //纬度处理                                               
                                                                        if(byte_count<9){
                                                                                WD[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 4:                //纬度方向处理                                               
                                                                        if(byte_count<1){
                                                                                WD_a=tmp;
                                                                        }
                                                                        break;
                                                                case 5:                //经度处理                                               
                                                                        if(byte_count<10){
                                                                                JD[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 6:                //经度方向处理                                               
                                                                        if(byte_count<1){
                                                                                JD_a=tmp;
                                                                        }
                                                                        break;
                                                                case 7:                //速度处理                                               
                                                                        if(byte_count<5){
                                                                                speed[byte_count]=tmp;
                                                                        }
                                             

                                                                        break;
                                                                case 8:                //方位角处理                                               
                                                                        if(byte_count<5){
                                                                                angle[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                                case 9:                //方位角处理                                               
                                                                        if(byte_count<6){
                                                                                date[byte_count]=tmp;
                                                                        }
                                                                        break;

                                                        }
                                                        break;
                                        }
                                }
                                byte_count++;                //接收数位加1
                                break;
                }
        }
        RI=0;
}

回复

使用道具 举报

ID:119182 发表于 2016-5-7 23:41 | 显示全部楼层
确定你的串口与GPS通信是否正常

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:98275 发表于 2016-5-8 03:19 | 显示全部楼层
先在proteus仿真,用串口助手给单片机发gps的信息,我也在整这个

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:98275 发表于 2016-5-8 03:20 | 显示全部楼层
可以加我扣扣我告诉你怎么弄,我名字就是qq
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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