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

📄 main.c

📁 实现步进电机的调速
💻 C
字号:

#include <msp430x22x4.h> 
typedef unsigned char uchar;
typedef unsigned int uint;
#define EnableON   P1OUT|=BIT4 ;      //ENABLE置为高  各相输出被强制关闭
#define EnableOFF  P1OUT&=~BIT4;     //ENABLE置为低 
//////////////////////////////////////////////////////
void initTIMERA0(void)
{
  TACTL=TASSEL_2+MC_1;    //开启定时器0中断  TA选择main时钟  增计数模式
  CCR0=50;
  
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA(void)
{
 P3OUT^=BIT0;          //取反
}


////////////////////////////////////////////////////////////按键部分
unsigned char keypoint=0;

void delay(int v)               //延时函数
    {
        while(v!=0)v--;
    }

unsigned char key(void)          //按键分析函数
  {
    unsigned char a;
    unsigned char x=0xff;
    P2OUT=0Xe0;                 //扫描第一行
    a=P2IN&0X0F;
    switch(a)
      {
      case 0x0E: x=0;break;
      case 0x0D: x=1;break;
      case 0x0B: x=2;break;
      case 0x07: x=3;break;
      default:break;
      }
    P2OUT=0Xd0;                //扫描第二行
    a=P2IN&0X0F;
    switch(a)
      {
      case 0X0E: x=4;break;
      case 0X0D: x=5;break;
      case 0X0B: x=6;break;
      case 0X07: x=7;break;
      default:break;
      }
    P2OUT=0Xb0;            //扫描第三行
    a=P2IN&0X0F;
    switch(a)
    {
      case 0X0E: x=8;break;
      case 0X0D: x=9;break;
      case 0X0B: x=10;break;
      case 0X07: x=11;break;
      default:break;
    }
    P2OUT=0X70;            //扫描第四行
    a=P2IN&0X0F;
    switch(a)
    {
      case 0X0E: x=12;break;
      case 0X0D: x=13;break;
      case 0X0B: x=14;break;
      case 0X07: x=15;break;
      default:break;
    }
  return(x);
}
///////////////////////////////////////////////////////////////////
unsigned char keypress(void)        //分析按键是否按下函数     
{
  unsigned char x=0;
  P2OUT=0x00;             //键盘硬件:P20--P23为列线,最左边一根为P20,列线120k电阻上拉,
  if((P2IN&0X0f)!=0X0F) x=1;      //         P24--P27为行线,最上边一根为P24,
  return(x);             // 无按键,返回 0;  有按键返回 1
}  
     
       
#pragma vector=PORT2_VECTOR

__interrupt void port2key(void)
{
  if(keypress())
     {
         delay(300)  ;   //消抖
         if(keypress())
           {
            keypoint=key();
           }
         while(keypress());   //等待按键松开
     }
   P2OUT=0X00;
   P2IFG=0X00;   //清除中断标志
   LPM0_EXIT;
}

////////////////////////////////////////////步进电机设置
void setspeed(void)     //改变速度
{
      EnableON;
       delay(500);
      CCTL0 = CCIE;                   
      CCR0 = 5000;
      EnableOFF;
      _NOP();
 
}
///////////////////////////////////////////////////
void init(void)
{
  P1DIR=0xff;
  P1SEL=0X00;
  P3DIR=0XFF;
  P3OUT|=BIT1;       //CK2置高
  P1OUT|=BIT3;       //RESET置为高
  P1OUT|=BIT7;      //REF IN 设置
  initTIMERA0();
  P1OUT &=~BIT2;        //正转
  setspeed();        //初始速度
  
  P2DIR=0Xf0;               //P20到P23输入  P24到P27输出
  P2SEL=0X00;               //p2为普通I/O管脚
  P2IES=0X0f;              //列线下降沿允许P2中断
  P2IE=0X0f;               //P20到P23允许中断
  P2OUT=0X00;
  P2IFG=0X00;              //中断寄存器清零
  
  
  
}


void main()
{
  WDTCTL=WDTHOLD+WDTPW;
  init();
  _EINT();
  while(1)
  {  
    LPM0;
   switch(keypoint)
  {
  case 1:
    {      
    P1OUT&=~BIT5;       //整步
    P1OUT&=~BIT6;  
    }
    break;
  case 2:
    {
    P1OUT|=BIT5;
    P1OUT&=~BIT6;       //1/2步
    }
  break;
  case 3:
    {
    P1OUT&=~BIT5;
    P1OUT|=BIT6;       //1/4步
    }
  break;
  case 4:
    {
    P1OUT|=BIT5;
    P1OUT|=BIT6;       //1/8步
    } break;
  case 5:
    {
      EnableON;
      delay(200);
     P1OUT|=BIT2;       //变为正转      
      EnableOFF;
   }
   break;
     case 6:
   {
     EnableON;
     delay(200);
     P1OUT&=~BIT2;      //变为反转     
      EnableOFF;
   }
  break;
  default:break;
  }
  }
 
}


⌨️ 快捷键说明

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