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

📄 ddj.c

📁 电动机保护测量程序,用的是DSP2407,
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "2407.h"
#include "DDJ.h"  
#include "math.h"      
extern void SAMPLE_ASM();
//LCD-RS-----DIN0(IOPB0)
//LCD-RW-----DIN1(IOPB1)
//LCD-E------DIN2(IOPB2)
struct TabStruct
{
  unsigned int scireq;      
  unsigned int status;        /* 事件执行的状态 */
  void (*func)();             /*当前状态应该执行的功能操作*/
} ;

struct  TabStruct FuncTab[SUM_EVENT]=
   {
  
       {0x5555,0x5555, SetTimeToPCF8583},  //0
       {0xaaaa,0x5555, resend          },  //1  

       {0x5555,0x5555, HeFenCaoZuo     },  //2    

       {0xaaaa,0x5555, made_cancle     },  //3
       {0xaaaa,0x5555, made_execute    },  //4         
       {0xaaaa,0x5555, made_choise     },  //5 
       
       
       {0x5555,0x5555, dealdata        },  //6      
       {0xaaaa,0x5555, made_time       },  //7       
 
       {0xaaaa,0x5555, made_resetlianlu},   //8
       {0xaaaa,0x5555, made_resetcu    },  //9
       {0xaaaa,0x5555, made_netstatus  },  //10

       {0x5555,0x5555, DingZhiLoad     },  //11
       {0xaaaa,0x5555, made_dzchenggong},  //12   
       {0xaaaa,0x5555, made_dzshibai   },  //13

  
       {0xaaaa,0x5555, made_zongzhaocom},  //14
       {0xaaaa,0x5555, made_messure1   },  //15
       {0xaaaa,0x5555, made_messure2   },  //16
       {0xaaaa,0x5555, made_messure3   },  //17
       {0xaaaa,0x5555, made_signal1    },  //18
       {0xaaaa,0x5555, made_endrequire },  //19
              
       {0xaaaa,0x5555, made_nodata     },  //20
       {0xaaaa,0x5555, made_measurechange},//21
       {0xaaaa,0x5555, made_statuschange}, //22
       {0xaaaa,0x5555, made_soe        },  //23
 
       {0xaaaa,0x5555, made_lubo       },  //24

       {0xaaaa,0x5555, made_dingzhi    },  //25
       {0xaaaa,0x5555, made_endlianlu  },  //26 
       {0xaaaa,0x5555, made_signal2    },  //27
       {0x5555,0xaaaa, DingZhiCRC      },  //28
     
   } ;

void resend (void)
{
  senddata_length=lengthbak;  
  //send_length=1;
  //SCITXBUF=senddata[0];
  FuncTab[1].status=0x5555;
  send_data(senddata_length);
}
void DingZhiCRC(void)
{
/* 定值自检,出错后重新从EEPROM中读取定值并重复自检,
反复多次后仍自检出错,发定值出错报文,并闭锁保护
 */	
 int i;     
 for (i=0;i<30;i++)
   {
    if (DingZhiP[i]!=DingZhi[i])
      {
       DingZhiError_flag=1;
      }           
   } 
}
interrupt void  nothing(void) 
{   
    return;
}

interrupt void sample_int(void) 
{
     
    if (PIVR==0x27)
    {
      asm(" clrc SXM"); 
      
      millisecond_js++;  
      if(millisecond_js>=120)  
      {                         
        millisecond_js=0;      //S0E毫秒位
      } 
       *(int *)0x742F=0x0080; 
       SAMPLE_ASM();
       
    } 
 
    asm(" clrc INTM");    
    IMR=0x0016; 
}

interrupt void baohuchuli_int(void) 
{// 保护处理中断 
   unsigned int Yaoxinb_flag,i,k;  
   unsigned int one,YX_Flag1,YX_Flag2;
   
 
   if (PIVR==0x2b)
    {
      IMR = 0x0003;
      EVAIFRB = 0x0001; 
     
      //开关量采集和遥信数组组装 
      YX_Flag1=PBDATDIR&0x0001;
      if (YX_Flag1==0x01)
      {
         YaoXin0 = ( YaoXin0 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin0 = YaoXin0 << 1;
      }
     
      if (YaoXin0==0xffff)
      {
      	YaoXin[0]=0x0001;
      }
      if (YaoXin0==0x0000)
      {
      	YaoXin[0]=0x0000;
      }
      
      YX_Flag1=(PBDATDIR&0x0002)>>1;
      if (YX_Flag1==0x01)
      {
         YaoXin1 = ( YaoXin1 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin1 = YaoXin1 << 1;
      }
      
      if (YaoXin1==0xffff)
      {
      	YaoXin[1]=0x0001;
      }
      if (YaoXin1==0x0000)
      {
      	YaoXin[1]=0x0000;
      }
      
      
      YX_Flag1=(PBDATDIR&0x0004)>>2;
      if (YX_Flag1==0x01)
      {
         YaoXin2 = ( YaoXin2 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin2 = YaoXin2 << 1;
      }
      if (YaoXin2==0xffff)
      {
      	YaoXin[2]=0x0001;
      }
      if (YaoXin2==0x0000)
      {
      	YaoXin[2]=0x0000;
      }
      
      YX_Flag1=(PBDATDIR&0x0008)>>3;
      if (YX_Flag1==0x01)
      {
         YaoXin3 = ( YaoXin3 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin3 = YaoXin3 << 1;
      }
      
      if (YaoXin3==0xffff)
      {
      	YaoXin[3]=0x0001;
      }
      if (YaoXin3==0x0000)
      {
      	YaoXin[3]=0x0000;
      } 
      
      YX_Flag1=(PBDATDIR&0x0010)>>4;
      if (YX_Flag1==0x01)
      {
         YaoXin4 = ( YaoXin1 << 4 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin4 = YaoXin4 << 1;
      } 
         
      if (YaoXin4==0xffff)
      {
      	YaoXin[4]=0x0001;
      }
      if (YaoXin4==0x0000)
      {
      	YaoXin[4]=0x0000;
      } 
      
      YX_Flag1=(PBDATDIR&0x0020)>>5;
      if (YX_Flag1==0x01)
      {
         YaoXin5 = ( YaoXin5 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin5 = YaoXin5 << 1;
      }
      
      if (YaoXin5==0xffff)
      {
      	YaoXin[5]=0x0001;
      }
      if (YaoXin5==0x0000)
      {
      	YaoXin[5]=0x0000;
      }
      
      YX_Flag1=(PBDATDIR&0x0040)>>6;
      if (YX_Flag1==0x01)
      {
         YaoXin6 = ( YaoXin6 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin6 = YaoXin6 << 1;
      }  
            
      if (YaoXin6==0xffff)
      {
      	YaoXin[6]=0x0001;
      }
      if (YaoXin6==0x0000)
      {
      	YaoXin[6]=0x0000;
      } 
      
      YX_Flag1=(PBDATDIR&0x0080)>>7;
      if (YX_Flag1==0x01)
      {
         YaoXin7 = ( YaoXin7 << 1 ) + 1;  	/*低位添1*/
      }
      else
      {
         YaoXin7 = YaoXin7 << 1;
      }
      
      if (YaoXin7==0xffff)
      {
      	YaoXin[7]=0x0001;
      }
      if (YaoXin7==0x0000)
      {
      	YaoXin[7]=0x0000;
      } 


      DiShiQi_1S++;
      if (DiShiQi_1S>=20)
      {
      	DiShiQi_1S=21;
        
        for (k=0;k<8;k++)
        {
      	 if (YaoXin[k]!=YaoXinp[k])
      	 {
      	  ADC=1;  
      	  soe_no++;     	  
      	  soe_xuhao[soe_no]=0x0081+k;
          soe_value[soe_no]=YaoXin[k];
          soe_millisecond[soe_no]=millisecond_get;	
          soe_second[soe_no]=second_get; 
          soe_minute[soe_no]=minute_get;
          soe_hour[soe_no]=hour_get;
          soe_day[soe_no]=day_get;
          soe_month[soe_no]=month_get;
          soe_year[soe_no]=year_get;                           
          if (soe_no>16) soe_no=0;          
      	 }      	 
      	 YaoXinp[k]=YaoXin[k];
        } 
       }
             
       //////////////////////////////////////////////////////////   
      if (CPUreset_flag==0x5555)            
        {
         WDKEY=0x55;
         WDKEY=0xaa;
        }
      
      Fzhzold1=Fzhzold2;
      if ((Fzhz==Fzhzold1)&&(Fzhzold1==Fzhzold2))
      {
           Fzhztimer++;
      } 
      else
      {
           Fzhztimer=0;
      }
      Fzhzold2=Fzhz;
      if ((Fzhztimer>=5)&&(UamVal<400)&&(UbmVal<400)&&(UcmVal<400))
      {
          Fzhz=0;
      }          
      //继电器动作脉宽
      if (JDQ_DONGZUO_flag==0xaaaa)   
         {
          MaiKuantimer++;             
         }
      if (JDQqudou_flag==0xaaaa)
         {
          JDQqudou_timer++;
         }        
                                        
      if (acc>=25)//三个周波后保护才启动
       {
        baohu_flag=1;
        acc=25;
       }
      else
       {
       	acc++;
       }  
     if (JS_counter>0)//通讯接收间隔计数器
       {
       	JS_counter--;
       }
     else 
       {
       	dataIndex=0;       	
       }
       
     //if(DSPRUN_FLAG<30)//运行灯      
     //    {
     //     PEDATDIR=PEDATDIR&0xFF7F;
     //    }
      //else if(DSPRUN_FLAG>60) 
      //   {
      //    PEDATDIR=PEDATDIR|0x0080;
      //   }
      //if(DSPRUN_FLAG>90) DSPRUN_FLAG=0; 
      //else DSPRUN_FLAG++;      
      YouXiaoZhiJS();   //有效值计算
      
      if (((IamVal>=XDLYXQDDingZhi2)||(IbmVal>=XDLYXQDDingZhi2)||(IcmVal>=XDLYXQDDingZhi2))&&(DingZhiError_flag==0))     
      {
         qdb=1;
         BaohuSuanFaLJ();
      }
      else if (((IamVal<XDLYXQDDingZhi2)&&(IbmVal<XDLYXQDDingZhi2)&&(IcmVal<XDLYXQDDingZhi2))||(DingZhiError_flag==1))
      {
         qdb=0;
         SdQiDong_flag=0;
         YSdQiDong_flag=0;
         DSdQiDong_flag=0;
         fsxQD_flag=0;
         fsx_flag=0;
      }
      BaoHuChuKouLJ();
  }   
 IMR = 0x0016;     
}

interrupt void Sci_RX_int(void)   /*SPI SCI*/ 
{
  int i,j,st;
  unsigned int check=0xff;
  
  switch (PIVR)
    { 
      case 0x06: /*通讯处理程序*/
        {
         IMR = 0x0006;          	
         JS_counter=20;//接收间隔计数器
         if((flag_485==_COMPLETE)&&((SCIRXST&0x40)==0x40))
           {
            receive_datap[dataIndex]=SCIRXBUF;
            dataIndex++;            
           }
         if((flag_485==_REQUIRE)&&((SCIRXST&0x40)==0x40)) 
           {
            flag_485=_COMPLETE;
            dataIndex=0;
            receive_datap[dataIndex]=SCIRXBUF;
           }
         if((receive_datap[0]!=0x10)&&(receive_datap[0]!=0x68))
           {
             flag_485=_COMPLETE;
             dataIndex=0; 
             //SCICTL1=0X13;
             //SCICTL1=0X23;
           }
         if (receive_datap[0]==0x10)
           {            
            if (dataIndex>=5)
              {
               check=receive_datap[1]+receive_datap[2];
               check=check&0x00ff;
               if((ADDR==receive_datap[2])&&(receive_datap[4]==0x16)&&(receive_datap[3]==check))
                 {
                  flag_485==_REQUIRE;
                  for(j=0;j<5;j++)
                    {
                     receive_data[j]=receive_datap[j];//临时接收缓冲转入正式缓冲
                    }
                  FuncTab[6].status=0xaaaa;                  
                  dataIndex=0;
                 }
               else
                {
                 flag_485=_COMPLETE;
                 dataIndex=0; 
                }              	
              }
           }
         else 
           {
            if(receive_datap[0]==0x68)
             {
              if(dataIndex>=6)
              {
                if((ADDR==receive_datap[5])&&(receive_datap[1]==receive_datap[2]))
                 {
                  len=receive_datap[1]+6;
                  if((len < dataIndex)||(len == dataIndex))
                     {
                      check=0;
                      for(i=4;i<receive_datap[1]+4;i++)
                        {
                         check+=receive_datap[i];
                         check=check&0x00ff;
                        }
                      if ((receive_datap[len-1]==0x16)&&(receive_datap[len-2]==check))
                        {
                          flag_485==_REQUIRE;
                          for(j=0;j<len;j++)
                           {
                            receive_data[j]=receive_datap[j];//临时接收缓冲转入正式缓冲
                           }
              	          FuncTab[6].status=0xaaaa;               	          
              	          len=0;
              	          dataIndex=0;
              	         }
              	      else
              	        {
              	          flag_485=_COMPLETE;
              	          len=0;
                          dataIndex=0; 
              	        }              	        	
                     }        
                  }              
                else
                  {
                   flag_485=_COMPLETE;
                   dataIndex=0; 
                  }              	

⌨️ 快捷键说明

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