单片机控制步进电机驱动器.c
上传用户:jiaxuan
上传日期:2014-10-16
资源大小:1k
文件大小:3k
开发平台:

C/C++

  1. //单片机控制步进电机驱动器的程序2007-05-11 23:00#include <reg52.h>
  2. #define INITIAL 0xff //INPUT INITIAL POSITION
  3. #define END 0x001ef //THE END OF THE WORK ROUTE
  4. #define SPEED 500 //IT IS THE NUMBER OF THE CIRCLES.
  5. #define HIGHSPEED_H 0xef //THE MOVING SPEED OF THE PLANT CORRESDING TO T0 TIMER
  6. #define HIGHSPEED_L 0xdd
  7. #define WORKSPEED_H 0xda //THE WORK SPEED OF THE PLANT CORRESDING TO T0 TIMER
  8. #define WORKSPEED_L 0xdd
  9. unsigned int position;
  10. //speed is the current T0
  11. unsigned int speed;
  12. //direction is a sbit, 1 means up, 0 means down
  13. bit direction;
  14. //idle indicates whether the plant is moving, 0 map moving, 1 means idle.
  15. bit idle;
  16. //desired_position indicate the position which is desired.
  17. unsigned int desired_position;
  18. //move_mode currently represent the two desired moving style
  19. //0 means work speed(low speed), 1 means move style(high speed).
  20. bit move_mode;
  21. void initialize(void)
  22. {
  23. P1_4 = 0;
  24. while (P1_5)
  25. unsigned int i;
  26. for (i=0; i < SPEED; i++)
  27. {
  28. }
  29. P1_2 = !P1_2;
  30. }
  31. position = INITIAL;
  32. desired_position = INITIAL;
  33. }
  34. ////////////////////////////////////////////////////////////////////////////////////////////
  35. void T0int(void) interrupt 1
  36. {
  37. TR0 = 0; //Need to check if it is necessary. 
  38. if (P1_2 && direction)
  39. {
  40. position++;
  41. }
  42. if (P1_2 && (!direction))
  43. {
  44. position--;
  45. }
  46. if (position != desired_position)
  47. {
  48. if (direction)
  49. {
  50. P1_4 = 1;
  51. }
  52. else
  53. {
  54. P1_4 = 0;
  55. }
  56. if (move_mode)
  57. {
  58. TH0 = HIGHSPEED_H;
  59. TL0 = HIGHSPEED_L;
  60. TR0 = 1;
  61. }
  62. else
  63. {
  64. TH0 = WORKSPEED_H;
  65. TL0 = WORKSPEED_L;
  66. TR0 = 1;
  67. }
  68. }
  69. P1_2 = ! P1_2;
  70. }
  71. //////////////////////////////////////////////////////////////////////////
  72. ///////////////////////////////////////////////////////////////////////////////
  73. void ready(void)
  74. desired_position = INITIAL;
  75. move_mode = 1;
  76. if (desired_position > position) 
  77. direction = 1;
  78. else if (desired_position < position)
  79. direction = 0;
  80. }
  81. ///////////////////////////////////////////////////////////////////////////////
  82. void work(void)
  83. {
  84. desired_position = END;
  85. direction = 1;
  86. move_mode = 0;
  87. }
  88. ///////////////////////////////////////////////////////////////////////////////
  89. void main (void)
  90. {
  91. initialize();
  92. IE = 0xfa;
  93. TMOD = 0x11;
  94. while (1)
  95. if (!P0_0)
  96. {
  97. unsigned char i;
  98. unsigned char ms;
  99. ms = 10;
  100. while(ms--)
  101. {
  102. for(i = 0; i < 200; i++);
  103. }
  104. if (!P0_0)
  105. {
  106. while(!P0_0){}
  107. ready();
  108. if ( position != desired_position)
  109. {
  110. TH0 = HIGHSPEED_H;
  111. TL0 = HIGHSPEED_L;
  112. TR0 = 1;
  113. }
  114. }
  115. }
  116. if (!P0_3)
  117. {
  118. unsigned char i;
  119. unsigned char ms;
  120. ms=10;
  121. while(ms--)
  122. {
  123. for(i = 0; i < 200; i++);
  124. }
  125. if (!P0_3)
  126. {
  127. while(!P0_3){}
  128. work();
  129. if (position != desired_position)
  130. {
  131. TH0 = WORKSPEED_H;
  132. TL0 = WORKSPEED_L;
  133. TR0 = 1;
  134. }
  135. }
  136. }
  137. }
  138.