📄 51
字号:
433 1 {
434 2 T2off(); //开启计数器T2
435 2 if(ov_flage == 1){
436 3 x = freq;
437 3 x += 0xffff; //
438 3 }else{
439 3 x = freq;
440 3 }
441 2 ov_flage = 0; //溢出标志位清0
442 2 freq = 0; //频率清0
443 2 num = 0;
444 2 TH2 = 0x00; //重新给计数器T0赋初值
445 2 TL2 = 0x00;
446 2 }
447 1 TH0 = (65536-50000)/256; //重新给计数器T0赋初值
448 1 TL0 = (65536-50000)%256;
449 1 EA = 1;
450 1 T0start(); //开启定时器T0
451 1 T2start(); //开启计数器T2
452 1 }
453
454 //----------------------------------------------------------------------
455 //定时器中断2
456 void INTT2init(void)
457 {
458 1 C_T2 = 1; //选择信号输入
459 1 EXEN2 = 0;
460 1 CP_RL2 = 0;
461 1 ET2 = 1; //开启定时器2中断
462 1 TH2 = 0x00; //重新给计数器T0赋初值
463 1 TL2 = 0x00;
464 1
465 1 }
466 //计数器溢出中断
467 void intt2(void ) interrupt 5 using 3
468 {
469 1 T2off();
470 1 TF2 = 0; //清除中断标志位
471 1 EXF2 = 0; //清除捕获标志位
472 1 // x++;
473 1 ov_flage = 0x01; //置位溢出标志位
474 1
475 1 // TH2 = 0xFF; //重新给计数器T0赋初值
476 1 // TL2 = 0xFB;
477 1 // TR2 = 1;
478 1 }
479
480 //----------------------------------------------------------------------
481 //外部中断输入
482 void INT0init(void)
483 {
484 1 EA=1; //开放总中断
485 1 EX0=1; //允许使用外中断
486 1 IT0=1; //选择负跳变来触发外中断
487 1 }
488 void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
C51 COMPILER V8.02 PCF8591 04/08/2010 23:02:02 PAGE 9
489 {
490 1 freq++;
491 1 }
492
493 //-------------------------------------------------------------------
494 void fre_value(unsigned int data1)
495 {
496 1 dis[0] = data1%10;// + 0x30;
497 1 dis[0] += 0x30;
498 1 dis[1] = data1%100;
499 1 dis[1] /= 10;
500 1 dis[1] += 0x30;
501 1 dis[2] = data1%1000;
502 1 dis[2] /= 100;
503 1 dis[2] += 0x30;
504 1 dis[3] = data1/1000;
505 1 //dis[3] = 0;
506 1 dis[3] += 0x30;
507 1 }
508 //-------------------------------------------------------------------
509 // 函数名称: main
510 // 函数功能: 主程序
511 //-------------------------------------------------------------------
512 main()
513 {
514 1 // uchar l;
515 1 // uchar buffer;
516 1 unsigned long buf;
517 1 unsigned int buf1;
518 1
519 1 // EXEN2 = 1;
520 1
521 1 PT0 = 1; // 外部中断设置为高优先级
522 1 // PX0 = 1; // 外部中断设置为高优先级
523 1
524 1
525 1 lcd_init(); //初始化LCD
526 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
527 1 lcd_flash();
528 1
529 1 intt0init(); //定时器T0初始化
530 1 INTT2init(); //定时器T2初始化
531 1 INT0init();
532 1 EA = 1;
533 1 T0start(); //开启定时器T0
534 1
535 1 while(1)
536 1 {
537 2 EA = 0;
538 2 iicInit(); //I2C总线初始化
539 2 ADC_PCF8591(0x04);
540 2 if(SystemError == 1) //有错误,重新来
541 2 {
542 3 iicInit(); //I2C总线初始化
543 3 ADC_PCF8591(0x04);
544 3 }
545 2 EA = 1;
546 2 // lcd_flash();
547 2 // for(l=0;l<4;l++)
548 2 // {
549 2
550 2 delay(200); //刷新速率 延迟
C51 COMPILER V8.02 PCF8591 04/08/2010 23:02:02 PAGE 10
551 2 show_value(receivebuf[0]);
552 2 if(PIN == 0){
553 3 buf1 = (dis[2]-0x30)*100;
554 3 buf1 += (dis[1]-0x30)*10;
555 3 buf1 += (dis[0]-0x30);
556 3 buf1 *= 2;
557 3 if(buf1 > 999)
558 3 {
559 4 buf1 = 999;
560 4 }
561 3 fre_value(buf1); //
562 3 }
563 2 lcd_pos(0x08);
564 2 lcd_wdat(dis[2]); //整数位显示
565 2 lcd_pos(0x0A);
566 2 lcd_wdat(dis[1]); //
567 2 lcd_pos(0x0b);
568 2 lcd_wdat(dis[0]); //
569 2
570 2 if((x > 999)&&(x<9999))
571 2 {
572 3 // buf = x*2;
573 3 buf = x;
574 3 buf /=10;
575 3
576 3 fre_value(buf); //
577 3 lcd_pos(0x4a);
578 3 lcd_wdat(dis[2]); //整数位显示
579 3
580 3 lcd_pos(0x4b);
581 3 lcd_wdat('.'); //第一位小数显示
582 3
583 3 lcd_pos(0x4c);
584 3 lcd_wdat(dis[1]); //第二位小数显示
585 3
586 3 lcd_pos(0x4d);
587 3 lcd_wdat(dis[0]); //第二位小数显示
588 3
589 3 lcd_pos(0x4e);
590 3 lcd_wdat('K'); //第二位小数显示
591 3
592 3 lcd_pos(0x4f);
593 3 lcd_wdat('H'); //第二位小数显示
594 3
595 3 }else if(x>9999)
596 2 {
597 3 if(x >100000)
598 3 {
599 4 x = 0;
600 4 }
601 3 // buf = x*2;
602 3 buf = x;
603 3 buf /= 100;
604 3 fre_value(buf); //
605 3 lcd_pos(0x4a);
606 3 lcd_wdat(dis[2]); //整数位显示
607 3 lcd_pos(0x4b);
608 3 lcd_wdat(dis[1]); //第二位小数显示
609 3
610 3 lcd_pos(0x4c);
611 3 lcd_wdat('.'); //第一位小数显示
612 3
C51 COMPILER V8.02 PCF8591 04/08/2010 23:02:02 PAGE 11
613 3 lcd_pos(0x4d);
614 3 lcd_wdat(dis[0]); //第二位小数显示
615 3
616 3 lcd_pos(0x4e);
617 3 lcd_wdat('K'); //第二位小数显示
618 3
619 3 lcd_pos(0x4f);
620 3 lcd_wdat('H'); //第二位小数显示
621 3 }
622 2 else{
623 3 fre_value(x); //
624 3 lcd_pos(0x4a);
625 3 lcd_wdat(dis[2]); //整数位显示
626 3 lcd_pos(0x4B);
627 3 lcd_wdat(dis[1]); //第二位小数显示
628 3 lcd_pos(0x4C);
629 3 lcd_wdat(dis[0]); //第二位小数显示
630 3 lcd_pos(0x4D);
631 3 lcd_wdat('H'); //第二位小数显示
632 3 lcd_pos(0x4E);
633 3 lcd_wdat('Z'); //第二位小数显示
634 3 lcd_pos(0x4F);
635 3 lcd_wdat(' '); //第二位小数显示
636 3 }
637 2
638 2 }
639 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1517 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 5
IDATA SIZE = 4 4
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -