99网
您的当前位置:首页51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

来源:99网


51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位

显示)

自己写的,不规范还望包含,keil和protues文件

单片机源程序如下:

1. #include

2. #define uchar unsigned char

3. #define uint unsigned int

4. uint speed = 100; //5. uint max = 200; //6. uint min = 20; //7. sbit swich = P2^0; //8. sbit dir = P2^1; //9. sbit le1=P2^6;

10. sbit le2=P2^7;

11. sbit speedadd=P3^2;

12. sbit speedsub=P3^3;

初始转速

最慢转速

最快转速

总开关

电机旋转方向

13. unsigned char uca_MotorStep[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; //励磁电流数组。

14. uchar leddata[]={

15. 0x3F, //\"0\"

16. 0x06, //\"1\"

17. 0x5B, //\"2\"

18. 0x4F, //\"3\"

19. 0x66, //\"4\"

20. 0x6D, //\"5\"

21. 0x7D, //\"6\"

22. 0x07, //\"7\"

23. 0x7F, //\"8\"

24. 0x6F, //\"9\"

25. 0x40, //\"-\"

26. 0x00, //熄灭

27. };

28. void delay1ms(void) //误差 0us

29. {

30. unsigned char a,b,c;

31. for(c=1;c>0;c--)

32. for(b=142;b>0;b--)

33. for(a=2;a>0;a--);

34. }

35. void delay(uint x ) //36. {

37. uint i;

38. for(i=0;i多功能毫秒延时

39. {

40. delay1ms();

41. }

42. }

43. void display(void)

44. {

45. if(swich==1)

46. {

47. P0= leddata[11];

48. delay(1);

49. le2=1;

50. le1=1;

51. delay(1);

52. le2=0;

53. le1=0;

54. }

55. else

56. {

57. if(dir==1)

58. {

59. P0= leddata[11];

60. delay(1);

61. le2=1;

62. delay(1);

63. le2=0;

. }

65. else

66. {

67. P0 =leddata[10];

68. delay(1);

69. le2=1;

70. delay(1);

71. le2=0;

72. }

73. P0=leddata[9-(speed-20)/20];

74. delay(30);

75. le1=1;

76. delay(5);

77. le1=0;

78. }

79. }

80. void Init_INT0()

81. {

82. EX0=1; //开启外部中断 0

83. IT0=1; //设置成低电平触发,1为下降沿触发

84. EX1=1; //开启外部中断 1

85. IT1=1; //设置成低电平触发,1为下降沿触发

86. EA=1; //开启总中断

87. }

88. void Interrupt0_handler() interrupt 0

. {

90. EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰

91. delay(20); //同样是为了消除抖动而产生新的中断

92. if(speed>min)

93. {speed=speed-20;} //最快转速

94. else

95. {speed=min;}

96. while(speedadd==0);

97. EA=1; //恢复中断

98. }

99. void Interrupt1_handler() interrupt 2

100. {

101. EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰

102. delay(20); //同样是为了消除抖动而产生新的中断

103. if(speed104. {speed=speed+20;}

105. else

106. {speed=max;} //最慢转速

107. while(speedsub==0);

108. EA=1; //恢复中断109. }

110. void main()

111. {

112. int i; //113. dir=1;

114. le1=0;

115. le2=0;

116. start:

初始化

117. if(swich==0)

118. {Init_INT0();} //总开关开启,初始化中断,开始转动

119. else

120. {display(); goto start; }

121. if(dir==1)

122. seq:

123. {

124. while(1)

125. {

126. display();

127. for (i=0; i<8; i++)

128. {

129. P1 = uca_MotorStep[i]; //取数据

130. delay(speed); //调节转速

131. }

132. if(dir==0) //是否换向

133. {

134. delay(5); // 135. goto oppo; //136. }

137. if(swich==1) //138. goto start; //139. }

140. }

141. else

142. oppo:

换向延时

换向

总开关运行中关闭等待开启

因篇幅问题不能全部显示,请点此查看更多更全内容