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

📄 shiyan.c

📁 基于dsPIC30F的 智能型变压器有载分接开关参数综合测试仪 C语言
💻 C
📖 第 1 页 / 共 4 页
字号:
           PORTDbits.RD7=0;                   //选通正档2(20欧姆)            
           PORTDbits.RD6=1;                   //关闭正档1(220欧姆)
           hdcx1();
         }
      }
      else
      {
         hdcx1();
      }
    }
    if(fudu2>FuDufirst)
    {
      hdcx2();
    }
    else
    {
      if((fudu2*10)<=FuDufirst)
      {
        PORTGbits.RG15=1;                   //关闭标档1(220欧姆)
        hdcx2();
      }
      else
      {
         hdcx2();
      }
    }
  }while((s1==1)&&(s2==1)); 
 // PORTGbits.RG12=1;
  //if((fudu1>=0x28f)&&(fudu1<=0x35b))
 //{
    //delaydms(500);
   // PORTGbits.RG12=!PORTGbits.RG12;
 // }
 // else
    //if(fudu2>fudu1)
 // {
    //delaydms(500);
   // PORTGbits.RG12=0; 
 // }
 // if((fudu2>=0x28f)&&(fudu2<=0x35b))
 // {
    //delaydms(500);
  //  PORTGbits.RG13=!PORTGbits.RG13;
 // }
 // else
    //if(fudu2>fudu1)
 // {
    //delaydms(500);
  //  PORTGbits.RG13=0;  
  //}
 //for(b=0;b<10;b++)
 //{
 // PORTGbits.RG12=1;
 // adrh();
 // jztg();
 // x[b]=J;
 // PORTGbits.RG12=0;
 // delaydms(5000);
// }
// F=(x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7]+x[8]+x[9])/10;
// while(1)
// {
//   PORTGbits.RG12=0;
// }
************************************************************************/
 return 0; 
}
//延时函数


//AD初始化
void AD1int(void)
{
  TRISCbits.TRISC1 = 0;         // set portc one is output
  CONTROLAD = 0;            // disenable AD
  TRISCbits.TRISC13 = 0;        // set portc thirteen is output
  TRISB=0xFFFF;                 // set portb is input
  TRISBbits.TRISB12 = 1;
  PORTCbits.RC13= 1;            // no read AD
  //PORTCbits.RC1 = 0;          // set out A/D
}
//定时器初始化
void timerint(unsigned int match_value)
{
  ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);     // Enable Timer1 Interrupt and Priority to "1" 
  WriteTimer1(0);
  OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP &
             T1_PS_1_1 & T1_SYNC_EXT_OFF &T1_SOURCE_INT, match_value);
}
//SPI2口的初始化
void spiint(void)
{
  TRISGbits.TRISG6= 1;   //SCK2 input
  TRISGbits.TRISG7= 1;   //SDI2 input
  TRISGbits.TRISG8= 0;   //SDO2 output
  TRISGbits.TRISG9= 0;   //SS2  input
  ConfigIntSPI2(SPI_INT_EN & SPI_INT_PRI_6);  //Enable SPI2 interrupt and Priority to "6"
  // Configure SPI2 module to transmit 8 bit value in slave mode 
  SPICONValue = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & ENABLE_SDO_PIN & SPI_MODE16_OFF & 
                SPI_SMP_OFF & SPI_CKE_OFF & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_LOW &
                MASTER_ENABLE_OFF & SEC_PRESCAL_7_1 & PRI_PRESCAL_64_1;
  SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR;
  OpenSPI2(SPICONValue,SPISTATValue );
}
//使能PVS
void EnablePSV(void)
{
  CORCONbits.PSV = 1;
}
//输出20kHz方波
void ONhighpower(void)
{
  timerint(225);
  HIGHPOWER=1;
}
//停止输出20kHz方波
void OFFhighpower(void)
{
  CloseTimer1();
  HIGHPOWER=1;
}
/*
//正档4051换档程序
void hdcx1(void)
{
  switch(ch_status1)
  {
    case CH_OFF1:
         if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
         {
            ch_status1=CH_OFF1;
            s1=1;
         }
         else 
         {
            if((fudu1*3.3)<=FuDu_TOP )
            {
              ch_status1=CH_01;
              PORTDbits.RD2=0;                 //A,选4051的通道2,使增益为3.3
              PORTDbits.RD1=1;                 //B
              PORTDbits.RD0=0;                 //C
            }
            else
            {
              s1=1;
            }
         }
         break;
    case CH_01:
         if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
         {
            ch_status1=CH_01;
            s1=1;
         }
         else
         {
            if((fudu1*11)<=FuDu_TOP)
            {
               ch_status1=CH_11;
               PORTDbits.RD2=1;                 //A,选4051的通道1,使增益为11
               PORTDbits.RD1=0;                 //B
               PORTDbits.RD0=0;                 //C
            } 
            else
            {
              s1=1;
            }           
          }
          break;       
    case CH_11:
         if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
         {
            ch_status1=CH_11;
            s1=1;
         }
         else 
         {
            if((fudu1*36.3)<=FuDu_TOP)
            {
               ch_status1=CH_21;
               PORTDbits.RD2=0;                 //A,选4051的通道0,使增益为36.3
               PORTDbits.RD1=0;                 //B
               PORTDbits.RD0=0;                 //C
               nop();
            }
            else
            {
              s1=1;
            }
          }
          break;
    case CH_21:
            if((fudu1>=FuDu_BOTTOM)&&(fudu1<=FuDu_TOP))
            {
               ch_status1=CH_21;
               s1=1;
            }
            else
            {
               s1=1;
            } 
            break;   
  }       
}
//标档4051换档程序
void hdcx2(void)
{
  switch(ch_status2)
  {
    case CH_OFF2:
         if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
         {
            ch_status2=CH_OFF2;
            s2=1;
         }
         else 
         {
            if((fudu2*3.3)<=FuDu_TOP )
            {
              ch_status2=CH_02;
              PORTDbits.RD2=0;                 //A,选4051的通道2,使增益为3.3
              PORTDbits.RD1=1;                 //B
              PORTDbits.RD0=0;                 //C
            }
            else
            {
              s2=1;
            }
         }
         break;
    case CH_02:
         if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
         {
            ch_status2=CH_02;
            s2=1;
         }
         else
         {
            if((fudu2*11)<=FuDu_TOP)
            {
               ch_status2=CH_12;
               PORTDbits.RD2=1;                 //A,选4051的通道1,使增益为11
               PORTDbits.RD1=0;                 //B
               PORTDbits.RD0=0;                 //C
            } 
            else
            {
              s2=1;
            }           
          }
          break;       
    case CH_12:
         if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
         {
            ch_status2=CH_12;
            s2=1;
         }
         else 
         {
            if((fudu2*36.3)<=FuDu_TOP)
            {
               ch_status2=CH_22;
               PORTDbits.RD2=0;                 //A,选4051的通道0,使增益为36.3
               PORTDbits.RD1=0;                 //B
               PORTDbits.RD0=0;                 //C
               nop();
            }
            else
            {
              s2=1;
            }
          }
          break;
    case CH_22:
            if((fudu2>=FuDu_BOTTOM)&&(fudu2<=FuDu_TOP))
            {
               ch_status2=CH_22;
               s2=1;
            }
            else
            {
               s2=1;
            } 
            break;   
  }       
}
*/
//定时器1的中断程序
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
  IFS0bits.T1IF = 0; // Clear Timer interrupt flag 
  WriteTimer1(0);
  HIGHPOWER=!HIGHPOWER;
}
//SPI2口中断程序
void __attribute__((__interrupt__)) _SPI2Interrupt(void)
{
  IFS1bits.SPI2IF = 0; 
}
//AD读数程序
void  ADread(void)
{
   while(PORTBbits.RB12==0);     // A/D convert end 
   delaydms(105);
   PORTDbits.RD9=0;              //选中7862
   nop(); nop();
   PORTCbits.RC13=0;             // read A/D
   nop();
   d=PORTB;
   nop();
   PORTCbits.RC13=1; 
   e=((d&0x0FFC)|((d>>14)&0x03));
   PORTCbits.RC13=0;             // read A/D 
   nop();
   f=PORTB;
   nop();
   PORTCbits.RC13=1; 
   g=((f&0x0FFC)|((f>>14)&0x03));
   nop();nop();
   PORTDbits.RD9=1;
}
//A/D转换
void adrh(void)
{
  h=0; 
  // OpenTimer1();           //启动定时器1
  PORTCbits.RC1 = 0;      //启动A/D
  while(XWYB==0)
  {
    //while(PORTBbits.RB12==0); //A/D转换完
    if(h>=1000) break;
    ADread();
    u[h]=g;
    h++;
    if(dsd==1) break;
  }
  for(i=0;i<1000;i++)
  {
    ADread();
    v[i]=e;
    if(h<1000)
    {
      u[h]=g;
    }
    h++;
  }
  PORTCbits.RC1 = 1;      //停止A/D 
}
//算正切角
float suntg(char j)
{
  for(b=0;b<250;b++)
  {
    p=((float)(*(w+a)-*(w+500+a)+i*(*(w+500-a)-*(w+1000-a))))*(*(m+a))+p;
  }
  if(j>0)
  {
    t=p+*(w+250)-*(w+750);
  }
  if(j<0)
  {
    t=p+*(w+0)-*(w+500);
  }
  return(t);  
} 
//计算介质损耗角
float jztg(void)
{
  k=-1;
  w=&u[0];
  m=&cs[0];
  A=suntg(k);
  k=1;
  w=&u[0];
  m=&ss[0];
  B=suntg(k);
  k=-1;
  w=&v[0];
  m=&cs[0];
  C=suntg(k);
  k=1;
  w=&v[0];
  m=&ss[0];
  D=suntg(k);
  J=(A*D-C*B)/(B*D+A*C);
} 
/******************************************************************************************

//主程序
void 	
    delaydms(25000);                //延时
    //slzs(0xfe);   
    delaydms(1000);
    FloatToChar(0.00048881, ch); //34.526存为(160,26,10,66  
    j=ch[0];
    s1=ch[1];
    s2=ch[2];
    s3=ch[3]; 
    d=CtoF(ch);                                                      
    while(1)//17.625 的 float 儲存格式就是:41 8D 00 00  
   {
    ;
   }     
}
//串行口的发送和接收
char Buf[80];                                              // Received data is stored in array Buf 
char * Receivedddata = Buf;                                //This is UART1 transmit ISR 
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
  IFS0bits.U1TXIF = 0;
}
void __attribute__((__interrupt__)) _U1RXInterrupt(void)   //This is UART1 receive ISR 
{
  IFS0bits.U1RXIF = 0;  // Read the receive buffer till atleast one or more character can be read
  while( DataRdyUART1())
  {
    ( *( Receiveddata)++) = ReadUART1();
  }
}
void yibusxk(void)
{
   char Txdata[] = {'M','i','c','r','o','c','h','i','p','
                    ','I','C','D','2','\0'};               //Data to be transmitted using UART communication module
   unsigned int baudvalue;                                 // Holds the value of baud register
   unsigned int U1MODEvalue;                               // Holds the value of uart config reg 
   unsigned int U1STAvalue;                                // Holds the information regarding uart TX & RX interrupt modes
                                             // Turn off UART1module 
   ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
                  UART_TX_INT_DIS & UART_TX_INT_PR2);      // Configure uart1 receive and transmit interrupt    
   baudvalue = 5;                                     
                               // Configure UART1 module to transmit 8 bit data with one stopbit.Also Enable loopback mode 
   U1MODEvalue = UART_EN & UART_IDLE_CON &
   UART_DIS_WAKE & UART_EN_LOOPBACK &
   UART_EN_ABAUD & UART_NO_PAR_8BIT &
   UART_1STOPBIT;
   U1STAvalue = UART_INT_TX_BUF_EMPTY &
   UART_TX_PIN_NORMAL &
   UART_TX_ENABLE & UART_INT_RX_3_4_FUL &
   UART_ADR_DETECT_DIS &
   UART_RX_OVERRUN_CLEAR;
   OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
   // Load transmit buffer and transmit the same till null character is
    encountered 
   putsUART1 ((unsigned int *)Txdata);
   // Wait for transmission to complete 
   while(BusyUART1());
   // Read all the data remaining in receive buffer which are unread 
   while(DataRdyUART1())
   {
     (*( Receiveddata)++) = ReadUART1() ;
   }
   // Turn off UART1 module 
   CloseUART1();
   return 0;
}
//SPI串口的发送和接收
unsigned int datard ;                                      //Data received at SPI2 
void __attribute__((__interrupt__)) _SPI1Interrupt(void)
{
  IFS0bits.SPI1IF = 0;
}
void __attribute__((__interrupt__)) _SPI2Interrupt(void)
{
  IFS1bits.SPI2IF = 0;
  SPI1STATbits.SPIROV = 0; // Clear SPI1 receive overflow flag if set 
}
void spifsjs(void)
{
  // Holds the information about SPI configuartion 
  unsigned int SPICONValue;

⌨️ 快捷键说明

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