qhshilin 发表于 2010-4-13 18:02:48

发布单相电机的控制源代码!!!

发布单相电机的控制源代码
MCU:AVR M8及以上的单片机!
6个NPN三极管
6个继电器
四个按钮开关
4个LED灯!!
/***********************************************************************************/
#include<iom128v.h>
#include<macros.h>
/*系统重要参数定义*/
#define   uchar                unsignedchar
#define   uint               unsignedint
#define   Power_Transistor   1/*"0"=PNP,"1"=NPN*/
#define   Led_ode            0/*"1"=送出高电平亮,"0"=送出低电平亮*/
#define   Clock_Fre            8000000
/*系统资源分配及其管教定义*/
#define   Switch_Stop          PB0
#define   Switch_Forward       PB1
#define   Switch_Inversion   PB2
#define   Switch_Start_stop    PB3
#define   Start_stop_LedSignal PB4
#define   Inversion_LedSignalPB5
#define   Forward_LedSignal    PB6
#define   Stop_LedSignal       PB7
#define   Beep_Led_Flage       PD1
#define   Power_Switch1      PD2
#define   Power_Switch2      PD3
#define   Brige_Arm1         PD4
#define   Brige_Arm2         PD5
#define   Brige_Arm3         PD6
#define   Brige_Arm4         PD7
/*系统主要宏定义*/   
#if (   (Clock_Fre/1000000)>16 )
#errorCrystal of your choice too,please select it again!
#else
#define   DELAY_NUM            5*(Clock_Fre/1000000)
#define   DELAY_Dead         DELAY_NUM*2
#endif
#define   Stop_Flage                    Switch_Stop
#define          Forward_Flage             Switch_Forward
#define          Inversion_Flage           Switch_Inversion
#define          Start_stop_Flage           Switch_Start_stop
#define          SS_Led_Flage         Start_stop_LedSignal
#define          Inversion_Led_FlageInversion_LedSignal
#define          Forward_Led_Flage           Forward_LedSignal
#define          Stop_Led_Flage           Stop_LedSignal
/*系统标志位定义*/
uchar   SystemRun_Flage;          /*系统运行标志*/
uchar   Motor_Inversion;          /*电机反转标志*/
uchar   Motor_Forward;                  /*电机正转标志*/
uchar   Sys_Stop_Flage;          /*系统启/停标志*/
//
uchar   Forward_Views;
uchar   Inversion_Views;
uchar   SystemRun_Views;
uchar   KeyVal;
voidBeep_Mes(uchar number);
/*   各个功能函数      */
/*电源开关函数之打开电源函数*/
voidPower_On()
{
#if( Power_Transistor==0 )
          PORTD&=~(BIT(Power_Switch1)|BIT(Power_Switch2));
#else
          PORTD|=BIT(Power_Switch1)|BIT(Power_Switch2);
#endif

}
/*关闭电源函数*/
void   Power_Off()
{
#if( Power_Transistor==0 )
               
          PORTD|=BIT(Power_Switch1)|BIT(Power_Switch2);
#else
          PORTD&=~(BIT(Power_Switch1)|BIT(Power_Switch2));
#endif
}
/*电机正转函数*/
voidMot_Forward()
{           
#if(Led_ode==1)                        /*因LED灯的极性定义开关值*/
          PORTB&=~(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage));
          PORTB|=BIT(Forward_Led_Flage);
#else                                                
          PORTB|=BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage);
          PORTB&=~(BIT(Forward_Led_Flage));
