打印

关于步进电机三个问题,每题10分,谢谢

[复制链接]
3785|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题如下:
1,步进电机如何定位初始位置--就是每次启动都从一个固定位置开始?
2,步进电机如何利用步距角计算旋转角度--如四相电机,按A,B,C,D顺序给脉冲一次,是转动一个步距角么?
3,步进电机步距角虽有很多种类,如0.72,0.9等,但是其误差如何?会出现误差累加么?就是旋转很多周以后,同一位置与起始位置偏差角度慢慢变大。

相关帖子

沙发
jrcsh| | 2011-8-26 12:28 | 只看该作者
条件定位及限制单单一个步,无智能驱动IC,

1,步进电机如何定位初始位置--就是每次启动都从一个固定位置开始?
上次停哪就哪, 也就说是有可能弟一步/拍 有可能会发生反转。之后才按照顺旋转
解决方法: 编码器定位,算法定位起始拍从哪个开始,以保证不会反转。

2,步进电机如何利用步距角计算旋转角度--如四相电机,按A,B,C,D顺序给脉冲一次,是转动一个步距角么?
   默认电机会标出来标准备一步拍会转过多少度. 使用不同的拍控制方法,转过的角度不一样,配合拍数,
  另外,细分驱动也会影响这个一次转过的角度,但是用细分最后停的一步,细分角度无效,用标准一步/拍的角度来计算。

3,步进电机步距角虽有很多种类,如0.72,0.9等,但是其误差如何?会出现误差累加么?就是旋转很多周以后,同一位置与起始位置偏差角度慢慢变大。

误差不累计 是步进的特点之一
但是失步/丢步就会被累积 ,对精密控制来说~~~是严重的麻烦~~~必须闭环控制

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
板凳
CIOneTwo|  楼主 | 2011-8-26 14:52 | 只看该作者
非常感谢LS的回答,不过本人从未接触过步进电机,现在可能要用到步进电机做个系统,已经买了一个57,12V,1.8度步距角的电机。
请问编码器选择什么型号啊?
我之前那个小电机,四相五线的,我用四拍和八拍驱动,程序同样循环次数,转过的角度相同,是不是说明我那个电机已经被我玩坏了啊?因为在没上电的时候我用手拧过N次,这样是不是会损坏电机啊?
请问如何闭环控制啊?本人对此一窍不通啊。谢谢。

使用特权

评论回复
地板
jrcsh| | 2011-8-27 00:17 | 只看该作者
非常感谢LS的回答,不过本人从未接触过步进电机,现在可能要用到步进电机做个系统,已经买了一个57,12V,1.8度步距角的电机。
请问编码器选择什么型号啊?

不知~~~ 看你要达到什么样的精度 在来选输出多少个脉冲 在选型号

我之前那个小电机,四相五线的,我用四拍和八拍驱动,程序同样循环次数,转过的角度相同,

是肉眼观看还是有计量工具测量 ,  一圈都一样可以理解     走完四拍 和走完8拍距离一样也可以理解

  一样的距离 用4拍走完和8拍走完 你看 2种方法每拍的距离就不一样了把, 所以同样循环次数,同样距离是成立的 (也有前提, 你把拍序顺写了一个程序了 4拍与8拍只是换了这个处理程序,但完成循环次数是一样的)


是不是说明我那个电机已经被我玩坏了啊?因为在没上电的时候我用手拧过N次,这样是不是会损坏电机啊?
我常常也这以干~~~还能发发电~~~从没坏过.........


请问如何闭环控制啊?本人对此一窍不通啊。谢谢。
对输出进行反馈 , 确认,  你电机走一步哪 编吗器因当有反馈回来是不是达到计划中的量

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
5
airwill| | 2011-8-27 10:42 | 只看该作者
在没上电的时候我用手拧过N次,这样是不是会损坏电机啊?
不会. 这样只有可能损坏控制器, 所以如果你要手拧电机的话, 把电机的驱动线拔下, 就可以尽情地手拧了

使用特权

评论回复
6
CIOneTwo|  楼主 | 2011-8-27 13:50 | 只看该作者
回4楼:
不知~~~ 看你要达到什么样的精度 在来选输出多少个脉冲 在选型号
精度当然是达到不管旋转多少圈,同样的位置应该旋转完整圈后都回到起始点。
对于这个脉冲我不是很理解,我理解调整占空比可以改变速度,一个脉冲应该是针对一拍吧?我的要全很简单了,就是每次都转90度。

是肉眼观看还是有计量工具测量 ,  一圈都一样可以理解     走完四拍 和走完8拍距离一样也可以理解
是肉眼观察的,这也不用精确的测量工具,我只看每次转过360度,知否同一位置还是在起始位置,结果是有差异的。
  一样的距离 用4拍走完和8拍走完 你看 2种方法每拍的距离就不一样了把, 所以同样循环次数,同样距离是成立的 (也有前提, 你把拍序顺写了一个程序了 4拍与8拍只是换了这个处理程序,但完成循环次数是一样的)
这个的确是我疏忽了,不过我发现,我用程序控制每次走一拍,但是电机似乎一步都不会走,譬如我用4个按键,分别控制4拍的A,B,C,D,1/64的减速比,4拍每步就是360/64=5.625度,电机要是走的话我肉眼应该也能看出来啊。
另外能否提供一个编码器的型号啊,不管什么型号,提供一个,我看下Datasheet,心里有个数,不然不知道这编码器到底是怎么玩的,谢谢。

使用特权

评论回复
7
CIOneTwo|  楼主 | 2011-8-27 13:51 | 只看该作者
谢谢5楼版主

使用特权

评论回复
8
jrcsh| | 2011-8-27 21:28 | 只看该作者
不知~~~ 看你要达到什么样的精度 在来选输出多少个脉冲 在选型号
精度当然是达到不管旋转多少圈,同样的位置应该旋转完整圈后都回到起始点。

要完全一样基本很大难度,还是看你能接受的误差是多少,比如 0.01mm  0.001mm 0.0001mm

对于这个脉冲我不是很理解,我理解调整占空比可以改变速度,一个脉冲应该是针对一拍吧?我的要全很简单了,就是每次都转90度。

脉冲要分2个 , 一个是控制转速的脉冲(是改变频率为主,占空比应用技术在中高端才会用上), 一个是输出 拍序的脉冲 (使用驱动器时,部分产品/型号可以自己产生拍序)

是肉眼观看还是有计量工具测量 ,  一圈都一样可以理解     走完四拍 和走完8拍距离一样也可以理解
是肉眼观察的,这也不用精确的测量工具,我只看每次转过360度,知否同一位置还是在起始位置,结果是有差异的。

只要不发生失步, 由于步进电机的特性,误差不累积,你可以理解为会回到"相对"的起点(这个相对的误差就在2磁极中来回摆)

  一样的距离 用4拍走完和8拍走完 你看 2种方法每拍的距离就不一样了把, 所以同样循环次数,同样距离是成立的 (也有前提, 你把拍序顺写了一个程序了 4拍与8拍只是换了这个处理程序,但完成循环次数是一样的)
这个的确是我疏忽了,不过我发现,我用程序控制每次走一拍,但是电机似乎一步都不会走,譬如我用4个按键,分别控制4拍的A,B,C,D,1/64的减速比,4拍每步就是360/64=5.625度,电机要是走的话我肉眼应该也能看出来啊。
有些乱难理解


另外能否提供一个编码器的型号啊,不管什么型号,提供一个,我看下Datasheet,心里有个数,不然不知道这编码器到底是怎么玩的,谢谢。

我觉得你太想一步到位,只怕会更乱,不如你先完成电机的控制,在搞编码器的应用,在结合在一起用,这样会容易多了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
9
CIOneTwo|  楼主 | 2011-8-29 12:30 | 只看该作者
本帖最后由 CIOneTwo 于 2011-8-29 12:35 编辑

谢谢LS上啊,真是热心人啊。
我看了一两天资料了,还是有很多东西没搞明白。

如上图所示,我那四拍就是A,B,C,D,这里请问一下,走完4拍就是一步是吧?一步就是一个步距角是吧?1/64减速比,那么步距角就是360/64=5.625度是吧?
-----------------------------------------------------------------------------
如果上面都对,那么我那步进电机是不是就坏了啊,我用按键控制,每按一次走90度,那么把{A,B,C,D,}做为子程序的话,应该循环90/5.625=16是吧?但是实际我必须循环32次才能达到90度,请问这问题出在哪啊?
-----------------------------------------------------------------------------
如果电机误差不累加的话,每次只在两个磁极中间摆动,旋转一周误差顶多是0.01mm,或者0.0001mm等等,那么为什么我那电机每转一圈都会跟起始位置差一点呢?每次只是一点点,慢慢累加,越来越大,也不像失步啊,要是失步的话,每步5.625度,那么肉眼肯定看的出来是失步啊?
-----------------------------------------------------------------------------
现在又遇到新麻烦了,我买的那个电机,我想用24V驱动,功率要达到24W左右了,我看了L298N 75度温度时功率是25W,驱动不了啊,刚烧了一片,请问这样的驱动该怎么设计啊?用什么芯片啊?
-----------------------------------------------------------------------------
忘了一个问题,所谓的细分是啥意思啊?我只知道4拍,8拍控制,4拍就是{A,B,C,D},8拍就是{A,AB,B,BC,C,CD,D,DA},但是8拍有什么用啊?走完4拍是一步,走完8拍也是一步,那不都是5.625度吗?怎么控制只走5.625/2度呢?不明白!

使用特权

评论回复
10
jrcsh| | 2011-8-30 11:00 | 只看该作者
如上图所示,我那四拍就是A,B,C,D,这里请问一下,走完4拍就是一步是吧?一步就是一个步距角是吧?1/64减速比,那么步距角就是360/64=5.625度是吧?

1/64减速比,那么步距角就是360/64=5.625度是吧????
很不明白这个公式哪来的~~~

1/64减速比:是指输入轴(电机)转64圈, 输出轴转一圈(变速器) 一般是用在变速器上的一个参数

拍=步=转过多少度, 4拍为一个循环(也就是走了4步)

-----------------------------------------------------------------------------
如果上面都对,那么我那步进电机是不是就坏了啊,我用按键控制,每按一次走90度,那么把{A,B,C,D,}做为子程序的话,应该循环90/5.625=16是吧?但是实际我必须循环32次才能达到90度,请问这问题出在哪啊?

*(&$(#*&$*(#@&$(*@#&$(*@#$&([email=*#@$]*#@$[/email]&@#
-----------------------------------------------------------------------------
如果电机误差不累加的话,每次只在两个磁极中间摆动,旋转一周误差顶多是0.01mm,或者0.0001mm等等,那么为什么我那电机每转一圈都会跟起始位置差一点呢?每次只是一点点,慢慢累加,越来越大,也不像失步啊,要是失步的话,每步5.625度,那么肉眼肯定看的出来是失步啊?

*(&$(#*&$*(#@&$(*@#&$(*@#$&([email=*#@$]*#@$[/email]&@#

-----------------------------------------------------------------------------
现在又遇到新麻烦了,我买的那个电机,我想用24V驱动,功率要达到24W左右了,我看了L298N 75度温度时功率是25W,驱动不了啊,刚烧了一片,请问这样的驱动该怎么设计啊?用什么芯片啊?

充分利用2个参数, 电流与电压  ,电压的空间更大些, 如果超了就只能换更强的IC了
我学电机控制时是用2相5线步进电机+ULN2003/ULN2803 成本低 10块钱以下就可以玩了 ,  你因当找一本电机控制的书看看就好了.
-----------------------------------------------------------------------------
忘了一个问题,所谓的细分是啥意思啊?我只知道4拍,8拍控制,4拍就是{A,B,C,D},8拍就是{A,AB,B,BC,C,CD,D,DA},但是8拍有什么用啊?走完4拍是一步,走完8拍也是一步,那不都是5.625度吗?怎么控制只走5.625/2度呢?不明白!

名词找百度

由于你对行程角度的理解有误相关部分重新学过在研究把()#*$()@#*)$*)(@#$*()@#*$)(@

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
11
CIOneTwo|  楼主 | 2011-8-30 11:37 | 只看该作者
本帖最后由 CIOneTwo 于 2011-8-30 12:16 编辑

谢谢楼上,我也看了很多资料了,对57以下的小电机用ULN2003,L298驱动,不管是程序还是硬件,应该都了解一点了。
就是这个始终没搞明白-------->拍=步=转过多少度, 4拍为一个循环(也就是走了4步)
我不明白如果4拍=4步的话,我怎么控制每次只走一步呢?
for{i=32;i>0;i++)
{
  A;//A=1,B=0,C=0,D=0
  delay;
  A1;//A=0,B=0,C=0,D=0
  delay;
}
如上只给A脉冲,循环32次,电机是一动都不动啊,本人愚钝,还望指教,谢谢。
而且我实际使用中,我要循环32次{A,B,C,D}才能走过90度,
如果是一拍一步,那么32次x4拍x5.625步距角岂不是=720度???

使用特权

评论回复
12
jrcsh| | 2011-8-30 11:54 | 只看该作者
要控制步进电机动起来是有通电的顺序的 这个顺序就是 拍序了 只有按这个拍序来循环才能保证受控制,

主要拍序 4拍  8拍 (也叫单拍<4>,2拍半<8>)  

你说到的: 4拍就是{A,B,C,D},8拍就是{A,AB,B,BC,C,CD,D,DA},

4拍是一标准的控制方法每走过一拍转动的角度等于电机标定的角度(如 1.8度)哪就是1.8度 完成一个循环就是 1.8*4 =7.2度

8拍是针对4拍优化的控制方法每走过一拍转动的角度等于电机标定的角度(如 1.8度)的1/2哪就是1.8度/2=0.9度   完成一个循环就是 0.9*8 =7.2度

所以前边我说到 一样的程序换成4拍8拍 走过的距离/角度是一样的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
13
jrcsh| | 2011-8-30 11:58 | 只看该作者
这是二相5线 同极性驱动方法的 一个案例


/******************************************************************
/*                                                                *
/* KT900单片机开发系统演示程序 - 步进电机控制程序                 *
/*                                                                *
/* 步进电机启动时,转速由慢到快逐步加速。                         *
/*                                                                *
/* 邮箱: 89s51@163.com                                           *
/* 网站: http://www.150000.com                                   *
/* 作者: 007                                                     *
/* 时间: 2006/05/18                                              *
/*                                                                *
/*【版权】COPYRIGHT(C)南方电子 www.150000.com ALL RIGHTS RESERVED *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      *
/*                                                                *
/******************************************************************/
   
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>         //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
//uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
uchar rate ;        
/********************************************************/
/*                                                  
/* 延时
/* 11.0592MHz时钟,                                    
/*                                                      
/********************************************************/
void delay()
{                           
   uchar k,t;
   k = rate;
   t = 0x00;

   do{
       do{ _nop_();_nop_();_nop_();_nop_();
                 _nop_();_nop_();_nop_();_nop_();
             }while(--t);
               
     }while(--k);
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw()
{
   uchar i;

      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
}

/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/

main()
{     
   rate = 0x10;
   while(1)                     
    {  
     motor_ffw();          //电机正转
           if(rate>2)
           rate--;      
    }
}

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
14
jrcsh| | 2011-8-30 12:01 | 只看该作者
这个改成了 按一下 转几圈的 你看一下2个程序怎么样实现的也因当了解了

/******************************************************************
/*                                                                *
/* KT900单片机开发系统演示程序 - 步进电机控制程序                 *
/*                                                                *
/* 步进电机启动时,转速由慢到快逐步加速。                         *
/*                                                                *
/* 邮箱: 89s51@163.com                                           *
/* 网站: http://www.150000.com                                   *
/* 作者: 007                                                     *
/* 时间: 2006/05/18                                              *
/*                                                                *
/*【版权】COPYRIGHT(C)南方电子 www.150000.com ALL RIGHTS RESERVED *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      *
/*                                                                *
/******************************************************************/
   
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>         //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
         
/********************************************************/
/*                                                  
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uint k;
   while(t--)
   {
     for(k=0; k<125; k++)
     { }
   }
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw(uint n)
{
   uchar i;
   uint  j;
   for (j=0; j<12*n; j++)    //转1×n圈
    {
      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;          //取数据
          delay(15);             //调节转速
        }
    }
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void  motor_rev(uint n)
{
     uchar i;
         uint  j;
         for (j=0; j<12*n; j++)    //转1×n圈
      {
        for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = REV;          //取数据
          delay(15);             //调节转速
        }
      }
}
/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/

main()
{   
   while(1)                     
    {  
       motor_ffw(5);          //电机正转
       delay(1000);           //换向延时
       motor_rev(5);          //电机反转
       delay(1000);           //换向延时
    }
}

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
15
CIOneTwo|  楼主 | 2011-8-30 12:19 | 只看该作者
你说到的: 4拍就是{A,B,C,D},8拍就是{A,AB,B,BC,C,CD,D,DA},
4拍是一标准的控制方法每走过一拍转动的角度等于电机标定的角度(如 1.8度)哪就是1.8度 完成一个循环就是 1.8*4 =7.2度

8拍是针对4拍优化的控制方法每走过一拍转动的角度等于电机标定的角度(如 1.8度)的1/2哪就是1.8度/2=0.9度   完成一个循环就是 0.9*8 =7.2度
jrcsh 发表于 2011-8-30 11:54

按照这样的话,我那步进电机确实有问题了,确实是坏了,我那电机是5.625度的步距角,如果4拍=4步,那就是4x5.625x循环32次==720度,但是实际却只有90度。

使用特权

评论回复
16
CIOneTwo|  楼主 | 2011-8-30 12:24 | 只看该作者
void  motor_ffw()
{
   uchar i;

      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
}

jrcsh 发表于 2011-8-30 11:58


看到这个我明白了,我老是跟一个四相中的一个相过不去,除了我那个电机角度计算有问题外,其他我没问题了啊,谢谢LS耐心的讲解啊,非常感谢啊。

使用特权

评论回复
17
jrcsh| | 2011-8-30 12:45 | 只看该作者
void  motor_ffw()
{
   uchar i;

      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
}


恶~~~难到代码给人覆盖了?

因当是

void  motor_ffw()
{
   uchar i;

      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW[i];        //取数据
          delay();            //调节转速
        }
}
这样才起到了了关联拍序

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
18
CIOneTwo|  楼主 | 2011-8-30 12:51 | 只看该作者
for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
如果4拍或者8拍,都必须一次走完4拍或者8拍,那要怎么才能实现一次只走一个步距角呢?
就是说上面程序中的i应该必须是8吧?换乘1~7应该电机就不转了吧。

使用特权

评论回复
19
jrcsh| | 2011-8-30 18:50 | 只看该作者
for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
如果4拍或者8拍,都必须一次走完4拍或者8拍,那要怎么才能实现一次只走一个步距角呢?
就是说上面程序中的i应该必须是8吧?换乘1~7应该电机就不转了吧。


CIOneTwo 发表于 2011-8-30 12:51


也不是一定要走完 , 只在顺序能接上很方便,

只走 几拍也行, 程序上在作些处理就是了,

你只要搞实基础, 就能玩出很多花样,





以前写过的一个程序  这个就是单独走一步的,2个步进电机独立有自己的方向和速度

//===================
更新一下控制程序把  

电路  就用到2个 ULN2003  其它的现在还是直接IO驱动(电源部分还没接入,电源部分会有339电压比较器)


这次用C语言中的 "|" 运算来解决 一组 IO 同时驱动2个 步进电机同时工作时对另一个电机的影响(表现为另一个电机丢步,丧失准确的驱动力)  

//--------- 两相 5/6 线 步进电机同极性  2拍半/8拍  驱动----------------------------
// uchar code zj2[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; ////P14~7.  
10000000
11000000
01000000
01100000
00100000
00110000
00010000
10010000
(但愿我没打反了~~~哈哈)

void  motor_ffw2()  
{   
  // uchar i;  
   
      for (i=0; i<8; i++)     //
        {  
          P1 = fj2;         
         delay(30);     //上电延时(也可以说是变相控制频率/转速了)           
       // delay();   
       //调节转速  


(一个电机单独工作是没问题的)

//-------------------------------------
for (i=0; i<8; i++)   
{  
  P1 = zj1;        //取数据  
  delay(ccc2);     
P1 = fj2;        //取数据  
delay(ccc);  

这个驱动流程序就出问题(也可定义为逻辑错误了)

先是控制弟一个电机走一步 P1 = zj1;     //对应用的IO 为 0000XXXX  

在控制 弟二个电机走一步  P1 = fj2;   //对应用的IO 为 XXXX0000  //问题就出在了弟二次控制这了 这一改变IO 后导致 弟一个IO的电机~~~ 掉电 (ULN2003IO为高电平驱动)电机失去自己锁能,张紧力丢失.  
   
//-------------------------------------

使用了 "|" 运算 后 0000xxxx|xxxx0000 =xxxxxxxx 这样一组IO驱动2个电机都正常工作了  




   
#include <reg51.h>        
#include <intrins.h>  //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

sbit  key1 = P3^2;       //进入设置菜单
sbit  key2 = P3^3;       //确定设置
sbit  key3 = P3^4;        
sbit  key4 = P3^5;  
sbit  key5 = P3^6;       // a1 ++  
sbit  key6 = P3^7;       // a  ++

sbit  key8 = P3^0;       // a1 ++  
sbit  key9 = P3^1;  

uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0xff};

uchar code zj1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //P10~3. P20-3
uchar code fj1[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //P10~3. P20-3
uchar code zj2[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; ////P14~7.
uchar code fj2[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////P14~7.  

void delay(uint z);

uint aaa,bbb,ccc,ccc2,ggg,ggg2 ;   
uchar smg,i2,i;
void time0_int(void) interrupt 1   
{
   
    TR0=0;                     
    TH0=(65536-1000)/256;     
    TL0=(65536-1000)%256;     
    smg++; //数码管
    //ccc++; //
    ggg++; // 电机1
    ggg2++; // 电机2
        

TR0=1;                     
}



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

void delay(uint z)
{                           
   do{

_nop_();_nop_();_nop_();
     }while(--z);
}

main()
{      
TMOD=0x01;           //定时器0为方式1
TH0=(65536-2000)/256;   //给T0赋初值
TL0=(65536-2000)%256;       //定时5ms
ET0=1;                       //使能TO中断            
EA=1;           //开启总中断使能
TR0=1;           //T0开始计数
bbb=100;
ccc=30;
ccc2=40;
ggg=0;
ggg2=0;
i=0;
i2=0;
//aaa=1;//测试
//P2=0xff; //测试
//P1=0x00;//测试
while(1)                     
{   

if(key1==0)
{
aaa=1;
}

if(key2==0)
{
aaa=2;
}
if(key3==0)
{
aaa=3;
}
if(key4==0)
{
aaa=4;
}

if(aaa==1)
{



if(ggg>ccc)
{

ggg=0;

  P1=zj1|fj2[i2];//1  1正 2反
//P1=zj1|zj2[i2];//2  1正 2正
//P1=fj1|zj2[i2];//3  1反 2正
//P1=fj1|fj2[i2];//4  1反 2反
i++;
if(i>8)
{
i=0;
}
}
if(ggg2>ccc2)
{


ggg2=0;
//  P1=0x00;
  P1=zj1|fj2[i2];//1  1正 2反
//P1=zj1|zj2[i2];//2  1正 2正
//P1=fj1|zj2[i2];//3  1反 2正
//P1=fj1|fj2[i2];//4  1反 2反
i2++;
if(i2>8)
{
i2=0;
}

}
}

if(aaa==2)
{


if(key3==0)
{
ccc++;
delay(300);
}

if(key4==0)
{
ccc--;
delay(300);
}



if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1  1正 2反
P1=zj1|zj2[i2];//2  1正 2正
//P1=fj1|zj2[i2];//3  1反 2正
//P1=fj1|fj2[i2];//4  1反 2反
}
}
if(aaa==3)
{

if(key3==0)
{
ccc++;
delay(300);
}

if(key4==0)
{
ccc--;
delay(300);
}



if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1  1正 2反
//P1=zj1|zj2[i2];//2  1正 2正
P1=fj1|zj2[i2];//3  1反 2正
//P1=fj1|fj2[i2];//4  1反 2反
}
}
if(aaa==4)
{

if(key3==0)
{
ccc++;
delay(300);
}

if(key4==0)
{
ccc--;
delay(300);
}



if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1  1正 2反
//P1=zj1|zj2[i2];//2  1正 2正
//P1=fj1|zj2[i2];//3  1反 2正
P1=fj1|fj2[i2];//4  1反 2反
}
}
/*



*/

    }//w1
}//ma

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
CIOneTwo + 1
20
aoarm| | 2011-9-1 22:46 | 只看该作者
买一个周立功的开发板,什么都明白了

使用特权

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

本版积分规则

个人签名:贫寒铸就人格,逆境创造人生。

0

主题

1194

帖子

1

粉丝