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

📄 main().c

📁 该程序运行在凌阳单片机SPCE061A的unSP开发环境,可实现对电源功率因数的运算,监测与控制补偿.
💻 C
字号:
#include"SPCE061V004.h"
#include"IO_bit.h"
#include"math.h"
#define load IOB0 //同相高电平输出口
#define din  IOB1 //同相高电平输出口
#define dclk IOB2 //同相高电平输出口
#define dout IOB3 //上拉输入口(外部中断源2,下降沿触发)
#define pi 3.1415926
///////////////////////////////////////////////////////
unsigned int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
float fre1=0,fre2=0;
unsigned int ad=0;
unsigned int a[1000];
unsigned int i=0;

float wp,yp;
float dianliu ,dianya; 	
double ys,yss;
//////////////////////////////////////////////////////向CH452送数据 
 void  ch452_write(unsigned int ldata,unsigned int hdata)
 {   
   unsigned i;
   for(i=0;i<8;i++)
   {      
      dclk=0; 
      if(ldata&0x0001)  din=1;
      else din=0;
      dclk=1;
      ldata=ldata>>1;
   }  
   for(i=0;i<4;i++)
   {     
       dclk=0; 
       if(hdata&0x0001) din=1;
       else din=0;
       dclk=1;
       hdata=hdata>>1;
   }
   load=0;
   load=1;
 }
////////////////////////////////////////////////////// 从CH452读取数据
  unsigned int ch452_read(void)
 {  
    unsigned int i, key=0,com=0x07;
    for(i=0;i<4;i++)
    {  
     if(com&0x01) din=1;
        else din=0;
        com>>=1;
          dclk=0;
          dclk=1;
    }
       load=0;
       load=1;
       for(i=0;i<7;i++) 
     {  key=key|dout;
          dclk=0;    
          dclk=1;
        key=key<<1;
     }
        key=key>>1;
      return (key);
 }
///////////////////////////////////////////////////// 初始化CH452 
  void ch452_init(void) 
 {
      ch452_write(0x0001,0x0002);
      ch452_write(0x0023,0x0004);
      ch452_write(0x0080,0x0005);
}
void sys_Init(void)
 { ////////////////////////////////////////////////////IO口初始化
     //*P_IOB_Dir=*P_IOB_Dir&0xfff7;
     //*P_IOB_Dir=*P_IOB_Dir|0x0007;
     //*P_IOB_Attrib=*P_IOB_Attrib&0xfff7;
     //*P_IOB_Attrib=*P_IOB_Attrib|0x0007;
     //*P_IOB_Data=*P_IOB_Data|0x000f;
     *P_IOA_Dir=0xff00;
     *P_IOA_Attrib=0xffff;
     *P_IOA_Data=0x0000;
     *P_IOB_Dir=0xff07;
     *P_IOB_Attrib=0xff07;
     *P_IOB_Data=0xff0f;

  /////////////////////////////////////////开键盘显示功能
      ch452_init();
     *P_ADC_Ctrl= C_ADCE;
 
     *P_DAC_Ctrl=C_DA1_Direct; 
 
 
      *P_INT_Ctrl=C_IRQ3_EXT2 ;
       __asm("INT IRQ");
    }
////////////////////////////////////////////////////键盘显示从0到65535 
 void disp1(unsigned int data)
 {  
    unsigned long int i,c[8]={0x8,0x9,0xa,0xb,0xc,0xd,0xe,0x1};
    unsigned int s;
    ch452_init();   
     for(i=0;i<5;i++)
    {   
       s=data%10;
       ch452_write(s,c[i]);
       if(i==3)
       ch452_write(s|0x80,c[i]);   
       data=data/10;
       //if(data==0) break;  
       
     }
    
 }
////////////////////////////////////////////////////////////

void   AD1(void)
 { unsigned int buff;
   float tem;
   
    *P_ADC_MUX_Ctrl=	C_ADC_CH4;
    *P_ADC_Ctrl= C_ADCE;
 
    buff=*P_ADC_LINEIN_Data;//开始转换
    while(!(*P_ADC_MUX_Ctrl&0x8000));
    buff=*P_ADC_LINEIN_Data;
   
    *P_ADC_Ctrl=0x0002;//关AD转换
    tem=buff*3.3/0xffc0;
    dianliu=tem;
  // disp2(x1);

  }
 
void   AD2(void)
 { unsigned int buff;
   float tem;
   
    *P_ADC_MUX_Ctrl=	C_ADC_CH5;
    *P_ADC_Ctrl= C_ADCE;
 
    buff=*P_ADC_LINEIN_Data;//开始转换
    while(!(*P_ADC_MUX_Ctrl&0x8000));
    buff=*P_ADC_LINEIN_Data;
   
    *P_ADC_Ctrl=0x0002;//关AD转换
    tem=buff*3.3/0xffc0;
    dianya=tem;
  // disp2(x1);

  }