#endif
          PORTD|=BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3);
   
}
/*电机反转函数*/
voidMot_Inversion()
{   
#if(Led_ode==1)                        /*因LED灯的极性定义开关值*/
          PORTB&=~((BIT(Stop_Led_Flage)|BIT(Forward_Led_Flage));
          PORTB|=1<<Inversion_Led_Flage;
#else                                                
          PORTB|=BIT(Stop_Led_Flage)|BIT(Forward_Led_Flage);
          PORTB&=~(BIT(Inversion_Led_Flage));
#endif
          PORTD&=~(BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3));
   
   
}
/*电机定转函数*/
voidMot_Stop()
{      
#if(Led_ode==1)                        /*因LED灯的极性定义开关值*/
          PORTB&=~(BIT(Forward_Led_Flage)|BIT(Inversion_Led_Flage));
          PORTB|=BIT(Stop_Led_Flage);
#else                                                
          PORTB|=BIT(Forward_Led_Flage)|BIT(Inversion_Led_Flage);
          PORTB&=~(BIT(Stop_Led_Flage));
#endif          
          Power_Off();
}
/********************系统延时函数************************************
   函数名:系统延时函数
功    能:给系统各模块提供延时功能
参    数:uchar delaynumber
         delaynumber:具体要延时的时间参数。
逻辑说明:无
   返回值:无
修改日期:01-04-2010
   作者:qhshilin
*******************************************************************/
voidDelay(uchar delaynumber)
{
          uint   x;
while(delaynumber--)
{
   for(x=0;x>1141;x++);x=1141;
}

}
/********************正向转动函数*********************************
   函数名:正向转动函数
功    能:实现电机的正向转动
参    数:无
逻辑说明:前提是系统必须运行中,如果是第一次运行该函数,先断电后
         启动正方向转动函数,因为要防止电桥发生死区;如果是第二
                   次运行,直接运行正方向转动函数并报警。
   返回值:无
修改日期:01-04-2010
   作者:qhshilin
*******************************************************************/
void Forward_M()
{      uchar cont;
          Inversion_Views=0;
          Forward_Views++;
if(Forward_Views==2)       {Forward_Views=1,Beep_Mes(2);Mot_Forward();}
else
   {
                 Power_Off();
          for(cont=DELAY_NUM*DELAY_Dead ;/*DELAY_NUM为总的延时次数参数,*/
                                             /*DELAY_Dead为电桥电压死区的延时参数
                                                                           保证电桥没有电压死区提供足够的时间*/
                cont>0;cont--)
                {
          Delay(200);Delay(200);Delay(100);
                }
                  Mot_Forward();
                 Power_On();
   }
}
/********************反向转动函数***********************************
   函数名:反向转动函数
功    能:实现电机的反向转动
参    数:无
逻辑说明:前提是系统必须运行中,如果是第一次运行该函数,先断电后启
         动反方向转动函数,因为要防止电桥发生死区;如果是第二次运行,直接运
         行反方向转动函数并报警。
   返回值:无
修改日期:01-04-2010
   作者:qhshilin
*******************************************************************/
void Inversion_M()
{
          ucharcont;
              Forward_Views=0;
              Inversion_Views++;
if(Inversion_Views==2)       {Inversion_Views=1,Beep_Mes(2);Mot_Inversion();}
else
   {
                 Power_Off();
          for(cont=DELAY_NUM*DELAY_Dead/*DELAY_NUM为总的延时次数参数,
                                             DELAY_Dead为电桥电压死区的延时参数
                                                                       保证电桥没有电压死区提供足够的时间*/
                ;cont>0;cont--)
                {
          Delay(200);Delay(200);Delay(100);
                }
                  Mot_Inversion();
                 Power_On();
   }
}
/********************停转函数****************************************
   函数名:停转电机
功    能:停止电机转动
参    数:无
逻辑说明:在系统没有运行之前,按住这个按钮,进行报警,在已经
         停止电机转动之后,再次按下这个按钮再次进行报警。
   返回值:无
修改日期:01-04-2010
   作者:qhshilin
*******************************************************************/
voidStop_M()
{       
if(Inversion_Views||Forward_Views)
   {
              Power_Off();
          Mot_Stop();
              Inversion_Views=Forward_Views=0;
          }
else
          Beep_Mes(3);
}
/********************报警函数****************************************
   函数名:报警函数
功    能:报警显示
参    数:uchar number
         number:要报警显示的次数,类型:uchar;
逻辑说明:无
   返回值:无
修改日期:01-04-2010
   作者:qhshilin
*******************************************************************/
voidBeep_Mes(uchar number)
{
          uchar x, cont;
                  x=number;
   while(x--)
   {
#if(Led_ode==1)   
          PORTD|=BIT(Beep_Led_Flage);
#else
          PORTD&=~(BIT(Beep_Led_Flage));
#endif
               
          
        for(cont=DELAY_NUM;cont>0;cont--)
                {
          Delay(200);Delay(200);Delay(100);
                  Delay(200);Delay(200);Delay(100);
                }
               
#if(Led_ode==1)   
          PORTD&=~(BIT(Beep_Led_Flage));
#else
          PORTD|=BIT(Beep_Led_Flage);
#endif               
               
   for(cont=DELAY_NUM;cont>0;cont--)
                {
          Delay(200);Delay(200);Delay(100);
                  Delay(200);Delay(200);Delay(100);
                }
}
}
void main()
{
          void (*FunPointer)();
                  void (*FunPointer2)(uchar x);
          uchar Val;
          DDRD=0xff;
          PORTD&=252;
#if( Power_Transistor==0 )
          PORTD&=~(BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3));
#else
          PORTD|=BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3);
#endif
         
          Power_Off();
                  DDRB=0xff;
#if(Led_ode==1)   
          PORTB=0x0f;
#else
          PORTB=0xff;
#endif
          PORTB|=0x0f;
          DDRB=0xf0;
          Val=PINB%16;
if(Val!=15)goto Error;
               FunPointer2=Beep_Mes;
               (*FunPointer2)(3);
               
ok:                                //系统工作
   while(1)
   {
Rep:      Val=PINB%16;
      if(Val!=15)
          {
              Delay(250);Delay(250);
                  Val=PINB%16;
       if(Val!=15)
             {
                   KeyVal=Val;
                   while((PINB%16)!=15);
                   goto State;
                   }
               }
              else
          goto Rep;
State:
      
      if(KeyVal==7)
          {          
              SystemRun_Views++;
          if(SystemRun_Views==1)
             {
                  SystemRun_Flage=1;
          #if(Led_ode==1)   
          PORTB|=BIT(SS_Led_Flage);
      #else
          PORTB&=~(BIT(SS_Led_Flage));
      #endif
                        }
        else
           if(SystemRun_Views==2)
             {
                  SystemRun_Views=0;SystemRun_Flage=0;
          #if(Led_ode==1)   
          PORTB&=~(BIT(SS_Led_Flage));
      #else
          PORTB|=BIT(SS_Led_Flage);
      #endif
                #if(Led_ode==1)   
          PORTB&=~(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage)|BIT(Forward_Led_Flage));
      #else
              PORTB|=(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage)|BIT(Forward_Led_Flage));
      #endif
          Power_Off();   
              Inversion_Views=Forward_Views=0;
          }       
        }
          if(SystemRun_Views&&(KeyVal==11)) FunPointer=Inversion_M,(*FunPointer)();
       else
       if(SystemRun_Views&&(KeyVal==13)) FunPointer=Forward_M,(*FunPointer)();
       else
       if(SystemRun_Views&&(KeyVal==14)) FunPointer=Stop_M,(*FunPointer)();
          else
          if(KeyVal==7)        ;
          else
          {FunPointer2=Beep_Mes;(*FunPointer2)(2);}
                  KeyVal=0;
   
goto Rep;
}
Error:
       while(1)
           {FunPointer2=Beep_Mes;
               (*FunPointer2)(3);
          Val=PINB%16;
      if(Val!=15)goto Error;
          else
          goto ok;
           }
}




/**********************************************************************************/
页: [1]
查看完整版本: 发布单相电机的控制源代码!!!