📄 ir- motor-lcd1602.lst
字号:
281 1 // lcd_pos(0x45);
282 1 lcd_wdat(data_temp2);
283 1
284 1 data_temp = rate; //显示速率
285 1 data_conv();
286 1 lcd_pos(0x4d);
287 1 lcd_wdat(data_temp1);
288 1 // lcd_pos(0x4e);
289 1 lcd_wdat(data_temp2);
290 1 }
291 /********************************************************
292 /*
293 /* 显示运行方向符号
294 /*
295 /********************************************************/
296 void motor_DR()
297 {
298 1 if(direction==1) //正转方向标志
299 1 {
300 2 for(m=0;m<2;m++)
301 2 {
302 3 lcd_pos(0x0d+m); //显示方向符号
303 3 lcd_wdat(0x3e);
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 6
304 3 }
305 2 }
306 1 else
307 1 {
308 2 for(m=0;m<2;m++) //反转方向标志
309 2 {
310 3 lcd_pos(0x0d+m); //显示方向符号
311 3 lcd_wdat(0x3c);
312 3 }
313 2 }
314 1 }
315
316 /********************************************************
317 /*
318 /* 显示运行状态
319 /*
320 /********************************************************/
321 void motor_RUN()
322 {
323 1 if(on_off==1)
324 1 { TR0=1;
325 2 lcd_pos(7); //设置显示位置为第一行的第1个字符
326 2 for(m=0;m<5;m++)
327 2 lcd_wdat(cdis5[m]); //RUN
328 2 motor_DR(); //
329 2 }
330 1 else
331 1 { TR0=0; P1 =0xf0;
332 2 lcd_pos(7); //设置显示位置为第一行的第1个字符
333 2 for(m=0;m<5;m++)
334 2 lcd_wdat(cdis6[m]); //STOP
335 2 motor_DR(); //
336 2 snum=snum1; //
337 2 number1=0; //清圈数计数器
338 2 }
339 1 }
340
341 /********************************************************
342 *
343 * 主程序
344 *
345 *********************************************************/
346 main()
347 {
348 1 LCD_init_DIS();
349 1
350 1 // IE=0x81; //允许总中断中断,使能 INT0 外部中断
351 1 // TCON=0x01; //触发方式为脉冲负边沿触发
352 1
353 1 TMOD = 0x01; //T0定时方式1
354 1 TL0 = 0x33;
355 1 TH0 = 0xf5;
356 1 ET0 = 1;
357 1 EA = 1;
358 1 P1 = 0xf0;
359 1
360 1 while(1)
361 1 {
362 2 IR_IN();
363 2 TEMP=IRCOM[2];
364 2 if(flag)
365 2 {
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 7
366 3 /********************************************************
367 3 运行控制
368 3 ********************************************************/
369 3 if(TEMP==0x10) //启动、停止
370 3 {
371 4 on_off=~on_off;
372 4 motor_RUN();
373 4 }
374 3 /********************************************************
375 3 设定圈数
376 3 ********************************************************/
377 3 if(TEMP==0x09) //增加圈数
378 3 {
379 4 if(snum!=0x14)
380 4 {
381 5 snum++;
382 5 snum1=snum;
383 5 }
384 4 }
385 3
386 3 if(TEMP==0x1f) //减少圈数
387 3 {
388 4 if(snum!=0x00)
389 4 {
390 5 snum--;
391 5 snum1=snum;
392 5 }
393 4 }
394 3 /********************************************************
395 3 方向转换
396 3 ********************************************************/
397 3 if(TEMP==0x11) //正转
398 3 {
399 4 direction=1;
400 4 motor_DR();
401 4 }
402 3
403 3 if(TEMP==0x19) //反转
404 3 {
405 4 direction=0;
406 4 motor_DR();
407 4 }
408 3
409 3 /********************************************************
410 3 速率调整
411 3 ********************************************************/
412 3 if(TEMP==0x12) //增加速率,减速
413 3 {
414 4 if(rate!=0x10)
415 4 rate++;
416 4 }
417 3
418 3 if(TEMP==0x1d) //减少速率,加速
419 3 {
420 4 if(rate!=0x01)
421 4 rate--;
422 4 }
423 3
424 3 if(TEMP==0x03)
425 3 {
426 4 if(on_off&(!pause1))
427 4 {
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 8
428 5 pause1=1;
429 5 TR0=0; //暂停
430 5 lcd_pos(7); //设置显示位置
431 5 for(m=0;m<5;m++)
432 5 lcd_wdat(cdis7[m]); //PAUSE
433 5 }
434 4 else if(pause1)
435 4 {
436 5 motor_RUN();
437 5 pause1=0;
438 5 TR0=1;
439 5 }
440 4 }
441 3 flag=0;
442 3 } // end of if(flag)
443 2
444 2 /********************************************************/
445 2 if(number1==snum1) //与设定圈数是否相等
446 2 {
447 3 number1=0;
448 3 on_off=0;
449 3 TR0=0;
450 3 snum=snum1;
451 3 P1 =0xf0;
452 3 motor_RUN();
453 3 }
454 2 data_dis();
455 2 } // while(1) end
456 1 } //main end
457
458 /********************************************************/
459 /*
460 /* 定时器 0 中断
461 /*
462 /********************************************************/
463 void motor_onoff() interrupt 1
464 {
465 1 TL0 = 0x33;
466 1 TH0 = 0xf5;
467 1 q++;
468 1 if(q < rate)
469 1 { return; }
470 1 else
471 1 { q=0;
472 2 number++; //脉冲计数
473 2
474 2 if(number==96) //96个脉冲电机转一圈
475 2 { snum--;
476 3 number=0;
477 3 number1++; } //电机转动圈数
478 2
479 2 if(direction==1) //方向标志
480 2 { if(v<8)
481 3 {P1 = FFW[v];v++;} //取数据,正转
482 3 if(v==8)
483 3 { v=0; }
484 3 }
485 2
486 2 else
487 2 { if(v<8)
488 3 {P1 = REV[v];v++;} //取数据,反转
489 3 if(v==8)
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 9
490 3 { v=0; }
491 3 }
492 2 }
493 1 }
494
495 /**********************************************************
496 中断服务函数
497 **********************************************************/
498 void IR_IN() //interrupt 0 using 0
499 {
500 1 unsigned char j,k,N=0;
501 1 // EX0 = 0;
502 1 delayB(15);
503 1 if (IRIN==1) //确认IR信号是否出现
504 1 {
505 2 // EX0 =1;
506 2 return;
507 2 }
508 1
509 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
510 1 delayB(1);
511 1
512 1 for (j=0;j<4;j++) //收集四组数据
513 1 {
514 2 for (k=0;k<8;k++) //每组数据有8位
515 2 {
516 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
517 3 delayB(1);
518 3 while (!IRIN) //等 IR 变为高电平
519 3 delayB(1);
520 3 while (IRIN) //计算IR高电平时长
521 3 {
522 4 delayB(1);
523 4 N++;
524 4 if (N>=20)
525 4 {
526 5 // EX0=1;
527 5 return; //0.14ms计数过长自动离开。
528 5 }
529 4 } //高电平计数完毕
530 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
531 3 if (N>=8)
532 3 IRCOM[j]=IRCOM[j] | 0x80; //数据最高位补"1"
533 3 N=0;
534 3 }//end for k
535 2 } //end for j
536 1
537 1 if(IRCOM[2]!=~IRCOM[3]) //检验接收数据是否正确
538 1 { //EX0=1;
539 2 return; }
540 1
541 1 if(IRCOM[0]!=0x00) //效验用户码
542 1 {
543 2 // EX0=1;
544 2 return;
545 2 }
546 1 beep(); //接收有效,蜂鸣器响一声
547 1 flag=1 ; //置接收有效标志
548 1 // EX0 = 1; //重开中断
549 1 }
550
551 /*********************************************************/
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 10
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1042 ----
CONSTANT SIZE = 102 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 2
IDATA SIZE = ---- ----
BIT SIZE = 6 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -