📄 51
字号:
225 2 lcd_pos(0x0c+m); //显示方向符号
226 2 lcd_wdat(0x3e);
227 2 }
228 1
229 1 }
230 /********************************************************/
231 /*
232 /*数据转换子程序
233 /*
234 /********************************************************/
235 void data_conv()
236 {
237 1 data_temP1=data_temp/10; //高位
238 1 if(data_temP1==0)
239 1 {data_temP1=0x20;} //高位为0不显示
240 1 else
241 1 {data_temP1=data_temP1+0x30;}
C51 COMPILER V8.18 BJDJ1602 12/15/2009 19:50:09 PAGE 5
242 1
243 1 data_temp2=data_temp%10; //低位
244 1 data_temp2=data_temp2+0x30;
245 1 }
246
247 /********************************************************/
248 /*
249 /*数据显示子程序
250 /*
251 /********************************************************/
252 void data_dis()
253 {
254 1 data_temp = snum; //显示圈数
255 1 data_conv();
256 1 lcd_pos(0x44);
257 1 lcd_wdat(data_temP1);
258 1 lcd_pos(0x45);
259 1 lcd_wdat(data_temp2);
260 1
261 1 data_temp = rate; //显示速率
262 1 data_conv();
263 1 lcd_pos(0x4d);
264 1 lcd_wdat(data_temP1);
265 1 lcd_pos(0x4e);
266 1 lcd_wdat(data_temp2);
267 1 }
268 /********************************************************
269 /*
270 /* 显示运行方向符号
271 /*
272 /********************************************************/
273 void motor_DR()
274 {
275 1 if(direction==1) //正转方向标志
276 1 { for(m=0;m<2;m++)
277 2 {
278 3 lcd_pos(0x0c+m); //显示方向符号
279 3 lcd_wdat(0x3e);
280 3 }
281 2 }
282 1 else
283 1 { for(m=0;m<2;m++) //反转方向标志
284 2 {
285 3 lcd_pos(0x0c+m); //显示方向符号
286 3 lcd_wdat(0x3c);
287 3 }
288 2 }
289 1 }
290
291 /********************************************************
292 /*
293 /* 显示运行状态
294 /*
295 /********************************************************/
296 void motor_RUN()
297 {
298 1 if(on_off==1)
299 1 { TR0=1;
300 2 lcd_pos(0); //设置显示位置为第一行的第1个字符
301 2 m = 0;
302 2 while(cdis5[m] != '\0')
303 2 { lcd_wdat(cdis5[m]); //RUNNING
C51 COMPILER V8.18 BJDJ1602 12/15/2009 19:50:09 PAGE 6
304 3 m++; }
305 2 motor_DR(); //
306 2 }
307 1 else
308 1 { TR0=0; P1 =0x0f;
309 2 lcd_pos(0); //设置显示位置为第一行的第1个字符
310 2 m = 0;
311 2 while(cdis3[m] != '\0')
312 2 { lcd_wdat(cdis3[m]); //STOP
313 3 m++; }
314 2 motor_DR(); //
315 2 snum=snum1; //
316 2 number1=0; //清圈数计数器
317 2 }
318 1 }
319
320 /********************************************************
321 *
322 * 主程序
323 *
324 *********************************************************/
325
326 main()
327 {
328 1 LCD_init_DIS();
329 1
330 1 TMOD = 0x01; //T0定时方式1
331 1 TL0 = 0x33;
332 1 TH0 = 0xf5;
333 1 EA = 1;
334 1 ET0 = 1;
335 1 P1 = 0x0f;
336 1
337 1 while(1)
338 1 {
339 2 if(K1==0)
340 2 {
341 3 beep();
342 3 while(K1==0); //等待键释放
343 3 on_off=~on_off;
344 3 motor_RUN();
345 3 } //K1 end
346 2 /********************************************************/
347 2 if(K2==0)
348 2 {
349 3 beep();
350 3 if(snum_dr==1)
351 3 { snum++;
352 4 snum1=snum;
353 4 if(snum==0x14)
354 4 { snum_dr=~snum_dr;}
355 4 }
356 3 else
357 3 {snum--;
358 4 snum1=snum;
359 4 if(snum==0x01)
360 4 { snum_dr=~snum_dr; }
361 4 }
362 3
363 3 } //K2 end
364 2 /********************************************************/
365 2 if(K3==0)
C51 COMPILER V8.18 BJDJ1602 12/15/2009 19:50:09 PAGE 7
366 2 {
367 3 beep();
368 3 direction=~direction;
369 3 motor_DR();
370 3 }//K3 end
371 2
372 2 /********************************************************/
373 2 if(K4==0)
374 2 {
375 3 beep();
376 3 if(rate_dr==1)
377 3 { rate++;
378 4 if(rate==0x10)
379 4 { rate_dr=~rate_dr;}
380 4 }
381 3 else
382 3 {
383 4 rate--;
384 4 if(rate==0x01)
385 4 { rate_dr=~rate_dr; }
386 4 }
387 3 } //K4 end
388 2
389 2 /********************************************************/
390 2 if(number1==snum1) //与设定圈数是否相等
391 2 { number1=0;
392 3 on_off=0;
393 3 TR0=0;
394 3 snum=snum1;
395 3 P1=0x0f;
396 3 motor_RUN();
397 3 }
398 2 data_dis();
399 2 } // while(1) end
400 1 } //main end
401
402 /********************************************************/
403 /*
404 /* 定时器 0 中断
405 /*
406 /********************************************************/
407
408 void motor_onoff() interrupt 1
409 {
410 1 TL0 = 0x33;
411 1 TH0 = 0xf5;
412 1 q++;
413 1 if(q < rate)
414 1 { return; }
415 1 else
416 1 { q=0;
417 2 number++; //脉冲计数
418 2
419 2 if(number==4096) //64个脉冲电机转一圈
420 2 { snum--;
421 3 number=0;
422 3 number1++; } //电机转动圈数
423 2
424 2
425 2 if(direction==1) //方向标志
426 2 { if(v<8)
427 3 {P1 = FFW[v];v++;} //取数据,正转
C51 COMPILER V8.18 BJDJ1602 12/15/2009 19:50:09 PAGE 8
428 3 if(v==8)
429 3 { v=0; }
430 3 }
431 2
432 2 else
433 2 { if(v<8)
434 3 {P1 = REV[v];v++;} //取数据,反转
435 3 if(v==8)
436 3 { v=0; }
437 3 }
438 2 }
439 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 811 ----
CONSTANT SIZE = 101 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 ----
IDATA SIZE = ---- ----
BIT SIZE = 4 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -