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

📄 main.c

📁 MC9S12DG128B
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/**********************************/
/*             车速模块           */
/**********************************/

void Motor_init(void) 
{
  DDRM_DDRM4=1;//设置M口4引脚为输出
  PTM_PTM4=1;//先将M口4脚设为高电平
  
 //设置PP3 
 DDRP_DDRP3=1;//设置P口3脚为输出
 PTP_PTP3=0;//设置3脚为低电平,如果2脚为高电平,则正转
 
 //先将PP2置为低电平
 DDRP_DDRP2=1;
 PTP_PTP2=0;
 
 //设置PP2为方波输出模式
  PWMCAE_CAE2=0;//选择模式为左对齐
  PWMCNT2=0;//计数器清零
  PWMPOL_PPOL2=1;//先输出高电平
  PWMPRCLK_PCKB=3;//clockB8分频,即为1MHz
  PWMCLK_PCLK2=0;//选择B为时钟源
  PWMPER2=255;//
  PWME_PWME2=0;//不允许2输出脉冲 
}

void Motor_set(byte n_motor) 
{
  PWMDTY2=n_motor;  //设置高电平时间
  PWME_PWME2=1;//允许2输出脉冲
}


/**********************************/
/*             伺服模块           */
/**********************************/
void Servo_init(void) 
{
  PWMCTL_CON01=1;//0与1通道联合成16位PWM
  PWMCAE_CAE1=0;//选择模式为左对齐
  PWMCNT01=0;//计数器清零
  PWMPOL_PPOL1=1;//先输出高电平
  PWMPRCLK_PCKA=0;//clockA二分频,即为8MHz
  PWMSCLA=4;//clockSA8分频,clockSA=1MHz
  PWMCLK_PCLK1=1;//选择SA为时钟源
  PWMPER01=20000;//周期为20ms,50Hz
  PWMDTY01=1520;//高电平时间为1520us,大于左转,小于右转
  PWME_PWME1=1;//允许1输出脉冲 
}

void Servo_set(word n_servo)
{
  PWMDTY01=n_servo;    
}


/**********************************/
/*           路况采集模块         */
/**********************************/
struct
{
  byte led0;
  byte led1;
  byte led2;
  byte led3;
  byte led4;
  byte led5;
  byte led6;
  byte led7;
  byte led8;
  byte led9;
  byte led10;
  byte led11;  
}road={1,1,1,1,1,1,1,1,1,1,1,1};

void Led_init() 
{
  DDRH_DDRH7=0;   //LED0定义为输入
  DDRH_DDRH6=0;   //LED1
  DDRH_DDRH5=0;   //LED2
  DDRH_DDRH4=0;   //LED3
  DDRJ_DDRJ1=0;   //LED4
  DDRJ_DDRJ0=0;   //LED5
  DDRK_BIT5=0;    //LED6
  DDRK_BIT4=0;    //LED7
  DDRK_BIT3=0;    //LED8
  DDRK_BIT2=0;    //LED9
  DDRK_BIT1=0;    //LED10
  DDRK_BIT0=0;    //LED11
}

void Led_get() 
{
  road.led0=PTH_PTH7;
  road.led1=PTH_PTH6;  
  road.led2=PTH_PTH5;
  road.led3=PTH_PTH4;
  road.led4=PTJ_PTJ1;
  road.led5=PTJ_PTJ0;
  road.led6=PORTK_BIT5;
  road.led7=PORTK_BIT4;
  road.led8=PORTK_BIT3;
  road.led9=PORTK_BIT2;
  road.led10=PORTK_BIT1;
  road.led11=PORTK_BIT0;
}

void Led_on() 
{
  DDRM_DDRM0=1;//设置0为输出
  PTM_PTM0=1;//设为高电平,开三极管  
}

void Led_off() 
{
  PTM_PTM0=0;//关三极管
}

/**********************************/
/*           时间中断模块         */
/**********************************/
 void Timer_init(void) 
 {
  MCCTL_MCEN=1;   //开启减法计数器
  MCCTL_MODMC=1; //减到零后自动置位,循环计数方式
  MCCTL_MCZI=1; //允许减法计数器中断
  MCCTL_MCPR=2;//总线8分频,即为1MHz
  MCCNT=1000;//1ms溢出一次,触发一次中断
  MCFLG=0X80;//清空中断标志寄存器
 }


/**********************************/                                                                                            
/*           主程序               */
/**********************************/
byte bstart=1;
byte demand=0;
void main(void) 
{
  byte speed_motor=100;//电机速度
  word angle_servo=1520;//舵机转动角度
  
  DDRM_DDRM6=0;  //调试用
  
  
  Motor_init();
  Servo_init();
  Led_init(); 
  Timer_init();  
  
  EnableInterrupts;//允许中断
  while(bstart) ;//延时两秒 
  while(1)
  {  
    if(demand) 
    {
      if(road.led0==1) {speed_motor=50; angle_servo=1570;} 
      if(road.led1==1) {speed_motor=60; angle_servo=1560;}
      if(road.led2==1) {speed_motor=70; angle_servo=1550;}
      if(road.led3==1) {speed_motor=80; angle_servo=1540;}
      if(road.led4==1) {speed_motor=90; angle_servo=1530;}
      if(road.led5==1) {speed_motor=100;angle_servo=1520;}
      if(road.led6==1) {speed_motor=100;angle_servo=1520;}
      if(road.led7==1) {speed_motor=90; angle_servo=1510;}
      if(road.led8==1) {speed_motor=80; angle_servo=1500;}
      if(road.led9==1) {speed_motor=70; angle_servo=1490;}
      if(road.led10==1){speed_motor=60; angle_servo=1480;}
      if(road.led11==1){speed_motor=50; angle_servo=1470;} 
      demand=0;  
      Motor_set(speed_motor);
      Servo_set(angle_servo);        
    }

   if(PTM_PTM6==1) {while(PTM_PTM6);Motor_set(1);MCCTL_MCZI=0; } //测试用       
  } 
  

    
  
}
/**********************************/
/*           中断程序             */
/**********************************/
#pragma CODE_SEG NON_BANKED
 interrupt 26 void timer_interrupt(void) 
 {
  static word timecnt=0;
  static byte time=1;
  timecnt++;
  if(time)  //这段的作用是暂停两秒
  {
    if(timecnt==2000) 
    {
     DDRB=0xFF;
     PORTB=0; 
     bstart=0; 
     time=0;timecnt=0;
     Led_on();//Led开启 
    }
  }
  if(!time) //这段的作用是每40ms采集一次路面数据
  {    
    if(timecnt==40) 
    {
      DDRB=0xFF;
      PORTB=0xFF;
      Led_get();
      timecnt=0;
      demand=1;//开始数据处理
    }
  }
  
  
 
  MCFLG=0x80;
 }

#pragma CODE_SEG	DEFAULT

⌨️ 快捷键说明

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