哪位大侠会51单片机控制的步进电机C语言程序

2024-11-23 02:51:01
推荐回答(3个)
回答1:

我上周刚做的这个实验  成功拉,给你参考一下吧 这可是我当时辛辛苦苦编出来的啊,不过我用的是L298驱动的  和ULN2003一样,你把它换成2003就行拉

#include 

unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00};

unsigned char temp,temp_old;

unsigned char key;

unsigned char i,j,k,m,s;

void delay(int i)

  {

   for(m=i;m>0;m--)

   for(j=250;j>0;j--)

   for(k=10;k>0;k--);

  }

void saomiao()

{

 P3=0xff;

  P3_4=0;

  temp=P3;

  temp=temp&0x0f;

  if(temp!=0x0f)

   {

    for(i=50;i>0;i--)

    for(j=200;j>0;j--);

    temp=P3;

    temp=temp&0x0f;

    if(temp!=0x0f)

     {

      temp=P3;

      temp=temp&0x0f;

      switch(temp)

       {

        case 0x0e:

        key=1;

         break;

        case 0x0d:

        key=2;

        break;

        case 0x0b:

        key=3;

        break;

        case 0x07:

        key=4;

        break;

       }

        temp=P3;

        temp=temp&0x0f;

        while(temp!=0x0f)

        {

         temp=P3;

         temp=temp&0x0f;

        }

     }

   }

  P3=0xff;

  P3_5=0;

  temp=P3;

  temp=temp&0x0f;

  if(temp!=0x0f)

   {

    for(i=50;i>0;i--)

    for(j=200;j>0;j--);

    temp=P3;

    temp=temp&0x0f;

    if(temp!=0x0f)

     { 

      temp=P3;

      temp=temp&0x0f;

      switch(temp)

       {

        case 0x0d:

        key=5;

        break;

        case 0x0b:

        key=6;

        break;

        case 0x07:

        key=7;

        break;

       }

        temp=P3;

        temp=temp&0x0f;

        while(temp!=0x0f)

        {

         temp=P3;

         temp=temp&0x0f;

        }

     

     }

   }

}

void main(void)

while(1)

{    

    saomiao();

    if(key==1)

     { P1=0;

      P2=0;

      saomiao();   

     }

    if(key==2)

     { 

      temp_old=key;

      for(s=0;s<8;s++)

           {  P2=table[s];

        P1_4=0;

        delay(13);

        saomiao();

        if(key!=temp_old)

         {

          P1_4=1;

          break;

         }

        }

     }

    if(key==3)

     {

      temp_old=key;  

      for(s=0;s<8;s++)

           {  P2=table[s];

        P1_5=0;

        delay(5);

        saomiao(); 

        if(key!=temp_old)

         {

          P1_5=1;

          break;

         }

        } 

     }

    if(key==4)

     {

         temp_old=key;

      for(s=0;s<8;s++)

           {  P2=table[s];

        P1_6=0;

        delay(20);

        saomiao(); 

        if(key!=temp_old)

         { 

          P1_6=1;

          break;

         }

          

        } 

     }

    if(key==5)

     {

        temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        P1_7=0;

        delay(13);

        saomiao(); 

        if(key!=temp_old)

         {

          P1_7=1;

          break;

         }

        } 

     }

    if(key==6)

     {

        temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        P1_5=0;

        delay(5);

        saomiao();

        if(key!=temp_old)

         {

          P1_5=1;

          break;

         }

        } 

     }

    if(key==7)

     {

               temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        P1_6=0;

        delay(20);

        saomiao(); 

        if(key!=temp_old)

         { 

          P1_6=1;

          break;

         }

        } 

     }

}

}

回答2:

#include "Stepper.h"

/* 定时器0服务子程序 */
void time0() interrupt 1 using 1 // 用定时器0中断来产生CLK时钟
{
/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
TH0 = -T/256;
TL0 = -T%256;
CLK = ~CLK;
}

/* 键消抖延时函数 */
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}

/* 键扫描函数 */
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P1 = scancode; // 输出行扫描码
if ((P1&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P1&0xf0)|0x0f;

/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}

/* 主程序 */
void main()
{
uchar key;

TMOD = 0x01; // 设置定时器0工作模式

EA = 1;
ET0 = 1;

/* 设置为2相激励 */
M1 = 0;
M2 = 0;

/* 设置为环形转向轨迹 */
M4 = 1;
M5 = 1;

EN = 0; // 切断驱动输出
RET = 0; // 归位输入无效

CWB = 1; // 初始设置为顺时针方向

while(1)
{
key = keyscan(); // 调用键盘扫描函数
switch(key)
{
case 0x11: // 0行0列,启动键
EN = 1; // 打开驱动输出
TH0 = -T/256; // 改变T可以改变步进电机转动速度
TL0 = -T%256;
TR0 = 1; // 定时器0开始计数
break;
case 0x21: // 0行1列,停止键
TR0 = 0; // 定时器0停止计数
EN = 0; // 切断驱动输出
break;
case 0x41: // 0行2列,切换转向按键
CWB = ~CWB;
break;
case 0x81: // 0行3列,归位键
RET = 1;
delay();
RET = 0;
break;
default:break;
}
}
}

小程序,你参考参考但只是没有涉及到PWM控制步进电机而已

回答3:

去书店,找本单片机书,有些书上面有这个程序!!抄下来了!!