用52单片机驱动电机,把while语句改成for语句,电机不转了

2020-02-01 16:23发布

本帖最后由 cc_maple 于 2013-1-6 14:52 编辑

单片机是AT89S52,用单片机通过Pulse和Dir端口控制电机驱动器,然后电机驱动器再驱动2相57步进电机

刚开始的代码是这样的:
  1. void main()
  2. {       
  3.         DelayMs(100);
  4.         DIR = 0;
  5.         DelayMs(100);
  6.         PUL = 1;

  7.         while(1){       
  8.                         PUL = 1;
  9.                         delay_even_us(100);
  10.                         PUL = 0;
  11.                         delay_even_us(100);
  12.         }
  13.        
  14. }
复制代码DelayMs()  delay_even_us()分别是延时函数,DIR, PUL为单片机P0口端口

然后改成这样:
  1. void main()
  2. {       
  3.         DelayMs(100);
  4.         DIR = 0;
  5.         DelayMs(100);
  6.         PUL = 1;

  7.         for(TimeCount = 0; TimeCount < 40000; TimeCount++){       
  8.                         PUL = 1;
  9.                         delay_even_us(100);
  10.                         PUL = 0;
  11.                         delay_even_us(100);
  12.         }
  13.        
  14. }
复制代码我的想法是让电机转一段时间就停止,就套用了循环,但是发现电机根本不会转,这个到底是什么原因啊?


完整的代码,主函数里使用的是while语句
  1. /*****************************
  2. *Date:2012.12.9
  3. *Function:电机信号控制,控制减速电机来回移动
  4. *晶振:11.0596MHz
  5. *****************************/

  6. #include <intrins.h>
  7. #include <reg52.h>

  8. sbit        PUL = P1^0;
  9. sbit         DIR = P1^1;

  10. unsigned int    TimeCount = 0;

  11. /*
  12. *延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms                 
  13. */
  14. void DelayMs(unsigned int i)
  15. {
  16.         unsigned int j;
  17.         while(i--)
  18.         {
  19.                 for(j = 0; j < 125; j++);       
  20.         }
  21. }

  22. /*
  23. *延时函数, 精确延时偶数个us(是在晶振为12MHz的情况下)                 
  24. */
  25. void delay_even_us(unsigned char even)
  26. {
  27.         #pragma asm
  28.                 mov a, r7
  29.                 subb a,#10H
  30.                 mov         b,#02H
  31.                 div  ab
  32.                 mov  r0,a
  33.                 nop
  34.         loop:
  35.                 djnz r0,loop
  36.         #pragma endasm
  37. }

  38. void main()
  39. {       
  40.         DelayMs(100);
  41.         DIR = 0;
  42.         DelayMs(100);
  43.         PUL = 1;

  44.         while(1){       
  45.                         PUL = 1;
  46.                         delay_even_us(100);
  47.                         PUL = 0;
  48.                         delay_even_us(100);
  49.         }       
  50. }

复制代码____________________________________________________________________
PS:我用示波器看了下,发现单片机端口虽然输出低电平,但感觉低电平输出太低了,电机驱动器跟单片机的连接如下,PUL端跟单片机端口的电路这样子是否有问题啊,怎样子电平才够低啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
dysxq
1楼-- · 2020-02-01 19:43
TimeCount用long类型,int的话,在51里只有16位,最大值才32768
cc_maple
2楼-- · 2020-02-01 20:35
dysxq 发表于 2013-1-5 21:51
TimeCount用long类型,int的话,在51里只有16位,最大值才32768

我使用的是unsigned int的类型
tony_sgt
3楼-- · 2020-02-02 00:31
void main()

{        

        DelayMs(100);

        DIR = 0;

        DelayMs(100);

        PUL = 1;



        for(TimeCount = 0; TimeCount < 40000; TimeCount++){        

                        PUL = 1;

                        delay_even_us(100);

                        PUL = 0;

                        delay_even_us(100);

        }

      while(1); //少了這個程序停不住...  

}
dlmaowf
4楼-- · 2020-02-02 04:24
楼上正解
cc_maple
5楼-- · 2020-02-02 10:23
 精彩回答 2  元偷偷看……
cc_maple
6楼-- · 2020-02-02 12:21
是不是电机转起来需要一个加速的过程啊?

一周热门 更多>