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

📄 main.c

📁 飞思卡尔智能车测试程序,仅仅是调试程序
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
/*********************************************************
宏定义
*********************************************************/
#define Signal PORTA                      //信号采集
#define Sensor PWMDTY1               //传感器驱动信号                      
#define Speed PWMDTY3                //速度控制
#define Direction PWMDTY67          //方向控制
#define Mainsignal PORTB_PB7         //中间的传感器
#define Brake PORTB_PB1               //制动信号
#define LowSpeed1 35
#define LowSpeed2 30
#define HighSpeed1 55
#define HighSpeed2 50
#define uchar unsigned char
#define uint unsigned int

/********************************************************
全局变量定义
********************************************************/
/************************************************************
子函数申明
************************************************************/
void Pwminitial(void);            //PWM初始化函数
void SystemInitial();               //系统初始化
void Start();                           //启动
void Gostraight();                  //直线
void LeftTurn();                     //左转
void RightTurn();                   //右转
void Derailment();                 //出轨
void CrossDail();                    //交叉
void delay(uint time);            //延时
/*************************************************************
主函数开始
*************************************************************/
void main(void)
{
      SystemInitial();                  //系统初始化
      Start();                              //启动
      for(;;)
      {
            if(Mainsignal==0&&Signal==0XFF)             //判断中间传感器是否在黑线上
                  Gostraight();                //中间传感器在黑线上,走直线
            else  if(Signal==0XEF||Signal==0XDF||Signal==0XBF||Signal==0X7F)        //小车偏右
                        LeftTurn();             //左转
            else if(Signal==0XF7||Signal==0XFB||Signal==0XFD||Signal==0XFE)         //小车偏左
                        RightTurn();             //右转
            else if(Signal==0XFF)          //小车出轨
                        Derailment();           //出轨处理
            else if(Signal==0X00)          //遇到十字路口
                        CrossDail();            //处理交叉情况
      }
  
  EnableInterrupts;
  for(;;) {} /* wait forever */
  /* please make sure that you never leave this function */
}




/************************************************************
子函数定义
************************************************************/
void SystemInitial()               //系统初始化
{
      Pwminitial();
      DDRA=0X00;              //PORTA设置为输入
      DDRB_DDRB1=1;        //制动信号位设置为输出
      DDRB_DDRB7=0;        //中间传感器设置为输入
      Direction=1500;         //控制舵机转角的占空比寄存器,初始化时输出高电平时间为1.5ms,舵机处于平衡位置;  
      Speed=0;	                  //控制速度的占空比寄存器,占空比初始为0             Duty is 50%,and PWM waveform's frequent is 16  
      Sensor=49;	      //控制发射管驱动脉冲的寄存器,占空比初始为50%             Duty is 50%,and PWM waveform's frequent is 16  
      Brake=0;                    //关闭刹车信号
}
 void Start()                          //启动
 {
      static uchar i;
      for(i=0;Speed<30;i++)   //起始时让速度逐渐增加
      {
            Speed+=5;
            delay(1);
      }
 }
void Gostraight()                  //直线
{
      Direction=1500;             //舵机处于平衡位置
      Speed=HighSpeed1;      //速度为最高速度
}
void LeftTurn()                     //左转
{
      if(Signal==0XEF)
      {     
            Direction=1410;
            Speed=LowSpeed1;
            
      } else if(Signal==0XDF)
      {
            Direction=1320;
            Speed=LowSpeed1;
      } else if(Signal==0XBF)
      {
            Direction=1060;
            Speed=LowSpeed2;
      } else if(Signal==0X7F)
      {
            Direction=1000;
            Speed=LowSpeed2;
      }
}
void RightTurn()                   //右转
{
      if(Signal==0XF7)
      {     
            Direction=1590;
            Speed=LowSpeed1;
            
      } else if(Signal==0XFB)
      {
            Direction=1780;
            Speed=LowSpeed1;
      } else if(Signal==0XFD)
      {
            Direction=1940;
            Speed=LowSpeed2;
      } else if(Signal==0XFE)
      {
            Direction=2000;
            Speed=LowSpeed2;
      }
}
void Derailment()                 //出轨
{
      Brake=1;                       //刹车      
}
void CrossDail()                    //交叉
{
      Direction=1500;             //舵机处于平衡位置
      Speed=LowSpeed2;      //速度为低速度

}
void Pwminitial(void)            //PWM初始化函数
{
      PWMCTL_CON67=1;	//6和7联合成16位PWM;
      PWMPOL=0X8A;	           //PWMPOL是PWM极性选择寄存器。输出波形开始极性为1  output waveform which high first then low when the duty counter is reached
      PWMCAE=0x00;       	//PWMCAE是PWM波形对齐寄存器。左对齐输出模式            output left align waveform
      PWMCLK=0X0A;      	//PWMCLK是PWM时钟选择寄存器。PWM时钟源为ClockSA              SAClock SA is the clock source for PWM channel 1
      PWMPRCLK=0X33;   	//PWMPRCLK是PWM预分频寄存器。将总线时钟8分频
      				//Clock A is 8MHz/8=1MHz;Clock B is 8MHz/8=1MHz,
      PWMSCLA=0X09;     	//PWMSCLA是分频寄存器。时钟SA为1MHz/9/2        Clock SA is 1MHz/9/2=56KHz
      PWMSCLB=0X01;     	//PWMSCLB是分频寄存器。时钟SB为1MHz/1/2        Clock SB is 1MHz/1/2=500KHz

      PWMPER67 = 20000;	//周期20ms; 50Hz;(可以使用的范围:50-200hz)
      PWMPER3=99;               //PWMPER3是PWM通道周期寄存器。设定输出周期=通道时钟周期*100
      PWMPER1=99;     	//PWMPER0是PWM通道周期寄存器。设定输出周期=通道时钟周期*100

      PWME=0X8A;		 //使能通道67,1,3
}
void delay(uint time)
{
      static uint i,j,k;
      for(i=time;i>0;i--)
            for(j=1000;j>0;j--)
                  for(k=1000;k>0;k--);
}



⌨️ 快捷键说明

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