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

📄 main.c

📁 用于飞思卡尔智能小车竞赛的自编程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#pragma MESSAGE DISABLE C12056   /*消除代码优化带来的隐患*/

#include "main_asm.h" /* interface to the assembly module */
////////////////////////////////////////////////////////////////////good///////////////////////////
 unsigned int mode=4;
 unsigned int lastmode=4;
word speed;
unsigned int  Sen_No[9]={0,0,0,0,0,0,0,0,0};

/*----------------------------------频率捕捉初始化------------------------------------------*/
void Init_ECT()
{
  PACTL|=0x50;  //用下降沿触发采集
}
/*-------------------------------------------------------------------------------------------*/
 
 //必须用5V触发PT7,利用PT7作为脉冲捕捉端!!!!!!!!!!!!!!!!!

/*------------------------------------参数初始化----------------------------------------------*/
void Init_Parameter1() 
{
  PORTB=0X00;
  DDRB=0Xff;//PORTB全为输出
  
  
  
  PORTA=0X00;
  DDRA=0X00;//PORTA都设为输入方式
  
  
//  EnableInterrupts;                   //开中断

}


void Init_Parameter2() 
{
  PORTB=0X00;
  DDRB=0X01;//PORTB除PORTB_BIT0为输出外,其余均设为输入方式
  
  
  
  PORTA=0X00;
  DDRA=0X00;//PORTA都设为输入方式
  
  
//  EnableInterrupts;                   //开中断

}
/*-------------------------------------------------------------------------------------------*/

/*------------------------------------时钟初始化----------------------------------------------*/
void Init_Timer() 
{
  TCNT=0x00;
  TSCR1 = 0x80;                // 使能TCNT
  TSCR2 = 0x00;                // 开时钟中断,分频 
}
/*--------------------------------------------------------------------------------------------*/


/*------------------------------------pwm初始化----------------------------------------------*/
static void PWM_Init()  
  {
  PWME=0x91;              //使用PWM0,PWM4(使用这两个是因为编程的时候高低位容易识别)
  PWMPOL=0x81;            	//PWM0高电平起始,PWM4低电平起始(两者永远相反)
  PWMCLK=0x91;           	//clock SA作为PWM0,PWM4的时钟源
  PWMPRCLK=0x01;           // clock A,B prescale : bus clock / 16		: 3MHz
  PWMCAE=0x00;		          //PWM数据输出左对齐
  PWMCTL=0x00;            	//PWM为独立的 8-bit PWM
  PWMSCLA=0x02;       //33886:Clock SA= Clock A / (2 * PWMSCLA)//500khz
  PWMSCLB=0xFF;       //33886:Clock SB= Clock B / (2 * PWMSCLB)//500khz    95
  PWMPER0=0x80;       //33886:PWM0 周期   
                      // PWMx Period = Channel Clock Period * (2 * PWMPERx)
  PWMPER4=0x80;       //33886:PWM4 周期   
                      // PWMx Period = Channel Clock Period * (2 * PWMPERx)
  PWMDTY0=0x40;       //PWM0 占空比
  PWMDTY4=0x40;       //PWM4 占空比 
  PWMPER6=0x94;       //33886:PWM7 周期: 19ms   
  PWMPER7=0xFF;       //33886:PWM7 周期: 19ms   
                      // PWMx Period = Channel Clock Period * (2 * PWMPERx) 
  PWMDTY6=0x0B;       //PWM7 占空比   1ms: 0x0D   2ms:  0x1B                  
  PWMDTY7=0x14;       //PWM7 占空比   1ms: 0x0D   2ms:  0x1B
       
  }
/*--------------------------------------------------------------------------------------------*/  

/*-----------------------------------舵机函数-------------------------------------------------*/ 
static void HDirection(int direc) {
 PWMDTY7=-direc+0x16;       //PWM7 占空比
 }                          //十进制数,左转为+,右转为-,-6至+6之间
/*----------------------------------------------------------------------
----------------------*/ 


/*--------------------------------------------------------------------------------------------*/ 

/*-----------------------------------电机函数-------------------------------------------------*/   
static void AMotor(int ASpeed) {
 ASpeed=-ASpeed;
 PWMDTY0=ASpeed+0x40;       //PWM0 占空比
 PWMDTY4=ASpeed+0x40;       //PWM4 占空比 
 PORTB_BIT0=1;}              //最小40速度
/*--------------------------------------------------------------------------------------------*/ 

/*------------------------------------延时1s小程序---------------------------------------------*/
void Delay_1s() 
{
  
  word counter1;
  word counter2;
  
  for(counter1=0;counter1<=65534;counter1++) 
  {
    
     for(counter2=0;counter2<=14;counter2++) 
     {
      asm{
      
        nop   //nop必须独占一行,不可与{}出现在同一行
        }
     }
  }

}
/*-----------------------------------------------------------------------------------------------------*/

/*------------------------------------光电&编码测速 信息读取---------------------------------------------*/
void Sensor_RD() {
 /*--------------------------信息读取---------------------------------------------*/ 
  Sen_No[8]=PORTA_BIT7;     //顺序从左-->右:8  
  Sen_No[7]=PORTA_BIT6;     //顺序从左-->右:7		 
  Sen_No[6]=PORTA_BIT5;     //顺序从左-->右:6
  Sen_No[5]=PORTA_BIT4;     //顺序从左-->右:5
  Sen_No[4]=PORTA_BIT3;     //顺序从左-->右:4
  Sen_No[3]=PORTA_BIT2;     //顺序从左-->右: 3
  //Sen_No[2]=PORTA_BIT1;     //顺序从左-->右:2
  Sen_No[2]=PORTA_BIT0;     //顺序从左-->右:2
  Sen_No[1]=PORTB_BIT1;     //顺序从左-->右:1
  
  //speed=PACN32;  //编码器测速可以使用,待需要时加入
  //PACN32=0;
  }
/*-----------------------------------------------------------------------------------------------------*/

/*---------------------------------------决策函数--------------------------------------------------------*/  
  
  /**************************数据处理决策**************************************/
  
  void Sensor_Decision() {
  
  
  
 
  lastmode=mode;
  
  if(Sen_No[4]==1&&Sen_No[5]==1&&Sen_No[3]==1)
  mode=0;   //直行,应当加速
  
  else if(Sen_No[4]==1&&Sen_No[5]==1)
  mode=1;   //车右偏,直行无妨,适当减速
  
  else if(Sen_No[4]==1&&Sen_No[3]==1)
  mode=2;   //车左偏,执行无妨,适当减速
  
  else if(Sen_No[5]==1&&Sen_No[4]!=1&&Sen_No[6]!=1)
  mode=3;   //车右偏,但车头正,直行无妨,适当减速
  
  else if(Sen_No[5]==1&&Sen_No[6]==1)
  mode=4;    //车右偏,舵机应当向左转5度
  
  else if(Sen_No[3]==1&&Sen_No[4]!=1)
  mode=5;    //车左偏,但车头正,直行无妨,适当减速
  
  else if(Sen_No[3]==1&&Sen_No[2]==1)
  mode=6;     //车左偏,舵机应当向右转5度
  
  else if(Sen_No[6]==1&&Sen_No[7]!=1&&Sen_No[5]!=1)
  mode=7;    //尽管车头正,但车右偏严重,舵机应当左转10度
  
  else if(Sen_No[6]==1&&Sen_No[7]==1)
  mode=8;    //舵机左转20度
  
  else if(Sen_No[2]==1&&Sen_No[3]!=1&&Sen_No[1]!=1)
  mode=9;    //尽管车头正,但车左偏严重,舵机应当右转10度
 
  else if(Sen_No[1]==1&&Sen_No[2]==1)
  mode=10;    //舵机右转20度
  
  else if(Sen_No[7]==1&&Sen_No[8]!=1&&Sen_No[6]!=1)
  mode=11;   //舵机左转30度 
  
  else if(Sen_No[7]==1&&Sen_No[8]==1)
  mode=12;   //紧急减速,舵机左转40度
  
  else if(Sen_No[1]==1&&Sen_No[2]!=1)
  mode=13;   //舵机右转30度
  
  else if(Sen_No[8]==1&&Sen_No[7]!=1)
  mode=14;   //紧急减速,舵机右转40度
  
 // else if(Sen_No[8]!=1&&Sen_No[7]!=1&&Sen_No[6]!=1&&Sen_No[5]!=1&&Sen_No[4]!=1&&Sen_No[3]!=1&&Sen_No[2]!=1&&Sen_No[1]!=1&&Sen_No[0]!=1)
 // mode=15;   //特殊情况,刹车,反转
 
  else lastmode=mode;
  
  
  switch(mode)
    {
         case 0:       //中央
         { if(lastmode==0) //继续维持中央状态
           {HDirection(0);
            AMotor(43);} 
            
            else if(lastmode==1)      //车右偏,直行无妨,适当减速
             {HDirection(0); 
              AMotor(43);} 
           
           else if(lastmode==3)      //车右偏,但车头正,直行无妨,适当减速
           {  HDirection(0);
              AMotor(43);
           }  
                
            else if(lastmode==2)      //车左偏,执行无妨,适当减速
            { HDirection(0); 
              AMotor(43); } 
              
            
             else if(lastmode==5)     //车左偏,但车头正,直行无妨,适当减速 
           {  HDirection(0);           
              AMotor(43);
           } 
           
           else {
            lastmode=mode;
            break;}}         
    
    case 1:      
         { if(lastmode==1) 
           {HDirection(0);
            AMotor(43);} 
            
           else if(lastmode==0) 
             {HDirection(0); 
              AMotor(43);} 
               
            else if(lastmode==3)
           {  HDirection(0);
              AMotor(43);
           } 
           
             else if(lastmode==4){
              HDirection(0);
              AMotor(43);
           } 
            
              
            else if(lastmode==2) 
            { HDirection(0); 
              AMotor(43); } 
              
           
           
           else {
            lastmode=mode;
            break;}
         }
           
           
     case 2:      
         { if(lastmode==2) 
           {HDirection(0);
            AMotor(43);}
            
            
            
            else if(lastmode==0) 
             {HDirection(0); 
              AMotor(43);} 
              
              
            else if(lastmode==1) 
            { HDirection(0); 
              AMotor(43); } 
              
            else if(lastmode==5)
           {  HDirection(0);
              AMotor(43);
           } 
           
             else if(lastmode==6){
             HDirection(0);
             AMotor(43);
           } 
           
           else {
            lastmode=mode;
            break;}}
           
    case 3:      
         { if(lastmode==3) 
           {HDirection(0);
            AMotor(43);}
            
            
            
            else if(lastmode==4)
           {  HDirection(1);
              AMotor(43);
           } 
           
             else if(lastmode==7)
           {  HDirection(1);
              AMotor(43);
           }  
            else if(lastmode==1) 
             {HDirection(1); 
              AMotor(43);} 
              
            else if(lastmode==0) 
            { HDirection(1); 
              AMotor(43); } 
               
            else {
            lastmode=mode;
            break;}}
    
      case 4:      
         { if(lastmode==4) 
           {HDirection(2);
            AMotor(43);}
            
            
            
            else if(lastmode==7)
           {  HDirection(2);

⌨️ 快捷键说明

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