///////////////////////////////////////////


 
 
 
 
 
 
 
 
 //////////////////////////////////////////////////////////// 
 void IRQ3(void) __attribute__ ((ISR));
 void IRQ3(void)
 {  
 
   unsigned int key_code,i;    
     key_code=ch452_read();
    switch(key_code)
    {  case 0x0040:disp1((unsigned int)(dianliu*1000+10));
                     ch452_write(0xa,0x0f);
                     for(i=0;i<1000;i++) 
                     *P_Watchdog_Clear=1;
                      break;      //显示电流有效值
       case 0x0041:disp1((unsigned int)(dianya*1000+300)) ;
                     ch452_write(0xd,0x0f);
                     for(i=0;i<1000;i++) 
                     *P_Watchdog_Clear=1; break;       //显示电压有效值
       case 0x0042:disp1((unsigned int)(fre1*1000.00));
                   ch452_write(0xf,0x0f);
       				for(i=0;i<1000;i++)
        			*P_Watchdog_Clear=1; break;          //显示电网频率
       case 0x0043:disp1((unsigned int)(ys*1000.00));
       				ch452_write(0xe,0x0f);
       				for(i=0;i<1000;i++) 
       				*P_Watchdog_Clear=1; break;            //显示功率因素
       case 0x0044:disp1((unsigned int )(yp*1000));
                    for(i=0;i<1000;i++) 
                    *P_Watchdog_Clear=1;
                    ch452_write(0x19,0x0f); 
                    ch452_write(0x1,0x0e); break;            //显示有功功率
       case 0x0045:disp1((unsigned int )(wp*1000));
                      for(i=0;i<1000;i++) 
                     *P_Watchdog_Clear=1;
                      ch452_write(0x19,0x0f);
                      ch452_write(0x2,0x0e); break;            //显示无功功率
       //case 0x0046:flag3=1;ch452_write(0x7,0x0e);break;
       //case 0x0047:flag4=1;break;  
    /*  case 0x0048:key9();break;
        case 0x0049:key10();break;
        case 0x004a:key11();break;
      case 0x004b:key11();break;
      case 0x004c:key12();break;
      case 0x004d:key13();break;
      case 0x004e:key14();break;
      case 0x004f:key15();break;*/
      default:break;
    
    }
    *P_INT_Clear=0x0200;
}




  float s; 
//////////////////////////////////////////////////////
main()


{  unsigned int count=0;
   unsigned int  data1=0,data2=0;

   sys_Init();
    disp1(0);
    
    
     
     while(1)
  {  
          while(IOA0==0)                               /////测周期
          {*P_Watchdog_Clear=1;}
          while(IOA0==1)
           {*P_Watchdog_Clear=1;}
      
          *P_TimerA_Ctrl=	C_SourceA_Fosc256		+C_SourceB_1	;
     
          
          while(IOA0==0)
          {*P_Watchdog_Clear=1;}
          while(IOA0==1)
          {*P_Watchdog_Clear=1;}
         

          *P_TimerA_Ctrl=C_SourceA_0	+C_SourceB_1	;
          data1=*P_TimerA_Data; 
      
          *P_TimerA_Data=0x0000; 
         
          while(IOA1==1)                               ////测高电平时间
   	     {*P_Watchdog_Clear=1;}
          while(IOA1==0);
           {*P_Watchdog_Clear=1;}      
         *P_TimerA_Ctrl=C_SourceA_Fosc256+C_SourceB_1	;
        
        
         while(IOA1==1)
         {*P_Watchdog_Clear=1;}
   
      
         *P_TimerA_Ctrl=C_SourceA_0+C_SourceB_1	;
         data2=*P_TimerA_Data; 
         *P_TimerA_Data=0x0000; 

	     
	     AD1();
	     dianliu=dianliu/3.77;
	     AD2();		
         dianya=dianya*12.64;
  
        
        
        fre1=(float)(96000.00/data1);
        fre2=(float)(96000.00/data2);
             
        s=data2*1.0/data1;
        ys=cos((double)(2*pi*s));    //计算功率因素
        yss=sin((double)(2*pi*s));
        
       
        
        yp= dianya*dianliu*ys;                //计算无功功率,有功功率。
        wp= dianya*dianliu*yss;
     
   
     
          *P_Watchdog_Clear=1;
     }
  
     }
   

⌨️ 快捷键说明

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