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

📄 pic_car.c

📁 用PIC单片机开发的自动小车控制源代码
💻 C
📖 第 1 页 / 共 3 页
字号:

void interrupt tmr0_int(void)
   { int i; 
    // char data;
     STATUS_TEMP=STATUS;
     PCLATH_TEMP=PCLATH;      
     if(T0IE&&T0IF)
          { T0IF=0;           
            TMR0=6;            			
		    RTC++;
        LEDR=LightR;
		LEDL=LightL;

 
     //*************************************PID*************************************
    if(RTC%64==0)
        {if(speed!=0)
          {
           e[k_2]=e[k_1];
           e[k_1]=e[k];
           e[k]=speed-(wheelcircle-wheelcircle_for_math);         
           du=(int)(KP*(e[k]-e[k_1])+KI*e[k]+KD*(e[k]-2*e[k_1]+e[k_2]));
           du=du/100;
           u[k]=u[k_1]+du;                   
           if(PWM_MOTOR2==0)
               {               
           		if(u[k]>200) CCPR1L=200;          
           		else if(u[k]<0)  CCPR1L=0;
                else CCPR1L=u[k];
             }
           else {                
                 if(u[k]>200) CCPR1L=0;          
           	     else if (u[k]<0) CCPR1L=200;
                 else CCPR1L=200-u[k];
                 }           
           u[k_1]=u[k];

 //*************************************************************
            if((wheelcircle-wheelcircle_for_math)==0) speedtest++;           
            else  speedtest=0;
            if(speedtest>32) 
                  {speedtest=0;}

 //**************************************************************
            wheelcircle_for_math=wheelcircle;  
             

           }
         else {CCPR1L=0;PWM_MOTOR2=0;e[k]=e[k_1]=e[k_2]=0;u[k]=u[k_1]=0;}
               
           } 
 //***************************舵机控制*****************************//
     if(helmcount<500)        
              {if(helmcount%20==0) 	PWM_HELM=1;
               else if(helmcount%20==1)
                      {
                       for(i=0;i<PWMontimeHelm;i++){};
                       PWM_HELM=0;        
                       }
               else  PWM_HELM=0;                  
              helmcount++;
              }
//**************************** 障碍检测并数据处理***********************// 
//  LightL                  LightR
//    (高)  redlightdata    (低)
//**************************************************************************
      if(RTC%8==0)         
             {redlightdata=0;
             
              if(leftredlight>5) redlightdata=((redlightdata+1)<<1);
                else   redlightdata=redlightdata<<1; 
              if(rightredlight>5)
                  redlightdata=redlightdata+1;
                else   redlightdata=redlightdata+0;                      
              rightredlight=0;
              leftredlight=0;
             }
       else 
             { 
              if(LightR)  rightredlight++;
              if(LightL)  leftredlight++; 
             }

  //*******************AD********************************//      
      if(RTC%1024==0)
           {
            //LEDR=LEDR^1; 
   			//LEDL=LEDL^1;
            //AD_RESULT=AD(); 
            //AD_RESULT_DES=(int)(AD_RESULT/2);
                                                       //约等于((AD_RESULT/1023)*5*100);             
            //sprintf(s,"%4d",AD_RESULT_DES);    
           }                                       
      }  // end  toif
 
//*****************************红外线遥控中断************************//
      if(INTE&&INTF)  //RB0
             {
               INTF=0;            
               LEDL=LEDL^1;
               LEDR=LEDR^1;
              while(1)
              {Temp_H=RTC;
               Temp_L=TMR0;
               NowTime=(Temp_H<<8)+Temp_L;                   
               if(Temp_H==RTC) break;
              }                                                          
               AllTime=NowTime-SaveTime; 
               if(LastFlag==1) 
                    {                        
                      if((AllTime>200)&&(AllTime<375))          //275                                                   
                                RedLightData.DataIn=(RedLightData.DataIn<<1)+0;								
                      else if((AllTime>420)&&(AllTime<650))                                                                 
                                RedLightData.DataIn=(RedLightData.DataIn<<1)+1;	 
                      else if(AllTime>2500)
                            {LastFlag=0;
					  		 PreFlag=0; 
					   		 Count=0; 
                             RBIE=1;	                                             
                            }                    													     					        	//550                                                                          		                      
                     }                                                                          			                   
               if((AllTime>2000)&&(AllTime<2500))    //9
                    { PreFlag=1;
					  Count=0;
				      LastFlag=0;                                                      	                                  
					}              
               if((Count==1)&&(((AllTime<375)&&(AllTime>175))&&(PreFlag==1)))
                     { 	LastFlag=1;
						RedLightData.DataIn=0;
                       	PreFlag=0;
					 }
               if((AllTime>4000)&&(Count>1))
                     { LastFlag=0;
					   PreFlag=0;
					   Count=0;                                                                         
					 } 
                                                    
               Count++;  
               SaveTime=NowTime;                                               
           }  
    if(RBIE&&RBIF)  //RB5  
          {  
              RBIF=0;              
              PORTB=PORTB; 
             if((PORTB&0b11000000)!=0b11000000)
               { for(i=0;i<32000;i++)  {}                
                 move_pump=1;                  //后退
                } 
             else 
             {                                              
              wheelcircle=wheelcircle+1;
              wheelcircleadd=1;  
              if(manual_auto_flag==1)
                      {if(auto_go_back!=goback) now_circle++;
                       else{ now_circle--;
                            if(move_data_record_rightorleft==middle)         
  								 back_circle_record--;                                   
						    }
                       }                    
              }
             RBIF=0;                			                           		         	      		
           }                                          //end rbif                                                                                	       	      
       STATUS=STATUS_TEMP;
       PCLATH=PCLATH_TEMP;
    }

void ultrared_deal(void)
 { if((RedLightData.redlight[0]^0xff)==(RedLightData.redlight[1]))   
                { 
                  DataOut=RedLightData.redlight[1];
                  remotecontrol();
                  RedLightData.DataIn=0;                
                }  
 }



void move_deal(void)
 {
 //*********************************车自动运行处理*************************************// 
 
   if(manual_auto_flag)
      { if((speedtest>15)||(move_pump==1)) 
                        {
                         speedtest=0;
                         move_pump=0;
                         if(auto_go_back==goback)
                            { move_reset(); 
                              TXREG=ACCIDENT;
                            }
                         else
                             { push();
                               auto_go_back=goback;
                             }
                         }   	          
        switch(auto_go_back)  
        {    
         case gohead :  deal_lightmessage();                         
                                 break;                                     
       	 case goback:	auto_back();                                                       
                                 break;
         case left:     turn_left();	 
                                 break;
         case right:    turn_right(); 
                                 break;
         default:		         break;
        } //end switch
     }  //end if
  else 
     {

      } 


 }

void turn_left(void)
 {status(speed2);
  if((now_goorback!=gohead)||(now_rightorleft!=left))
        {
          status(gohead);   //左转 右前方障碍                       		
          status(left);          
         } 
  if(now_circle>=turn_circle_define)
         {auto_go_back=gohead;
          }
  if(redlightdata!=0)
         { push();
           auto_go_back=goback;
          }
 }
void turn_right(void)
 {status(speed2);
  if((now_goorback!=gohead)||(now_rightorleft!=right))
        {
          status(gohead);   //左转 右前方障碍                       		
          status(right);           
         } 
  if(now_circle>=turn_circle_define)
       {auto_go_back=gohead;
        }
  if(redlightdata!=0) 
        { push();
          auto_go_back=goback;
         }
 }


 
void  deal_lightmessage(void)
 { if(now_goorback!=gohead)
     status(gohead); 
   switch(redlightdata)
      { case 0:                       //无   
              if(now_rightorleft!=middle)
			      {push(); 
                   status(middle);				   	
                   }                      
                 status(speed4);
               break; 
    	case 1:status(speed2);
               if(now_rightorleft!=left)              //左转 右前方障碍  
                   {push();		
                    status(left);                     
                   }
               else 
                  {
                   if(now_circle>goback_circle_define)
                       {push();
                        auto_go_back=goback;                      
                        }
                  }
              break;                         
    	case 2:status(speed2);
               if(now_rightorleft!=right)           // 右转 左前方障碍 
                   {push();
                    status(right); 
                   }
               else 
                  {
                   if(now_circle>goback_circle_define)
                       {push();                   
                        auto_go_back=goback;                     
                       }
                  }
              break;                                     
    	case 3:push();
               auto_go_back=goback; 
                    //都有                                                                                                                      
      	      break;                                 
    	default :break;	
     }   
 }

//*************************************************************
//             
//
//move_data_status 7 6 5 4 3 2 1 0  
//***************************************************************
void push(void)
 {char ppp;
 if(move_data_pointer!=-1) 
       {move_data_leftorright[move_data_pointer]=now_rightorleft; 
         if(now_circle>0xff)        
               move_data_circle[move_data_pointer]=0xff;
         else  move_data_circle[move_data_pointer]=now_circle;
		 move_data_pointer=move_data_pointer-1;
        }
  else {for(ppp=0;ppp<move_data_number-1;ppp++)
          { move_data_circle[move_data_number-1-ppp]=move_data_circle[move_data_number-2-ppp];
			move_data_leftorright[move_data_number-1-ppp]=move_data_leftorright[move_data_number-2-ppp];
            }
        move_data_leftorright[0]=now_rightorleft;
         if(now_circle>0xff) 
        move_data_circle[0]=0xff;
         else move_data_circle[0]=now_circle;
       } 
  now_circle=0;   
  }

void pop(void)
 {move_data_pointer=move_data_pointer+1;
  if(move_data_pointer>=move_data_number)
    {deal_stop();
     if(go_back_end==1) TXREG=COME_BACK_ORIGINAL;
     else TXREG=NOWAY_OUT;
     move_data_record_rightorleft=0;
     go_back_end=0; 
     }
  else
	{move_data_record_rightorleft=move_data_leftorright[move_data_pointer];
     now_circle=move_data_circle[move_data_pointer];
	 } 
  back_circle_record=back_circle_record_define; 
 }

void auto_back(void)
{status(speed3);
 if(now_goorback!=goback) status(goback);
 if(now_circle<=0) 
  { pop();
 	if((move_data_record_rightorleft==right)&&(now_rightorleft!=right)) 
          status(right);
 	else if((move_data_record_rightorleft==left)&&(now_rightorleft!=left)) 
          status(left);
 	else if((move_data_record_rightorleft==middle)&&(now_rightorleft!=middle))
          status(middle);
   }
 if((back_circle_record<=0)&&(go_back_end==0)) 
   {
     if(move_data_pointer>=1)
          { 
            if(move_data_leftorright[move_data_pointer-1]==left) 
                  auto_go_back=right;
            else auto_go_back=left; 
           }
     else {if(RTC%2==0) 
               auto_go_back=right;
            else auto_go_back=left;
            }
       back_circle_record=back_circle_record_define;
       now_circle=0;
       move_data_circle[move_data_pointer]=move_data_circle[move_data_pointer]-back_circle_record_define;
       move_data_pointer=move_data_pointer-1;
      }
 }


void move_data_clear(void)
{char tt;
 for(tt=0;tt<move_data_number;tt++)
   {move_data_circle[tt]=0;
    move_data_leftorright[tt]=0;
    }
}


void move_reset(void)
{move_data_clear();
 move_data_pointer=move_data_number-1;
 now_circle=0;
 now_rightorleft=now_goorback=0;
 back_circle_record=back_circle_record_define;
 manual_auto_flag=1;
 auto_go_back=gohead;
 auto_manualcount_key=0;
 speedtest=0;
}


void main(void)
{   char jk,j;
    unsigned  int data0=0;
    unsigned  int q=0;
    sys_initial();        
    setrctx();       
  LCD_initial();				// 液晶显示初始化 
 LCD_INIT(1);			        // LCD的1边初始化    
  LCD_INIT(2);				    //LCD的2边初始化    
  show_tu(hit);       
  //eeprom_write(0x00,0xaa);
  //data0=eeprom_read(0x00);
    TXREG=MUSIC;    
 	while(1==1)
         {
  //***********************************红外数据处理**********************************
          ultrared_deal();
  //*************************************语音辨识数据处理**********************************// 
          move_deal();

  //**************************************LCD*************************************
          


  //***************************************语音与辨识*****************************
        
          bsr_sound();

   }        // end while
}    

void bsr_sound(void)
{ if(RCIE&&RCIF)
        {  
           data=RCREG;
           CREN=1; 
           
           if(data==COMMAND_NAME)
                    {// bsr_sound_excitated=1;
					  TXREG=YES_HERE;
					  bsr_time_between=RTC;       
                     }
         //  else if ((RTC-bsr_time_between)>4096)
             //     {   //bsr_sound_excitated=0;
             //         TXREG=NAME_FIRST; 
              //      }
           else 
                {//if(bsr_sound_excitated==1)
                     TXREG=YES_SIR;
                   //  bsr_sound_excitated=0; 
					 switch(data)
                         {case COMMAND_ONE:  manual_auto_flag=1;  //出发
									 		 auto_go_back=gohead;                                                                                             			 
               								 break;                                       
 			  			  case COMMAND_TWO:  manual_auto_flag=1;  //回来
											 auto_go_back=goback;     
											 go_back_end=1;      
											 break;
              			  case COMMAND_THREE:                     //跳舞    
											  break;
              			  case COMMAND_FOUR:  break;              //纪录
                          default :           break;
					     }  
                 }       
             }  
        
}

⌨️ 快捷键说明

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