⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 公交车到站判断程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	  rTCON &= ~0x1000;
}


/********************************************************************
 Function name	: Test_Stat
 Description	: 站点检测,距离判断
 Return type	: unsigned char
*********************************************************************/

unsigned char Test_Stat(void)
{
/*
 *假设地球是一个标准球体,半径为R,并且假设东经为正,西经为负,北纬为正,南纬为负, 
 *因此A(x1,y1)B(x2,y2)两点的球面距离为 
 * R*arccos(cos(y2)*cos(y1)*cos(x2-x1)+sin(y2)*sin(y1)) 
 *x1,y1,x2,y2都是弧度形式。 (x经度,y纬度)
 */ 
     long double x1, y1, x2, y2,x3,y3;
     unsigned char i=0,j=0;
       
	 while(Get_MsgHeader()==0)
	   {	    
	     printsentence(0,"GPS 信号检测中  ");    
         printsentence(2,"    请稍等.     ");
         Delay(800);
         printsentence(2,"    请稍等 .    ");         
         Delay(800);
         printsentence(2,"    请稍等  .   ");         
         Delay(800);
         printsentence(2,"    请稍等   .  ");
         Delay(800);         
         printsentence(2,"    请稍等    . ");                  
         Delay(800);          
         printsentence(2,"    请稍等   .  ");                  
         Delay(800);          
         printsentence(2,"    请稍等  .   ");                  
         Delay(800);         
         printsentence(2,"    请稍等 .    ");                  
         Delay(800);   
         printsentence(2,"    请稍等.     ");
         Delay(800); 
         printsentence(2,"    请稍等      ");                                              	   
	       };
	    
	   printsentence(0,"    Welcome !   ");
       printsentence(2," GPS Bus System ");	    
	   DelayNS(20);
	      	
       x1 = Chg_to_Radian(Lotd);
       y1 = Chg_to_Radian(Latd);	     
	   TextDisplayInit();
       printsentence(0,"今天是:       ");
       DisplayChar(1,0,date);             
       printsentence(2,"现在时间为:   ");
       DisplayChar(3,0,time);   
       DelayNS(25);
       TextDisplayInit();
       printsentence(0,"现在纬度为:    ");
       DisplayChar(1,0,pos1);          
       printsentence(2,"现在经度为:    ");
       DisplayChar(3,0,pos2);
       DelayNS(25);  
        	    	    
      for ( k = 0; k < STAT_NUM; k++)
       {              
          x2 = Chg_to_Radian(POS[k].longitude);
          y2 = Chg_to_Radian(POS[k].latitude);	
          x3 = Chg_to_Radian(POS[k+1].longitude);
          y3 = Chg_to_Radian(POS[k+1].latitude); 
                   	
          distance =( R * acos(cos(y2) * cos(y1) *cos(x2 - x1) + sin(y2) * sin(y1)));
          distance1=( R * acos(cos(y3) * cos(y1) *cos(x3 - x1) + sin(y3) * sin(y1)));
          
          if(distance<250)
             {        
              xx=Change_String(Lotd);
	          yy=Change_String(Latd);
 	          xxx=Change_String(POS[k].longitude);
	          yyy=Change_String(POS[k].latitude);      
	          x_d=((xx-xxx)>0)?(xx-xxx):((xx-xxx)*(-1));
	          y_d=((yy-yyy)>0)?(yy-yyy):((yy-yyy)*(-1));
	        
	          s=Compare_Float(x_d,y_d); 
	        
	         switch(s)
	           {
	              case 0:
	                     distance=distance-160.0;
	                     break;
	              case 1:
	                     distance=distance-100.0;
	                     break;
	              case 2:
	                     distance=distance-80.0;
	                     break;
	              case 3:
	                     distance=distance-60.0;
	                     break;	                     
	              default:
	                     break;
	               }                                 	                     
 
              if(distance<30)
                { 
                  StopBeepPwm(); 
                  Start_Beep(50, 50);
                  return k;
                   }
              else 
              return 5;    
                 }          
         else if (distance>250.0&&distance<1000.0)
            { 
                Start_Beep(30, 50);
                return 3;
                 }                                                    
          }
         
       StopBeepPwm();                       
       return 5;               /* 没到站则返回255 */
         
 }

/********************************************************************
 Function name	: __irq Key_Int
 Description	: 按键中断
 Return type	: void
*********************************************************************/

void __irq Key_Int(void)
{	

      which_int=rEXTINTPND;
      rEXTINTPND=0xf;		//clear EXTINTPND reg.		
      rI_ISPC=BIT_EINT4567;	//clear pending_bit
      switch(which_int)
       {
          case 1:
             StopBeepPwm();
        	 which_int=0;
          break;
          case 2:
             StopBeepPwm();
        	 which_int=0;
          break;
          case 4:
             StopBeepPwm();
        	 which_int=0;
          break;
          case 8:
             StopBeepPwm();
        	 which_int=0;
          break;
           }
 
}

/********************************************************************
 Function name	:Key_Init
 Description	:按键检测初始化
 Return type	:void
*********************************************************************/

void Key_Init(void)
{
	  rINTCON=0x5;
	  rINTMOD=0x0;    
	  rEXTINT=0x0;		
      rPCONG=0xffff;	
      rPUPG=0x0;		
      pISR_EINT4567=(unsigned)Key_Int;
      rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);	
}

/********************************************************************
 Function name	: Main
 Description	: 主函数
 Return type    : void
*********************************************************************/
void Main(void)
{

      U8 which_key;
      rSYSCFG=CACHECFG;   // Using 8KB Cache//
      Port_Init();    
      Uart_Init(0,4800);
      LCDIni();
      Uart_Select(1);  
      rPDATC&=~0x10;
      rPCONG=0x00ff;	
      rPUPG=0x0;	    

      TextDisplayInit();
      displaypicture(0);
      DelayNS(20);
      TextDisplayInit();
      printsentence(0,"  GPS 定位系统  ");
      printsentence(1,"      ★★      ");
      printsentence(2,"    ★★★★    ");
      printsentence(3,"      ★★      ");
      DelayNS(20);    
	  Key_Init();
	  TextDisplayInit();	   					
      while(1)
        {
            
           if ((a = Test_Stat()) < STAT_NUM)
             {
               switch(a)
                {
                 case 0:
                   TextDisplayInit(); 
                   printsentence(0,"the Station is:   ");
                   printsentence(1,POS[k].name);
                   Start_Beep(50, 50);                                    
                   DelayNS(20);
                   Start_Beep(50, 50);
                   TextDisplayInit();
                   Dis[0]=(int)distance1/1000+'0';
                   Dis[1]=(int)distance1%1000/100+'0';
				   Dis[2]=(int)distance1%1000%100/10+'0';
				   Dis[3]=(int)distance1%1000%100%10+'0';
				   Dis[4]='M';
				   Dis[5]='@';			   
                   printsentence(0,"Next Station     ");
                   printsentence(1,POS[k+1].name);
                   printsentence(2,"Letf for:           ");
                   DisplayChar(3,1,Dis);
                   DelayNS(20);
                   TextDisplayInit();
                   StopBeepPwm();                                                          
                   break;
                 case 1:
                   TextDisplayInit(); 
                   printsentence(0,"the Station is:  ");
                   printsentence(1,POS[k].name);
                   Start_Beep(50, 50);
                   DelayNS(20);
                   Start_Beep(50, 50);
                   TextDisplayInit();
                   Dis[0]=(int)distance1/1000+'0';
                   Dis[1]=(int)distance1%1000/100+'0';
				   Dis[2]=(int)distance1%1000%100/10+'0';
				   Dis[3]=(int)distance1%1000%100%10+'0';
				   Dis[4]='M';
				   Dis[5]='@';			   
                   printsentence(0,"Next Station     ");
                   printsentence(1,POS[k+1].name);
                   printsentence(2,"Left for:       ");
                   DisplayChar(3,1,Dis);
                   DelayNS(20); 
                   TextDisplayInit();
                   StopBeepPwm();                                                                            
                   break;
                 case 2:
                   TextDisplayInit(); 
                   printsentence(0,"The Station is:  ");
                   printsentence(1,POS[k].name);
                   Start_Beep(50, 50);
                   DelayNS(20);
                   Start_Beep(50, 50);
                   TextDisplayInit();
                   Dis[0]=(int)distance1/1000+'0';
                   Dis[1]=(int)distance1%1000/100+'0';
				   Dis[2]=(int)distance1%1000%100/10+'0';
				   Dis[3]=(int)distance1%1000%100%10+'0';
				   Dis[4]='M';
				   Dis[5]='@';			   
                   printsentence(0,"Next Station     ");
                   printsentence(1,POS[k+1].name);
                   printsentence(2,"Left for:       ");
                   DisplayChar(3,1,Dis);
                   DelayNS(20); 
                   TextDisplayInit();
                   StopBeepPwm();                                                                            
                   break;
                 case 3:
                   TextDisplayInit();
                   Dis[0]=(int)distance/1000+'0';
                   Dis[1]=(int)distance%1000/100+'0';
				   Dis[2]=(int)distance%1000%100/10+'0';
				   Dis[3]=(int)distance%1000%100%10+'0';
				   Dis[4]='M';
				   Dis[5]='@';			   
                   printsentence(0,"Next Station     ");
                   printsentence(1,POS[k].name);
                   printsentence(2,"Left for:           ");
                   DisplayChar(3,1,Dis);
                   DelayNS(20);                   
                   StopBeepPwm();
                   TextDisplayInit();                    
                   break;
                 default:TextDisplayInit(); 
                 break;                   
                   }
              }
        }         
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -