搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2010-4-13 18:02:48 | 显示全部楼层 |阅读模式
发布单相电机的控制源代码
MCU:AVR M8及以上的单片机!
6个NPN三极管
6个继电器
四个按钮开关
4个LED灯!!
/***********************************************************************************/
#include<iom128v.h>
#include<macros.h>
/*系统重要参数定义*/
#define   uchar                unsigned  char
#define   uint                 unsigned  int
#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_LedSignal  PB5
#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 )
#error  Crystal 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_Flage  Inversion_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;
void  Beep_Mes(uchar number);
/*   各个功能函数      */
/*电源开关函数之打开电源函数*/
void  Power_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
}
  /*电机正转函数*/
void  Mot_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);
   
}
/*电机反转函数*/
void  Mot_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));
   
   
}
/*电机定转函数*/
void  Mot_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
*******************************************************************/
void  Delay(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()
{  
          uchar  cont;
              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
*******************************************************************/
void  Stop_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
*******************************************************************/
void  Beep_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;
           }
}




/**********************************************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 22:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表