📄 acus.lst
字号:
474 3 case 1:
475 3 {
476 4 P2=*(i+1);
477 4 P10=0;
478 4 P11=1;
479 4 P04=0;
480 4 P05=0;
481 4 os_wait(K_TMO,1,0);
482 4 watchdog();
483 4 j++;
484 4 break;
485 4 }
486 3 case 2:
487 3 { P2=*(i+2);
488 4 P10=0;
489 4 P11=0;
C51 COMPILER V7.01 ACUS 11/24/2004 13:33:22 PAGE 9
490 4 P04=1;
491 4 P05=0;
492 4 os_wait(K_TMO,1,0);
493 4 watchdog();
494 4 j++;
495 4 break;
496 4 }
497 3 case 3:
498 3 {P2=*(i+3);
499 4
500 4 P10=0;
501 4 P11=0;
502 4 P04=0;
503 4 P05=1;
504 4 os_wait(K_TMO,1,0);
505 4 watchdog();
506 4 j=0;
507 4 break;
508 4 }
509 3 default:
510 3 {j&=4;
511 4 break;
512 4 }
513 3 }
514 2
515 2 }
516 1 }
517 /*********************************************************
518 *名称:ADinit()
519 *功能:A/D转换器初始化
520 *入口参数:no
521 *出口参数:无
522 *********************************************************/
523
524 void AD_init(void)
525 { P0M1=0x0b; //P00,P01,设置为仅为输入状态,P02,设置为双向
526 1 //P06,P07,P03,P04,P05,设置为推挽。
527 1 P0M2=0xf0;
528 1 //------------------------
529 1 ADINS=0x52; //0101 0010, 选择ad0l和 ad10 ad12
530 1 ADMODA=0x11; //0001 0001, 选择转换工作模式:固定通道单次转换模式
531 1 ADMODB=0x00; //500Khz < ADC CLK < 3.3Mhz,,
532 1 //------------------------
533 1 p = id_buff;
534 1 ReadID(); //读18B20ID
535 1 Config18b20(); //18b20初始化 */
536 1
537 1 }
538 /*********************************************************
539 *名称:MeilanFilter()
540 *功能:中值滤波
541 *入口参数:channel 通道选择
542 *出口参数:result 转换结果
543 *********************************************************/
544 /*uchar MeilanFilter(uchar channel)
545 {uchar i,j,k,addata;
546 uchar xdata temp[5];
547 for(k=0;k<=5;k++)
548 { addata=AD_start(channel);
549 for(j=0;j<=5;j++)
550 {if(addata>temp[j])
551 {for(i=5;i>j;i--)
C51 COMPILER V7.01 ACUS 11/24/2004 13:33:22 PAGE 10
552 temp[i]=temp[i-1] ;
553 temp[j]=addata;
554 watchdog();
555 break;
556 }
557 else{}
558 }
559 }
560 return(temp[3]);
561 }
562
563 /*********************************************************
564 *名称:ADstart()
565 *功能:A/D转换器启动
566 *入口参数:channel 通道选择
567 *出口参数:result 转换结果
568 *********************************************************/
569 uchar AD_start(uchar channel)
570 { uchar result;
571 1 switch (channel )
572 1 {case 0x01 :
573 2 {ADCON0=0x05; //ad01温度设定采样
574 3 //选择转换触发模式;并立即启动
575 3 result=AD0DAT1; //将AD转换获得的数据存入result
576 3 ADCON0&=0xF7; //清除中断完成标志
577 3 break;
578 3 }
579 2 case 0x02 :
580 2 {ADCON1=0x05; //ad10温度传感器采样
581 3 //选择转换触发模式;并立即启动
582 3 result=AD1DAT0; //将AD转换获得的数据存入result
583 3 ADCON0&=0xF7; //清除中断完成标志
584 3 break;
585 3 }
586 2 case 0x03 :
587 2 {ADCON1=0x05; //ad12温度传感器采样
588 3 //选择转换触发模式;并立即启动
589 3 result=AD1DAT2; //将AD转换获得的数据存入result
590 3 ADCON1&=0xF7; //清除中断完成标志
591 3 break;
592 3 }
593 2 }
594 1 return result ;
595 1 }
596 /*********************************************************
597 *名称:CCU_init(void)
598 *功能:CCU初始化
599 *入口参数:无
600 *出口参数:无
601 *********************************************************/
602 void CCU_init(void)
603 {
604 1 OCB=1; // 设置P1.6为PWM输出
605 1
606 1 TPCR2H=0x00; // 设置 CCU 预分频控制器:
607 1 TPCR2L=0x63; // divide by 100 (99+1)
608 1
609 1 TCR21=0x07; // Prescaler for Phase Locked Loop:
610 1 // Input frequency must be in range of 0.5-1Mhz
611 1 // InpFrq=PCLK/(PLLDIV+1)=(CCLK/2)/(PLLDIV+1)
612 1 // using the internal RC oscillator: CCLK=7.373MHz
613 1 // PLLDiv=6, 6+1=7 => 0.526 MHz
C51 COMPILER V7.01 ACUS 11/24/2004 13:33:22 PAGE 11
614 1 // using Crystal 11.0592 MHz => 0.789 MHz
615 1
616 1 CCCRB=0x01; // non-inverted PWM output on channel B B通道非反相输出PWM
617 1
618 1
619 1 TCR20|=0x80; // Start PLL, OutputMode: stop
620 1 OCB=1; // wait a machine cycle
621 1 while(PLLEN ==0);// wait until PLL locked
622 1
623 1 TOR2H=0xff; // Reload Value 0x00FF=255 装载映像寄存器
624 1 TOR2L=0x7f; // -> PWM period PWM周期
625 1 TCR21|=0x80; // update reload value 使映像寄存器在下次CCU溢出时自动更新
626 1
627 1 OCRBH=0x00; // initialize Duty-Cycle channel A 0x0100 => 50%
628 1 OCRBL=0x3f;
629 1 TCR21|=0x80; // update duty cycle
630 1
631 1
632 1 TCR20=0x86; // Set output mode: asymmetrical PWM非对称模式
633 1 HLTEN=1;
634 1 HLTRN=1;
635 1 }
636 /*********************************************************
637 *名称:PWM_start(void)
638 *功能:脉冲控制开始
639 *入口参数:无
640 *出口参数:无
641 *********************************************************/
642 void PWM_start(uint freq,uchar mod)
643 {
644 1 TOR2H= HIGH(freq) ; // Reload Value 0x00FF=255 装载映像寄存器
645 1 TOR2L= LOW(freq) ; // -> PWM period PWM周期
646 1 OCRBH= HIGH(freq)/mod ;
647 1 OCRBL= LOW(freq)/mod; //占空比为50%
648 1 TCR21|=0x80; // update reload value 使映像寄存器在下次CCU溢出时自动更新
649 1 watchdog();
650 1 }
651
652 /*********************************************************
653 *名称:CPU_init(void)
654 *功能:CPU初始化
655 *入口参数:无
656 *出口参数:无
657 *********************************************************/
658 void CPU_init(void)
659 { uchar deca,first;
660 1 P1M1 = 0x1c; // P12,P13,P14,P15,输入P10,P11,P16,P17输出
661 1 P1M2 = 0xc3;
662 1 P2M1 = 0x00; //全为输出
663 1 P2M2 = 0xFF;
664 1
665 1 ALAME=0;
666 1 timeled=0;
667 1 templed=0;
668 1 CCU_init();
669 1 AD_init();
670 1 ACC=WDCON;
671 1 ACC|=0x04;
672 1 WDL=0x08; //装入8位倒计数的新值
673 1 EA=0;
674 1 WDCON=ACC; //设置WD_RUN=1
675 1 WFEED1=0xA5; //执行清零第一部份
C51 COMPILER V7.01 ACUS 11/24/2004 13:33:22 PAGE 12
676 1 WFEED2=0x5A; //执行清零第二部分
677 1 TRIM|=0xc0;
678 1 EA=1;
679 1 TimeLimit= EEPROMread(TIMEADDR);
680 1 if(TimeLimit>0&&TimeLimit<=60)
681 1 { end.hour=TimeLimit/60+ctime.hour; //记录结束时间
682 2 end.min= TimeLimit%60+ctime.min;
683 2 end.sec= 0;
684 2 deca =TimeLimit/10;
685 2 first=TimeLimit%10;
686 2 WriteDisp(0,deca);
687 2 WriteDisp(1,first);
688 2 os_create_task (TIMECON);
689 2 if(P13==0)
690 2 {TempLimit=EEPROMread(TEMPADDR);
691 3 if(TempLimit>0)
692 3 os_create_task(TEMPCON);
693 3 else TempLimit=0;
694 3 }
695 2 } //开始诊病任务
696 1 else TimeLimit=0;}
697 /**************************************************
698 *原型:void PushNews(void)
699 *功能:将消息压入堆栈
700 *说明:但是没有将其置为有效
701 *参数:无
702 *返回:无
703 **************************************************/
704 void PushNews(void) {
705 1 uchar ch,i;
706 1 ch=NewsStr[0];
707 1 ch++;
708 1 i=(P1|0xf3);
709 1 NewsStr[ch]=_cror_ (i,2);
710 1 }
711 /**************************************************
712 *原型:uchar PopNews(void)
713 *功能:弹出最老消息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -