📄 main.lst
字号:
401 9 else if(freq==2)
402 9 {
403 10 P1_7=0;
404 10 P1_5=0;
405 10 P0_0=1;
406 10 pread=0x1b02;
407 10 idamin_l=*pread++;
408 10 idamin_h=*pread;
409 10 while(KEY==0);
410 10 db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
411 10 break;
412 10 }
413 9 else if(freq==3)
414 9 {
415 10 P1_7=0;
416 10 P1_5=1;
417 10 P0_0=0;
418 10 pread=0x1b04;
419 10 idamax_l=*pread++;
420 10 idamax_h=*pread;
421 10 while(KEY==0);
422 10 db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);
423 10 break;
424 10 }
425 9 else
426 9 {
427 10 freq=0;
428 10 P1_7=0;
429 10 P1_5=0;
430 10 P0_0=0;
431 10 while(KEY==0);
432 10 break;
433 10 }
434 9 }
435 8
436 8 default: break;
437 8 }
438 7 }
439 6 else
440 6 {
441 7 break;
442 7 }
443 6 }while(1);
444 5 }
445 4
446 4 }while((S2!=0)&&(P0_5==1)); //S2没有接通且无外部屏蔽信号,继续脉冲计数
447 3
448 3 P1_0=0;
449 3 }while(P0_5==0); //S2没有接通且外部有屏蔽信号,程序重新开始执行(外屏需保持一段时间)
450 2
451 2 P1_0=0;
452 2
453 2 db4=count/1000;
454 2 db3=count/100-db4*10;
455 2 db2=count/10-db4*100-db3*10;
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 8
456 2 db1=count%10;
457 2
458 2 db_clear(db1,db2,db3,db4); //S1脉冲计数值用数码管显示,不超过2000;
459 2
460 2 IDA0L=Get_DAL(count*1023/2000);
461 2 IDA0H=Get_DAH(count*1023/2000);
462 2
463 2 P1_1=1; //触发K2
464 2
465 2 delay_10ms(100); //延时1s
466 2
467 2 if(count>=2) //输入信号正常
468 2 { //S3还未接通,键盘输入可修改数字
469 3 do
470 3 {
471 4 if ((KEY==0)&&(S3!=0))
472 4 {
473 5 CS = 0;
474 5 delay_short();
475 5 SEND_BUF=0X15; // 写入读键盘数据指令
476 5 send7289();
477 5 delay_short();
478 5 symbol = read_key(); // 读出按键的值
479 5 ACC=symbol;
480 5 CS = 1;
481 5 delay_long();
482 5
483 5
484 5 switch(symbol)
485 5 {
486 6 case(2):
487 6 {
488 7 freq++;
489 7 if(freq==1)
490 7 {
491 8 P1_7=1;
492 8 P1_5=0;
493 8 P0_0=0;
494 8 pread=0x1b00;
495 8 t_s=*pread++;
496 8 t_m=*pread;
497 8 while(KEY==0);
498 8 db_clear(t_m/10,t_m%10,t_s/10,t_s%10);
499 8 break;
500 8 }
501 7 else if(freq==2)
502 7 {
503 8 P1_7=0;
504 8 P1_5=0;
505 8 P0_0=1;
506 8 pread=0x1b02;
507 8 idamin_l=*pread++;
508 8 idamin_h=*pread;
509 8 while(KEY==0);
510 8 db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
511 8 break;
512 8 }
513 7 else if(freq==3)
514 7 {
515 8 P1_7=0;
516 8 P1_5=1;
517 8 P0_0=0;
518 8 pread=0x1b04;
519 8 idamax_l=*pread++;
520 8 idamax_h=*pread;
521 8 while(KEY==0);
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 9
522 8 db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);
523 8 break;
524 8 }
525 7 else
526 7 {
527 8 freq=0;
528 8 P1_7=0;
529 8 P1_5=0;
530 8 P0_0=0;
531 8 while(KEY==0);
532 8 db_clear(db1,db2,db3,db4);
533 8 break;
534 8 }
535 7 }
536 6 default: break;
537 6 }
538 5 }
539 4 else if(S3==0) //S3接通;
540 4 {
541 5 P1_1=0; //K2停止;
542 5 break;
543 5 }
544 4 else //S3未接通且无键盘信号时等待S3信号
545 4 {
546 5 ;
547 5 }
548 4 }while (1);
549 3
550 3 }
551 2 else
552 2 {
553 3 break; //S1少于两个脉冲,跳出程序
554 3 }
555 2
556 2 }while(1); //输出故障,数码管闪动;
557 1
558 1 CS=0;
559 1 delay_short();
560 1 SEND_BUF=0X88;
561 1 send7289();
562 1 delay_short();
563 1 SEND_BUF=0xF0;
564 1 send7289();
565 1 CS=1;
566 1 delay_long();
567 1 do
568 1 {
569 2 ;
570 2 }while(1);
571 1
572 1 }
573
574 void SysClk_Init(void) /***配置系统时钟***/
575 {
576 1 //配置内部高频振荡器为系统时钟
577 1 OSCICN=0X82; //系统时钟允许,为振荡器两分频
578 1 OSCICL=OSCICL+22; //设置片内振荡器为22.1184MHZ
579 1 CLKSEL=0X00; //系统时钟选择内部高频振荡器
580 1 }
581
582 void WDT_Init(void) /***使能看门狗初始化***/
583 {
584 1
585 1 PCA0MD=0X00; //系统时钟的12分频
586 1 PCA0CPL2=0Xff; //超时时间间隔70ms
587 1 PCA0CPH2=0Xff;
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 10
588 1 PCA0MD=0X60;
589 1
590 1 EA=1;
591 1 }
592
593 void port_Init(void) /***端口初始化,没有用内部数字IO资源,外部晶振,DAC输出***/
594 {
595 1 //P0MDIN=0XF3; //P0.2,P0.3全为模拟输入(外部晶振)
596 1 P0MDIN=0XFF; //P0全为数字输入
597 1 P0MDOUT=0X00; //P0.1(DAC0)开漏输出
598 1 P0SKIP=0X02; //跳过P0.1(DAC)
599 1 // P0SKIP=0X0E; //跳过P0.2,P0.3(外部晶振)
600 1 P0=0XFE;
601 1
602 1 P1MDIN=0XFF; //P1全为数字输入
603 1 P1MDOUT=0X00; //P1全为推挽输出
604 1 P1SKIP=0X00; //无跳过引脚
605 1 P1=0X00;
606 1
607 1 P2MDOUT=0Xff; //P2全为推挽输出
608 1 P2=0X00;
609 1
610 1 XBR0=0X00; //没有设置数字资源输出到引脚
611 1 XBR1=0XC0; //允许交叉开关,弱上拉
612 1
613 1 }
614
615 void timer_Init(void) /***定时器0初始化***/
616 {
617 1 TMOD=0X01; //定时器0工作于方式1;
618 1
619 1 TL0=0XB0; //定时器0初始值;
620 1 TH0=0X3C;
621 1
622 1 CKCON=0X00; //使用系统时钟;
623 1
624 1
625 1 TR0=1; //开中断
626 1 ET0=1;
627 1
628 1
629 1 EA=1;
630 1 }
631
632
633 void timer0_Isr(void) interrupt 1 /***定时器0 中断服务程序***/
634 {
635 1
636 1
637 1 PCA0CPL2=0Xff; //超时时间间隔70ms
638 1 PCA0CPH2=0Xff;
639 1
640 1
641 1 TMOD=0X01; //50ms中断一次;
642 1 TL0=0XB0;
643 1 TH0=0X3C;
644 1 din_50++;
645 1 setcan++;
646 1 if((din_50==5000)||(setcan==5000))
647 1 {
648 2 din_50=0;
649 2 setcan=0;
650 2 }
651 1
652 1 }
653
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 11
654 void DAC_Init(void) /***DAC初始化***/
655 {
656 1 IDA0CN=0XF1; //DAC允许,写IDA0H触发输出更新,1mA满度输出
657 1 }
658
659 unsigned char Get_DAH(unsigned int count) /***得到IDA0H值***/
660 {
661 1 unsigned char da_h;
662 1 count <<= 6;
663 1
664 1 count=(count&0xff00)>>8;
665 1 da_h=(unsigned char)count;
666 1
667 1 return da_h;
668 1 }
669
670 unsigned char Get_DAL(unsigned int count) /***得到IDA0L值***/
671 {
672 1 unsigned char da_l;
673 1 count <<= 6;
674 1
675 1 count=count&0x00ff;
676 1 da_l=(unsigned char)count;
677 1
678 1 return da_l;
679 1 }
680
681 void send7289() //7289送指令和数据函数
682 {
683 1 unsigned char BIT_CNT;
684 1 BIT_CNT=0x08;
685 1 delay_long();
686 1 while( BIT_CNT!=0)
687 1 {
688 2 DIO=((SEND_BUF>>(BIT_CNT-1))&0x01);
689 2 CLK=1;
690 2 delay_short();
691 2 CLK=0;
692 2 delay_short();
693 2 BIT_CNT--;
694 2 }
695 1 DIO=0;
696 1 }
697
698 void delay_short(void) //短延时
699 {
700 1 unsigned char j;
701 1 for(j=0;j<20;j++);
702 1 }
703
704 void delay_long(void) //长延时
705 {
706 1 unsigned char j;
707 1 for(j=0;j<120;j++)
708 1 {;}
709 1 }
710
711 void delay_10ms(unsigned int time) //延时10ms
712 {
713 1 unsigned int i,j,k;
714 1 for(i=0;i<time;i++)
715 1 for(j=0;j<10;j++)
716 1 for(k=0;k<120;k++)
717 1 ;
718 1 }
719
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 12
720 unsigned char read_key() //7289读键盘代码
721 {
722 1 unsigned char i;
723 1 unsigned char temp=0;
724 1 unsigned char aa=0;
725 1
726 1 for(i=0;i<8;i++)
727 1 {
728 2 temp = temp<<1;
729 2 aa = DIO;
730 2 if(aa==1)
731 2 temp=temp+1;
732 2 CLK=1;
733 2 delay_short();
734 2 CLK=0;
735 2 }
736 1 return (temp);
737 1 }
738
739 void db_clear(int a,int b,int c,int d) //4位数码管显示
740 {
741 1 CS=0;
742 1 CLK=0;
743 1 delay_short();
744 1
745 1
746 1 SEND_BUF=0xA4; //7289复位
747 1 send7289();
748 1
749 1 CS = 0; // 选择驱动第1个数码管显示
750 1 delay_short();
751 1 SEND_BUF=0XC8;
752 1 send7289();
753 1 delay_short();
754 1 SEND_BUF=a;
755 1 send7289();
756 1 CS = 1;
757 1 delay_long();
758 1
759 1
760 1 CS = 0; // 选择驱动第2个数码管显示
761 1 delay_short();
762 1 SEND_BUF=0XC9;
763 1 send7289();
764 1 delay_short();
765 1 SEND_BUF=b;
766 1 send7289();
767 1 CS = 1;
768 1 delay_long();
769 1
770 1
771 1 CS = 0; // 选择驱动第3个数码管显示
772 1 delay_short();
773 1 SEND_BUF=0XCA;
774 1 send7289();
775 1 delay_short();
776 1 SEND_BUF=c;
777 1 send7289();
778 1 CS = 1;
779 1 delay_long();
780 1
781 1
782 1 CS = 0; // 选择驱动第4个数码管显示
783 1 delay_short();
784 1 SEND_BUF=0XCB;
785 1 send7289();
C51 COMPILER V4.01, MAIN 06/01/06 17:56:11 PAGE 13
786 1 delay_short();
787 1 SEND_BUF=d;
788 1 send7289();
789 1 CS = 1;
790 1 delay_long();
791 1 }
792
793
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2957 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 47 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -