📄 89c52-stepmotor.lst
字号:
C51 COMPILER V8.05a 89C52_STEPMOTOR 03/20/2009 01:55:07 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 89C52_STEPMOTOR
OBJECT MODULE PLACED IN 89c52-stepmotor.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil uvison3\Keil\C51\BIN\C51.EXE 89c52-stepmotor.c ROM(COMPACT) BROWSE DEBUG OBJE
-CTEXTEND
line level source
1 /******************************************************************************
2 *Project:步进电机控制程序练习 A practise program of stepper motor controlment
3 运行开始后电机正转,默认转速为最高速度的50%(2000Hz),速度可微调,
4 每次的增/减量为200Hz;正/反转切换过程中自动进行速度的逐步调节
5 *MCU: AT89s52 Frequency:11.0592MHz
6 *I/O Port: P1.0--正转指示LED P1.1--反转指示LED P1.3--加速 P1.4--减速
7 P1.5--正/反转切换 P1.6--开始/停止;
8 P0.0~P0.3--步进电机ABCD四相控制输出 P0.4--L298使能输出INA,INB;
9 *Auther: By yushun HUST 2009-3-19 All rights reserved.
10 *
11 ******************************************************************************/
12
13
14 #include<reg52.h>
15
16 #define unchar unsigned char
17 #define unint unsigned int
18
19 sbit Forword=P1^0; //Forword LED
20 sbit Reverse=P1^1; //Reverse LED
21 /*
22 sbit P13=P1^3; //SpeedUp
23 sbit P14=P1^4; //SpeedDown
24 sbit P15=P1^5; //Switch
25 sbit P16=P1^6; //Start_Stop
26 */
27 sbit PA=P0^0;
28 sbit PB=P0^1;
29 sbit PC=P0^2;
30 sbit PD=P0^3;
31
32 sbit INAB=P0^4;
33
34 unchar code PHA[8]={0x11,0x13,0x12,0x16,0x14,0x1c,0x18,0x19};//高四位为0001B是因运行时INAB=1
35 // A AB B BC C CD D DA
36
37 unchar code PWM_H[10]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe};
38 unchar code PWM_L[10]={0x65,0xff,0x6c,0xbf,0xff,0x32,0x5c,0x7f,0x9c,0xb5};
39 // 1000Hz 2000Hz 2800Hz
40
41 unchar phase;
42 unchar pwm,pwm_temp;
43 bit Switch; //方向切换标志位,正转时Switch=1;
44 bit Start_Stop; //起停控制标志位,开始运转时Start_Stop=1.
45
46
47 /*****************************************************************************
48 延时子程序,延时时间10ms
49 *****************************************************************************/
50 void delay10ms(void)
51 {
52 1 unchar i,j;
53 1 for(i=20;i>0;--i)
54 1 for(j=248;j>0;--j)
C51 COMPILER V8.05a 89C52_STEPMOTOR 03/20/2009 01:55:07 PAGE 2
55 1 ;
56 1 }
57
58
59 /*****************************************************************************
60 延时子程序,延时时间500ms
61 *****************************************************************************/
62 void delay500ms(void)
63 {
64 1 unchar i,j,k;
65 1 for(i=5;i>0;--i)
66 1 for(j=200;j>0;--j)
67 1 for(k=248;k>0;--k)
68 1 ;
69 1 }
70
71
72 /*****************************************************************************
73 键盘扫描子程序
74 *****************************************************************************/
75 void keyscan(void)
76 {
77 1 if((P1 & 0x78)!=0x78)
78 1 {
79 2 delay10ms(); //软件去抖
80 2 if((P1 & 0x78)!=0x78)
81 2 {
82 3 if((P1 & 0x78)==0x70) //加速
83 3 {
84 4 if(pwm<10)
85 4 pwm++;
86 4 else
87 4 pwm=9;
88 4 delay500ms(); //速度改变频率控制,避免急加减速
89 4 }
90 3
91 3 if((P1 & 0x78)==0x68) //减速
92 3 {
93 4 if(pwm>0)
94 4 pwm--;
95 4 else
96 4 pwm=0;
97 4 delay500ms();
98 4 }
99 3
100 3 if((P1 & 0x78)==0x58) //改变运转方向
101 3 {
102 4 Forword=Reverse=0; //换向中,两个指示LED同时亮
103 4 while(pwm>0) //换向前减速至最低速1000Hz
104 4 {
105 5 pwm--;
106 5 delay500ms();
107 5 }
108 4
109 4 PA=PB=PC=PD=1; //急停
110 4 delay500ms();
111 4 delay500ms();
112 4
113 4 Switch=~Switch; //执行方向变更
114 4 if(Switch==1) //指示LED变更
115 4 Reverse=1;
116 4 else
C51 COMPILER V8.05a 89C52_STEPMOTOR 03/20/2009 01:55:07 PAGE 3
117 4 Forword=1;
118 4
119 4 while(pwm<5) //换向后加速至2000Hz
120 4 {
121 5 pwm++;
122 5 delay500ms();
123 5 }
124 4
125 4 }
126 3
127 3 if((P1 & 0x78)==0x38) //运转、停止切换
128 3 {
129 4 Start_Stop=~Start_Stop; //Start_Stop=1时运转
130 4
131 4 if(Start_Stop==1) //由停止开始运转,重新初始化参数
132 4 {
133 5 Switch=1; //默认运转方向为正向
134 5 Forword=Reverse=0;
135 5 INAB=1; //使能L298输出
136 5 pwm=pwm_temp=0;
137 5 TH0=PWM_H[pwm];
138 5 TL0=PWM_L[pwm];
139 5 TR0=1; //开定时器0
140 5 delay500ms();
141 5 while(pwm<5) //加速至2000Hz
142 5 {
143 6 pwm++;
144 6 delay500ms();
145 6 }
146 5
147 5 Reverse=1;
148 5 }
149 4
150 4 else //由运转到停止,关闭定时器0及L298降低功耗
151 4 {
152 5 Forword=Reverse=0;
153 5 while(pwm>0) //停止前减速至最低速1000Hz
154 5 {
155 6 pwm--;
156 6 delay500ms();
157 6 }
158 5
159 5 PA=PB=PC=PD=1; //急停
160 5 delay500ms();
161 5 delay500ms();
162 5
163 5 TR0=0; //关定时器0
164 5 INAB=0; //关L298,电机自由停止
165 5 Forword=Reverse=1;
166 5 }
167 4
168 4
169 4 }
170 3
171 3
172 3 }
173 2 }
174 1 }
175
176
177 /*****************************************************************************
178 定时器0中断服务子程序
C51 COMPILER V8.05a 89C52_STEPMOTOR 03/20/2009 01:55:07 PAGE 4
179 依次改变接通的相位phase;若脉宽控制pwm改变,则重新载入定时初值,从而改变脉冲周期
180 *****************************************************************************/
181 void timer0(void) interrupt 1 using 1
182 {
183 1 if(Switch==1) //正转时phase递增循环
184 1 {
185 2 if(phase>=7) //判断和改变相位
186 2 phase=0;
187 2 else
188 2 phase++;
189 2 }
190 1
191 1 if(Switch==0) //反转时phase递减循环
192 1 {
193 2 if(phase<=0) //判断和改变相位
194 2 phase=7;
195 2 else
196 2 phase--;
197 2 }
198 1
199 1 P0=PHA[phase]; //相位输出
200 1
201 1 TR0=0; //关定时器0
202 1 if(pwm!=pwm_temp) //存在速度改变则重新赋初值
203 1 {
204 2 TH0=PWM_H[pwm];
205 2 TL0=PWM_L[pwm];
206 2 }
207 1
208 1 else
209 1 ;
210 1
211 1 TR0=1;
212 1 pwm_temp=pwm;
213 1
214 1 }
215
216
217 /*****************************************************************************
218 主程序main
219 初始化系统参数及变量,开中断,键盘扫描输入
220 *****************************************************************************/
221 void main(void)
222 {
223 1 P0=0x00;
224 1 phase=0; //同时INAB=1
225 1 pwm=pwm_temp=0;
226 1 Switch=1;
227 1 Start_Stop=0;
228 1 Forword=Reverse=0; //系统复位指示
229 1 delay500ms();
230 1 delay500ms();
231 1 P1=0xff; //同时LED熄灭
232 1
233 1 ET0=1; //定时器0中断允许
234 1 EA=1; //总中断允许
235 1
236 1 while(1)
237 1 {
238 2 keyscan();
239 2 }
240 1
C51 COMPILER V8.05a 89C52_STEPMOTOR 03/20/2009 01:55:07 PAGE 5
241 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 375 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -