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:
换向延时
换向
总开关运行中关闭等待开启