打印

新手求助 单片机 定时器 步进电机

[复制链接]
1724|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanjunccc|  楼主 | 2011-11-4 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我编的一个程序
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>  //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint  unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
unsigned char code Tab[7]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82};  //数码管显示0~6的段码表
uint  n;
uint  m;
uint c=1;
uint b=1;
sbit  K1   = P3^2;       //一楼
sbit  K2   = P3^3;       //二楼
sbit  K3   = P3^4;       //三楼
sbit  K4   = P3^5;       //一楼
sbit  K5   = P1^4;       //二楼
sbit  K6   = P1^5;       //三楼
sbit  p1_0 = P1^0;
sbit  p1_1 = P1^1;
sbit  p1_2 = P1^2;
sbit  p1_3 = P1^3;
sbit  p2_0 = P2^0;
sbit  p2_1 = P2^1;
sbit  p2_2 = P2^2;
sbit  p2_3 = P2^3;
/********************************************************/
/*                                                  
/* 延时t毫秒
/* 11.0592MHz时钟,延时<1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uint k;
   while(t--)
   {
     for(k=0; k<80; k++)
     { }
   }
}
/**********************************************************/
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw(n)
{
   uchar i;
   uchar k;
   uchar r;
   uint  j;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)         //转1*n圈
    {p1_0=1 ; p1_1=0 ; p1_2=0 ; p1_3=0;
  delay(1);
  p1_0=1 ; p1_1=1 ; p1_2=0 ; p1_3=0;
  delay(1);
  p1_0=0 ; p1_1=1 ; p1_2=0 ; p1_3=0;
  delay(1);
  p1_0=0 ; p1_1=1 ; p1_2=1 ; p1_3=0;
  delay(1);
  p1_0=0 ; p1_1=0 ; p1_2=1 ; p1_3=0;
  delay(1);
  p1_0=0 ; p1_1=0 ; p1_2=1 ; p1_3=1;
  delay(1);
  p1_0=0 ; p1_1=0 ; p1_2=0 ; p1_3=1;
  delay(1);
  p1_0=1 ; p1_1=0 ; p1_2=0 ; p1_3=1;
     delay(1);                 //调节转速
        }
  }
    }
}
void  motor_ffw2(n)
{
   uchar i;
   uchar k;
   uchar r;
   uint  j;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)         //转1*n圈
   { p2_0=1 ; p2_1=0 ; p2_2=0 ; p2_3=0;
  delay(1);
  p2_0=1 ; p2_1=1 ; p2_2=0 ; p2_3=0;
  delay(1);
  p2_0=0 ; p2_1=1 ; p2_2=0 ; p2_3=0;
  delay(1);
  p2_0=0 ; p2_1=1 ; p2_2=1 ; p2_3=0;
  delay(1);
  p2_0=0 ; p2_1=0 ; p2_2=1 ; p2_3=0;
  delay(1);
  p2_0=0 ; p2_1=0 ; p2_2=1 ; p2_3=1;
  delay(1);
  p2_0=0 ; p2_1=0 ; p2_2=0 ; p2_3=1;
  delay(1);
  p2_0=1 ; p2_1=0 ; p2_2=0 ; p2_3=1;
     delay(1);                 //调节转速
        }
  }
    }
}

/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void  motor_rev(n)
{  uchar i;
   uchar k;
   uchar r;
   uint  j;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)         //转1*n圈
    {     p1_0=1 ; p1_1=0 ; p1_2=0 ; p1_3=1;
    delay(1);
    p1_0=0 ; p1_1=0 ; p1_2=0 ; p1_3=1;
    delay(1);
    p1_0=0 ; p1_1=0 ; p1_2=1 ; p1_3=1;
    delay(1);
    p1_0=0 ; p1_1=0 ; p1_2=1 ; p1_3=0;
    delay(1);
    p1_0=0 ; p1_1=1 ; p1_2=1 ; p1_3=0;
    delay(1);
    p1_0=0 ; p1_1=1 ; p1_2=0 ; p1_3=0;
    delay(1);
    p1_0=1 ; p1_1=1 ; p1_2=0 ; p1_3=0;
    delay(1);
          p1_0=1 ; p1_1=0 ; p1_2=0 ; p1_3=0;      
          delay(1);   //调节转速
            
        }
  }
    }
}   
void  motor_rev2(n)
{  uchar i;
   uchar k;
   uchar r;
   uint  j;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)         //转1*n圈
    {     p2_0=1 ; p2_1=0 ; p2_2=0 ; p2_3=1;
    delay(1);
    p2_0=0 ; p2_1=0 ; p2_2=0 ; p2_3=1;
    delay(1);
    p2_0=0 ; p2_1=0 ; p2_2=1 ; p2_3=1;
    delay(1);
    p2_0=0 ; p2_1=0 ; p2_2=1 ; p2_3=0;
    delay(1);
    p2_0=0 ; p2_1=1 ; p2_2=1 ; p2_3=0;
    delay(1);
    p2_0=0 ; p2_1=1 ; p2_2=0 ; p2_3=0;
    delay(1);
    p2_0=1 ; p2_1=1 ; p2_2=0 ; p2_3=0;
    delay(1);
          p2_0=1 ; p2_1=0 ; p2_2=0 ; p2_3=0;      
          delay(1);   //调节转速         
        }
  }
    }
}   
  /********************************************************/
/*
/*检测程序
/*
/********************************************************/
void check()
{ if(n>c)
  {motor_ffw(n-c);
  p1_0=0 ; p1_1=0 ; p1_2=0 ; p1_3=0;}
  else if(n<c)
  {motor_rev(c-n);
  p1_0=0 ; p1_1=0 ; p1_2=0 ; p1_3=0;}
  else if(n==c)
{p1_0=0 ; p1_1=0 ; p1_2=0 ; p1_3=0;}
  c=n;
}
void check2()
{ if(m>b)
  {motor_ffw2(m-b);
  p2_0=0 ; p2_1=0 ; p2_2=0 ; p2_3=0;}
  else if(m<b)
  {motor_rev2(b-m);
  p2_0=0 ; p2_1=0 ; p2_2=0 ; p2_3=0;}
  else if(m==b)
{p2_0=0 ; p2_1=0 ; p2_2=0 ; p2_3=0;}
  b=m;
}
/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/
main()
{
while(1)
    {  
      if(K1==0)
    {n=1;
    check();}
   if(K2==0)
    {n=2;
    check();}
   if(K3==0)
    {n=3;
    check();}
   if(K4==0)
    {m=1;
    check2();}
   if(K5==0)
    {m=2;
    check2();}
   else if(K6==0)
    {m=3;
    check2();}
    }
    }
电梯程序 只能等一部电梯运行之后才能 控制另一部电梯
有高手指导说 要用定时器 和中断
但是我补知道怎么改
请高手帮忙改下

相关帖子

沙发
diweo| | 2011-11-4 17:46 | 只看该作者
搬个椅子坐下,看天上会不会掉馅饼。

使用特权

评论回复
板凳
jiangzhe8525| | 2012-3-24 16:57 | 只看该作者
:lol

使用特权

评论回复
地板
yewuyi| | 2012-3-24 17:01 | 只看该作者
只能说这么多:定时器+中断+状态机。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