📄 fuzzy_pid.lst
字号:
C51 COMPILER V7.06 FUZZY_PID 01/17/2007 13:01:08 PAGE 9
488 1 }
489
490 /***************************************************************************************************
491 50ms定时子程序
492 说明:
493 ***************************************************************************************************/
494 void time0_50ms(void) interrupt 1
495 {
496 1 TL0=-50000%256;
497 1 TH0=-50000/256;
498 1
499 1 count[2]++;
500 1
501 1 if(count[2]==count[0])
502 1 {
503 2 outPCM=1; //停电
504 2 LED3=1; //通电指示灯灭
505 2 }
506 1 if(count[2]==count[1]) //采样周期到
507 1 {
508 2 count[2]=0;
509 2 read_flag=1;
510 2 LED2=~LED2;
511 2 serial_flag=1; //串口发送数据标志
512 2 }
513 1 // serial_flag=1; //串口发送数据标志
514 1
515 1 // if(serial_flag)
516 1 // {
517 1 // printf("%d",Temp[4]);
518 1 //printf("*");
519 1 // }
520 1 }
521 /***************************************************************************************************
522 得到输出通电时间
523 ***************************************************************************************************/
524 void take_time(void)
525 {
526 1 uchar column;
527 1 uchar row;
528 1
529 1
530 1 column=table_E();
531 1 row=table_Ec(); //得到输出控制规则表的行列
532 1 outTime=para[2]*Ucontrol[column][row];
533 1 count[0]=outTime*20; //计算通电时间所需的中断次数
534 1 }
535 /***************************************************************************************************
536 输出控制
537 ***************************************************************************************************/
538 void out_control(void)
539 {
540 1
541 1
542 1 if(outTime==0)
543 1 outPCM=1;
544 1 else
545 1 {
546 2 outPCM=0; //通电
547 2 LED3=0; //通电指示灯亮
548 2 }
549 1 TR0=1; //开启定时器
C51 COMPILER V7.06 FUZZY_PID 01/17/2007 13:01:08 PAGE 10
550 1 }
551 /***************************************************************************************************
552 随机模式
553 ***************************************************************************************************/
554 void rand_model(void)
555 {
556 1 LED4=1;
557 1 LED5=1;
558 1 LED6=0; //相应指示灯亮
559 1
560 1 // outTime=0;
561 1
562 1 show_LED[3]=11;
563 1 show_LED[4]=10;
564 1 show_LED[5]=12; //设定显示值
565 1 while(1)
566 1 {
567 2
568 2 RdTemp(); //读取温度
569 2 show_LED[0]=Temp[0];
570 2 show_LED[1]=Temp[1];
571 2 show_LED[2]=Temp[2];
572 2
573 2 delay(1); //延时1ms 以便读取 正确的温度 ,延时不够便显示初始温度85
574 2 show();
575 2 Temp[5]=Temp[4]; //记录当前温度
576 2
577 2 keyscan();
578 2 if(button==4||button==1) //模式转换
579 2 {
580 3 TR0=0;
581 3 break;
582 3 }
583 2 /* if(button==4) //进入测控模式
584 2 break;
585 2 if(button==1) //进入修改模式
586 2 {
587 2 TR0=0;
588 2 break;
589 2 }*/
590 2 }
591 1 }
592 /***************************************************************************************************
593 修改模式
594 ***************************************************************************************************/
595 void trange_model(void)
596 {
597 1 LED4=1;
598 1 LED5=0;
599 1 LED6=1;
600 1
601 1 while(1)
602 1 {
603 2 keyscan();
604 2 switch(button)
605 2 {
606 3 case 1:select_para();break;
607 3 case 2:Add_para();break;
608 3 case 3:delect_para();break;
609 3 // case 4:TR0=0;break;
610 3 default:break;
611 3 }
C51 COMPILER V7.06 FUZZY_PID 01/17/2007 13:01:08 PAGE 11
612 2 if(button==4) //进入测控模式
613 2 {
614 3 TR0=0;
615 3 break;
616 3 }
617 2 show_LED[0]=para[parameter]/10;
618 2 show_LED[1]=para[parameter]%10;
619 2 show_LED[2]=12;
620 2 show_LED[3]=12;
621 2 show_LED[4]=12;
622 2 show_LED[5]=parameter+1;
623 2 show();
624 2 }
625 1 count[1]=para[0]*20; //采样次数
626 1 }
627 /***************************************************************************************************
628 测控模式
629 ***************************************************************************************************/
630 void control_model(void)
631 {
632 1 LED4=0;
633 1 LED5=1;
634 1 LED6=1;
635 1
636 1 LED3=1;
637 1 read_flag=1;
638 1 serial_flag=1;
639 1
640 1 TR1=1;
641 1 TI=1;
642 1 while(1)
643 1 {
644 2 RdTemp();
645 2
646 2 if(read_flag)
647 2 {
648 3 Temp[6]=Temp[4] ; //得到即时温度
649 3 take_time(); //得到通电时间
650 3 out_control(); //输出控制
651 3 read_flag=0;
652 3 Temp[5]=Temp[6]; //纪录上次温度
653 3 }
654 2
655 2 show_LED[0]=Temp[0];
656 2 show_LED[1]=Temp[1];
657 2 show_LED[2]=Temp[2];
658 2 show_LED[3]=12;
659 2 show_LED[4]=outTime/10;
660 2 show_LED[5]=outTime%10;
661 2 show();
662 2
663 2 if(serial_flag)
664 2 {
665 3 printf("%d\n",(uint)Temp[4]);
666 3 //printf("*");
667 3 serial_flag=0;
668 3 }
669 2
670 2 keyscan();
671 2 if(button==1||button==2) //模式转换
672 2 {
673 3 TR0=0;
C51 COMPILER V7.06 FUZZY_PID 01/17/2007 13:01:08 PAGE 12
674 3 TR1=0;
675 3 outPCM=1;
676 3 break;
677 3 }
678 2
679 2 }
680 1 }
681 /***************************************************************************************************
682 初始化子程序
683 ***************************************************************************************************/
684 void Initial(void)
685 {
686 1 EA=1; //开启中断允许
687 1 ET0=1; //允许定时器0中断
688 1 TMOD=0x21; //设定定时器0,工作方式1
689 1 TL0=-50000%256; //初始化定时器0,定时50ms
690 1 TH0=-50000/256;
691 1
692 1 TL1=0XFD; //设置波特率9600bps
693 1 TH1=0XFD;
694 1 SCON=0X50; //串口控制寄存器,工作方式1(8位异步接受/发送器)允许接收
695 1
696 1 count[1]=para[0]*20; //采样次数
697 1 }
698 /***************************************************************************************************
699 主程序
700 ***************************************************************************************************/
701 void main(void)
702 {
703 1 Initial(); //初始化
704 1 while(1)
705 1 {
706 2 show(); //开机显示200701
707 2 keyscan(); //扫面键盘
708 2 while(button)
709 2 {
710 3 switch(button)
711 3 {
712 4 case 1:trange_model();break; //进入修改模式
713 4 case 2:rand_model();break; //进入随机模式
714 4 case 4:control_model();break; //进入测控模式
715 4 default:button=0; //进入开启状态
716 4 }
717 3 }
718 2 }
719 1
720 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1149 ----
CONSTANT SIZE = 82 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -