📄 main.c
字号:
clr_watchdog(); //看门狗计数清零
if(SpecialFlag.TTUParamChangeFlag==1)
{
SpecialFlag.TTUParamChangeFlag = 0;
CommState.U0SEnd = 0;
clr_watchdog();
t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A0/1000;
KP_A0=(t>>4);
t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B0/1000;
KP_B0= (t>>4);
clr_watchdog();
t= (long)TTU_RunParam.KV_C * TTU_RunParam.KI_C0/1000;
KP_C0= t>>4;
t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A1/1000;
KP_A1 = t>>4;
clr_watchdog();
t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B1/1000;
KP_B1= t>>4;
t= (long) TTU_RunParam.KV_C * TTU_RunParam.KI_C1/1000;
KP_C1= t>>4;
clr_watchdog();
}
if(DeviceState.Minutef0==1)
{
DeviceState.Minutef0 = 0;
if( DisDelay == 5 )
{
DeviceState.DisPlay_Lcd = 0; DisDelay = 0;
}
else
{
DisDelay++;
}
}
if(DeviceState.TenSecf==1)
{
DeviceState.TenSecf=0;
if(DeviceState.DisPlay_Lcd == 0)
{
Display();
P1Counter ++;
if(P1Counter > menu[P2Counter-1])
{
P1Counter = 1;
P2Counter ++;
}
if(P2Counter > KEYMAX2)
{
P2Counter =1;
}
}
}
if(DeviceState.Secondf==1) //秒处理开始
{
RefreshTimer(); //1s 时钟更新
if((Count4 <= 22223)&&(Count4 >= 18181)) //在 45Hz 到 55Hz 之间
Freq = 100000000L/Count4; //计算频率
else
Freq = 5000;
BD_data.Frequence = Freq;
Temp = (Temp*3000)>>12; //温度测量
BD_data.IT = (Temp - 986)/3.55;
/* if(stDateTime.second == 28) // 计算 统计数据记录
GetStaticRecord();
*/
SpecialFlag.YCChangeFlag = 1;
if( stDateTime.second == 29) // 计算电压谐波
{
if(Ua_base>20)
BD_data.Ua1_n=1000*(unsigned long)Uan/Ua_base; //电压的谐波率
else
BD_data.Ua1_n=0;
if(Ub_base>20)
BD_data.Ub1_n=1000*(unsigned long)Ubn/Ub_base;
else
BD_data.Ub1_n=0;
if(Uc_base>20)
BD_data.Uc1_n=1000*(unsigned long)Ucn/Uc_base;
else
BD_data.Uc1_n=0;
if(Ia_base>10)
BD_data.Ia1_n=1000*(unsigned long)Ian/Ia_base; //电流的谐波率
else
BD_data.Ia1_n=0;
if(Ib_base>10)
BD_data.Ib1_n=1000*(unsigned long)Ibn/Ib_base;
else
BD_data.Ib1_n=0;
if(Ic_base>10)
BD_data.Ic1_n=1000*(unsigned long)Icn/Ic_base;
else
BD_data.Ic1_n=0;
}
DeviceState.Secondf=0;
if((P2IN & BIT3)== 0)
{
I0 = 0;
}
P2OUT ^= BIT3;
//液晶显示
if(DeviceState.DisPlay_Lcd == 1)
{
Display();
}
} //秒处理结束
if(DeviceState.doSaveHisdata) // 存储历史数据
{
DeviceState.doSaveHisdata = 0;
SavePower();
SaveHisData();
}
if(DeviceState.Cal_FFT) //计算常用电参量
{
//if(Uabc.Ua>POFFVALUE) TimerInitCap(); // TimerA :capture mode
CalPowerpara();
DeviceState.Cal_FFT=0;
GetMaxMinValue();
GetStaticRecord(); //11-05-16
GetYxIn() ; //内部遥信处理
}
// 数据不变化保护
if(Uaold == BD_data.Ua + BD_data.Ub + BD_data.Uc)
{
if(numconst) numconst--;
}
else
{
Uaold = BD_data.Ua + BD_data.Ub + BD_data.Uc;
numconst = 60000;
}
if(DeviceState.DoClearDay) //清当天的历史数据和统计数据
{
ClearDayData();
DeviceState.DoClearDay=0;
}
if(DeviceState.DoClearAll) //清所有天的历史数据和统计数据
{
ClearAllData();
DeviceState.DoClearAll=0;
}
//保存历史数据时间到
/*if(DeviceState.Hourf == 1)
{
SavePower();
SaveHisData();
DeviceState.Hourf=0;
}*/
//保存统计数据时间到
if((DeviceState.Datef==1)&&(stDateTime.second >= 58))
{
//ptr_1024=Get1024Page(stDateTime,1);
//WriteStaticsData(0xff);
DeviceState.Datef=0;
}
if(DeviceState.Timef)
{
GetPCF8563(2,InitTime,7); //读出时钟 ,每小时较时
TimerDataHandle(); //bcd code conversion
DeviceState.Timef=0;
}
if(DeviceState.NewData==1)
{
// ClearDayData(); //清当天的历史数据和统计数据
DeviceState.NewData=0;
}
//遥控操作
if(( YKoperate) && (YKselect ) )
{
DoOperate(YKObj);
YKselect=0;
}
if((delayoperate == 0) && YKoperate )
{
CloseOperate(YKObj);
YKoperate = 0;
EncodeVariableLenFrame(46,10,0,0); //遥控操作结束帧
nYKObject=0;
nYKQualifier=0;
}
//与主站通讯部分
//多帧发送的特殊处理
if(CommState.DoIniCom0)
{
CommState.DoIniCom0=0;
switch(TTU_RunParam.Bauds0)
{
case 1:t = 300; break;
case 2:t = 600; break;
case 3:t = 1200;break;
case 4:t = 2400;break;
case 5:t = 4800;break;
case 6:t = 9600;break;
default:t = 1200;break;
}
SetCOM0BT(t);
}
if(CommState.DoIniCom1)
{
CommState.DoIniCom1=0;
switch(TTU_RunParam.Bauds1)
{
case 1:t = 300; break;
case 2:t = 600; break;
case 3:t = 1200;break;
case 4:t = 2400;break;
case 5:t = 4800;break;
case 6:t = 9600;break;
default:t = 1200;break;
}
SetCOM1BT(t);
}
if((SpecialFlag.nIdleTime==0) && (CommState.TxWait==0) )
{
manyframe();
}
}
}
void DoOperate(BYTE nChannel)
{
if( (YKoperate & 0x3)!=2 ) return;
if(nChannel==1)
{
P3DIR |= BIT4 ; //输出
P3OUT &= ~BIT4;
}
if(nChannel==2)
{
P3DIR |= BIT5 ; //输出
P3OUT &= ~BIT5;
}
}
void CloseOperate(BYTE nChannel)
{
if(nChannel==1)
{
P3OUT |= BIT4;
P3DIR &= ~BIT4 ; //输入
}
if(nChannel==2)
{
P3OUT |= BIT5;
P3DIR &= ~BIT5 ; //输出
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
clr_watchdog(); //看门狗计数清零
Init();
clr_watchdog(); //看门狗计数清零
DeviceState.DisPlay_Lcd = 1;
_EINT();
ADC12CTL0 |= ADC12SC;
switch(TTU_RunParam.nIntervalOfSave) //历史数据存储模式:15分钟为1,30分钟为2,一个小时为4
{
case 15: HisCate = 1;break;
case 30: HisCate = 2;break;
default: HisCate = 4;break;
}
MainDo();
}
void manyframe() //多侦处理
{
//主站发总召唤 命令
if((SpecialFlag.CallAll_YCFlag==1) && (CommState.TxWait==0))
{
SpecialFlag.CallAll_YCFlag=0;
CommState.TxWait=1;
EncodeVariableLenFrame(21,20,8,0); //不带品质描述的遥测帧
}
if((SpecialFlag.CallAll_YXFlag == 1) && (CommState.TxWait==0))
{
SpecialFlag.CallAll_YXFlag = 0;
CommState.TxWait=1;
EncodeVariableLenFrame(1,20,8,0); //遥信帧
}
if((SpecialFlag.CallAll_EndFlag==1) && (CommState.TxWait==0) )
{
CommState.TxWait=1;
EncodeVariableLenFrame(100,0xA,8,20); //总召唤结束帧
SpecialFlag.CallAll_EndFlag = 0;
}
if((SpecialFlag.FileTxFlag==1) && (CommState.TxWait==0)) //err??
{
CommState.TxWait=1;
SpecialFlag.nSGCount++; //05-11-5
EncodeVariableLenFrame(125,13,8,0);
//05-11-5
if(SpecialFlag.nSGCount >= (32/HisCate-1))
{
SpecialFlag.FileTxFlag=0;
SpecialFlag.nSGCount=0;
SpecialFlag.F_LS_NA_F=1;
}
//05-11-5
if(SpecialFlag.DataType ==2)
{
if(SpecialFlag.nSGCount >=4)
{
SpecialFlag.FileTxFlag=0;
SpecialFlag.nSGCount=0;
SpecialFlag.F_LS_NA_F=1;
}
}
if(SpecialFlag.DataType ==3)
{
if(SpecialFlag.nSGCount >=1)
{
SpecialFlag.FileTxFlag=0;
SpecialFlag.nSGCount=0;
SpecialFlag.F_LS_NA_F=1;
}
}
}
if((SpecialFlag.F_LS_NA_F==1) && (CommState.TxWait==0))
{
SpecialFlag.F_LS_NA_F=0;
SpecialFlag.LSQ =4; //最后的节和段限定词 2-节,4-段
CommState.TxWait=1;
EncodeVariableLenFrame(123,13,0,0); //最后段或节确认帧
}
}
void TimerInitCap() //捕获
{
TACTL |= MC1 ; //连续计数模式
TACTL &= ~MC0;
CCTL0 |= CM1 + CAP ;
DeviceState.Capture = 1; //采完 32 点后转入捕获处理 twq
P1SEL |= BIT0;
CCTL0 |= CCIE; // CCR0 interrupt enabled
CapDelay=0;
}
void TimerInit1()
{
if((Count4 <= 22223)&&(Count4 >= 18181)) //在 45Hz 到 55Hz 之间
CCR0 = (Count4>>5);
else
CCR0=625;
TACTL |= MC0; //增计数模式
TACTL &= ~MC1 ;
CCTL0 &= ~CAP ;
P1SEL &= ~BIT0;
DeviceState.Capture = 0; //捕获完成 转入计数处理
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -