⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c8051f064.c

📁 c8051f064 源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        K3=1  ;     //继电器断开,测量常闭触电
        bcdchang ();
        t1_buffer[24]=r0_buffer[6]<<4|r0_buffer[5];
        t1_buffer[25]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[26]=r0_buffer[2]<<4|r0_buffer[1];
} 
//******************************************************* 
void test3(void)
 {
        test11();
        bcdchang ();
        t1_buffer[19]=r0_buffer[6]<<4|r0_buffer[5];
        t1_buffer[20]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[21]=r0_buffer[2]<<4|r0_buffer[1];
}
//******************************************************* 
void test4(void)
 {
      delay(n);
      adch();
    if (admn<298)   //小于16V
      {
        K2=0;
        delay(n);
        adch();
        adc=(unsigned long)admn*3/100;     //*61/6/2*2470/4096/100   
        K2=1;
      }
      else   adc=(unsigned long)(admn*337/500);  //*1342/6/2*2470/4096/100  
        bcdchang ();
        t1_buffer[22]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[23]=r0_buffer[2]<<4|r0_buffer[1];
} 
//******************************************************* 
void test11(void)
 {
        delay(n);
         adch();
      if (admn<298)   //小于16V
      {
        K2=0;
        delay(n);
        adch();
        adc=(unsigned long)(admn*3/100);  //61/6/2*2470/4096
        K2=1;
       }
//        admn=admn*48; //6175/128;    
      else adc = (unsigned long)(admn*337/500); //1342/6/2*2470/4096

}
//******************************************************* 
void test5(void)
 {
      delay(4*n);     //91H
      adch1();
      if (admn<298)   //小于16V
     {
        K2=0;
        delay(4*n);   //190.24ms
        adch1();
        adc=( unsigned long)(admn*3/100); 
        K2=1  ;
      }

      else adc=( unsigned long)(admn*337/500);  //*80*2470/4096/100
        K3=1;
        bcdchang ();
        t1_buffer[27]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[28]=r0_buffer[2]<<4|r0_buffer[1];
} 
//******************************************************* 
void test6(void)
 {
       test12();         //92H
        K3=1  ;//继电器断开,测量常闭触电
        bcdchang ();
        t1_buffer[24]=r0_buffer[6]<<4|r0_buffer[5];
        t1_buffer[25]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[26]=r0_buffer[2]<<4|r0_buffer[1];
} 
//******************************************************* 
void test7(void)
 {
       test12();      //93H
        bcdchang ();
        t1_buffer[19]=r0_buffer[6]<<4|r0_buffer[5];
        t1_buffer[20]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[21]=r0_buffer[2]<<4|r0_buffer[1];
}
//******************************************************* 
void test8(void)
 {
      delay(4*n);   //94H
      adch1();
      if (admn<298)   //小于16V
      {
        K2=0;
        delay(4*n);
        adch1();
        adc=( unsigned long)(admn*3/100);  
        K2=1;
        }
        else adc=( unsigned long)(admn*337/500);  //*80*2470/4096/100
        bcdchang ();
        t1_buffer[22]=r0_buffer[4]<<4|r0_buffer[3];
        t1_buffer[23]=r0_buffer[2]<<4|r0_buffer[1];
} 
//******************************************************* 
void test12(void)
 {
        delay(4*n);
         adch1();
      if (admn<298)   //小于16V
      {
        K2=0;
        delay(4*n);
        adc=( unsigned long)(admn*3/100);  
        K2=1;
        }
        else adc=( unsigned long)admn*337/500;     //*1342/2/6*2470/4096
}
//******************************************************* 
void test21(void)   //86H  88H
 {
          K3=0  ;            //继电器吸合,测量常开触电
         test1();
         test3();
}
//******************************************************* 
void test22(void)  //87H  89H
 {
         K3=0  ;            //继电器吸合,测量常开触电
         test2();
         test4();
 }
//******************************************************* 
void test23(void)   //91H  93H
 {
         K3=0  ;            //继电器吸合,测量常开触电
         test5();
         test7();
 }
//******************************************************* 
void test24(void)   //92H  94H
 {
        K3=0;
        test6();
        test8();
 }
//******************************************************* 
void adch(void)
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = ADC0_PAGE;                // Switch to ADC0 Page

    t5=208;
    for (i=0;i<12;i++)
    {
        delay(t5);
      ADC0CN = 0x090;     // 启动转换        
      while ((ADC0CN&0x20)==0);  
      ad[i]=ADC0;

     }

    for (i=0;i<12;i++)
    {
     for (j=i;j<12;j++)
     {
      if (ad[i]< ad[j])
      {
        ad[12]= ad[i];
        ad[i]= ad[j];
        ad[j]=ad[12];
      } 
     }
   }
       admn=(ad[4]+ad[5]+ad[6]+ad[7] )/4;
   SFRPAGE = old_SFRPAGE;
}
//******************************************************* 
void adch1(void)
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = ADC1_PAGE;                // Switch to ADC0 Page

    t5=208;
    for (i=0;i<12;i++)
    {
        delay(t5);
      ADC1CN = 0x090;     // 启动转换        
      while ((ADC1CN&0x20)==0);  
      ad[i]=ADC1;

     }

    for (i=0;i<12;i++)
    {
     for (j=i;j<12;j++)
     {
      if (ad[i]< ad[j])
      {
        ad[12]= ad[i];
        ad[i]= ad[j];
        ad[j]=ad[12];
      } 
     }
   }
       admn=(ad[4]+ad[5]+ad[6]+ad[7] )/4;
   SFRPAGE = old_SFRPAGE;
}
//******************************************************* 
void cpinit(void)
 {
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CPT0_PAGE ;
   CPT0CN=0x8a;
   SFRPAGE = CPT1_PAGE ;
   CPT1CN=0x8a;
   SFRPAGE = old_SFRPAGE; 

 } 
//--------------------------------------------------------------------------
// Initialization Subroutines
// SYSCLK_Init     使用11.0592MHz外部晶体振荡器 
// This routine initializes the system clock to use an 11.0592MHz crystal
// as its clock source.
void SYSCLK_Init (void)
{
   char old_SFRPAGE = SFRPAGE;

   SFRPAGE = CONFIG_PAGE;              // Switch to Configuration Page

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal on TB

   for (i=0; i <5000; i++) ;           // XTLVLD blanking interval (>1ms)

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   RSTSRC = 0x04;                      // enable missing clock detector reset

   CLKSEL = 0x01;                      // change to external crystal

   OSCICN = 0x00;                      // disable internal oscillator

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

/*
void SYSCLK_Init (void)
{
   OSCXCN = 0x67;                      // start external oscillator with
   for (i=0; i < 256; i++) ;           // XTLVLD blanking interval (>1ms)
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
}  */
//******************************************************************
//该函数为延时函数,延时长短由X决定,
 void delay(unsigned int x)
{
  for (i = x; i > 0; i--)
  { 
     LED = 0;
    WDTCN = 0xa5;       // 开看门狗,清看门狗
    LED = 1;  
  }
}  
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
char old_SFRPAGE = SFRPAGE;

   SFRPAGE = CONFIG_PAGE;              // Switch to configuration page


   XBR0    = 0x04;                     // Enable UART0 on crossbar
   XBR1    = 0x00;
   XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
   P0MDOUT |= 0xFF;                    // enable Port0 outputs as push-pull

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

/*

// Configure the Crossbar and GPIO ports
void PORT_Init (void)
{
   XBR0    = 0x04;                  // Enable UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                  // Enable UART1
                                    // Enable crossbar and weak pull-ups
   P0MDOUT |= 0x35;                 // enable P0 as a push-pull output
                                    // P0.5  P0.4  P0.2  P0.0
   P1MDOUT |= 0x3f;                 // enable P1 as a push-pull output
                                    // P1.5  P1.4  P1.3  P1.2  P1.1  P1.0
}      */
//----------------------------------------------------------------------------
// UART_Init
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
char old_SFRPAGE = SFRPAGE;

   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

   SCON0   = 0x50;                     // SCON: mode 1, 8-bit UART, enable RX
   SSTA0 = 0x10;                       // Timer 1 generates UART0 baud rate and
                                       // UART0 baud rate divide by two disabled

   SFRPAGE = TIMER01_PAGE;             // Switch to Timer 0/1 page

   TMOD   = 0x20;                      // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
//   PCON  |= 0x80;                      // SMOD = 1

   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

   TI0    = 1;                         // Indicate TX ready

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE

}

//-----------------------------------------------------------------------------
// ADC0_Init
void ADC0_Init (void)
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = ADC0_PAGE;                // Switch to ADC0 Page
   ADC0CN = 0x40;                      // ADC abled, AD0BUSY=1  start-of-conversion
   REF0CN = 0x03;                      // turn on bias generator and internal reference.
   for(i=0;i<10000;i++);               // Wait for Vref to settle (large cap used on target board)
   AMX0SL = 0x00;                      // Single-ended mode
   ADC0CF = (SYSCLK/25000000) << 4;    // Select SAR clock frequency =~ 25MHz

   SFRPAGE = ADC1_PAGE;         
   ADC1CN = 0x40;                      // ADC abled, AD1BUSY=1 start-of-conversion 
   REF1CN = 0x03;                     
   for(i=0;i<10000;i++);               // Wait for Vref to settle (large cap used on target board)
   ADC1CF = (SYSCLK/25000000) << 4;    // Select SAR clock frequency =~ 25MHz

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}


/*

void ADC0_Init (void)
{
   ADC0CN = 0x00;                      // ADC0 disabled; normal tracking
                                       // mode; ADC0 conversions are initiated 
                                       // on overflow of Timer3; ADC0 data is
                                       // left-justified
   REF0CN = 0x03;                      // enable temp sensor, on-chip VREF,
                                       // and VREF output buffer
   AMX0SL = 0x00;                      // Select  ADC mux output  Ch0
 //  AMX0CF = 0x00;
 
//   ADC0CCF = 0x00; 
 
   ADC0CF = (SYSCLK/2500000) << 3;     // ADC conversion clock = 2.5MHz
}	*/
//-----------------------------------------------------------------------------
// Timer3_Init
// Configure Timer3 to auto-reload and generate ADC sample rate
// specified by <counts> using SYSCLK as its time base.
//
void Timer3_Init (void)
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = TMR3_PAGE;                // Switch to Timer 3 page
   TMR3CF = 0x08;                      // use SYSCLK as timebase

   TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
//   RCAP3   = -counts;                  // Init reload values
   TMR3    = 0x0000;                   // set to reload immediately
//   TR3 = 1;                            // start Timer3

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}



 /*

void Timer3_Init (void)
{
   TMR3CN = 0x02;                    // Stop Timer3; Clear TF3;
                                       // use SYSCLK as timebase
   TMR3RL =0x0000;                  // Init reload values
   TMR3 = 0x0000;                   // set to reload immediately
}		*/
//************************************************************************
void  UART0RX_VECTOR (void)  interrupt 4
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

  if (RI0==1)
 {
  RI0=0;
   r0_buffer[r0]=SBUF0;//接受缓冲区读数
   r0=++r0&0x0007;
  if ((r0==2)&&(r0_buffer[1]!=top1))
  {
     r0=1;
     r0_buffer[0]= r0_buffer[1]; 
   }
   if ((r0==1)&&(r0_buffer[0]!=top0))
   {
    r0=0;
    } 
  }
   SFRPAGE = old_SFRPAGE;
}
//************************************************************************
void  CP0DOWN (void)  interrupt 10
{ 
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CPT0_PAGE ;
    CPT0CN &=~ 0x10;

   SFRPAGE = TMR3_PAGE;                // Switch to Timer 3 page 
   dodata1[cp1]=TMR3;
   dodata2[cp1]=count;
   if (cp1<1)
   {
    cp1++;
   }
   SFRPAGE = old_SFRPAGE;

}
//************************************************************************
void  CP0UP (void)  interrupt 11
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CPT0_PAGE ;
    CPT0CN &=~ 0x20;
  SFRPAGE = TMR3_PAGE;  
    updata1[cp2]=TMR3;
    updata2[cp2]=count;
   if (cp2<1)
   {
    cp2++;
   }
   SFRPAGE = old_SFRPAGE;

}
//************************************************************************
void  CP1DOWN (void)  interrupt 12
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CPT1_PAGE ;
   CPT1CN &=~ 0x10;
  SFRPAGE = TMR3_PAGE;  
    dodata3[cp3]=TMR3;
   dodata4[cp3]=count;
   if (cp3<1)
   {
    cp3++;
   }
   SFRPAGE = old_SFRPAGE;

}
//************************************************************************
void  CP1UP (void)  interrupt 13
{
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CPT1_PAGE ;
    CPT1CN &=~ 0x20;
    SFRPAGE = TMR3_PAGE;  
    updata3[cp4]=TMR3;
    updata4[cp4]=count;
   if (cp4<1)
   {
    cp4++;
   } 
   SFRPAGE = old_SFRPAGE;

}
//****************************************************************
void Time3_vecter  (void) interrupt 14
 {
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = TMR3_PAGE;  

  count++;
  TMR3CN &=~ 0x80;  
  WDTCN = 0xa5;       // 开看门狗,清看门狗
 
   SFRPAGE = old_SFRPAGE;
 
  }
//****************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -