📄 hicj6.c.bak
字号:
TR0=0; //在发送或接收才开始使用
TF0=0;
TH0=(256-192); //4800bps 就是 1000000/4800=208.333微秒 执行的
//timer是 208.333*11.0592/12= 192
TL0=TH0;
TH1=0xfa; //9600-FD 4800-FA 2400-F4 1200-E8 300-A0
TL1=0xfa;
SCON=0x50;
T2CON = 0x04; //定时器2为16位自动重装,递增计数
T2MOD = 0x00;
TH2 = 0xdc;
TL2 = 0x00;
RCAP2H = 0xdc; //10ms定时
RCAP2L = 0x00; //11.0592M晶振,
//10000*11.0592/12=0x2400
ET2=1;
ET0=1;
// EX1=1;
ES=1;
TR1=1;
// ET1=1;
EA=1;
TI=0;
}
/**********************************************************
*名 称:InitDD
*功 能:电度口状态初始化
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void InitDD(void)
{
BYTE data i,j,P1_Tmp;
for (i=0;i<5;i++) //初始化电度状态 Hdd_New[10][5]
{
for(j=0;j<8;j++)
{
P1_Tmp=1<<(i+3);
P1_Tmp=~P1_Tmp&0xf8;
P1=P1_Tmp|A8_A10[j];
long_delay();
if(Hdd==0)
{
Hdd_Old[i]|=(1<<j);
}
else
{
Hdd_Old[i]&=~(1<<j);
}
}
Hdd_New_Bak[i]=Hdd_Old[i];
Hdd_Old_Bak[i]=Hdd_Old[i];
}
}
/**********************************************************
*名 称:Init
*功 能:初始化
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void Init()
{
BYTE data i;
/*
for(i=0;i<40;i++)
{
Hdd10s[i]=0;
RelayOffTimes[i]=0;
TrsOffCount[i]=0;
}
for(i=0;i<5;i++)
{
RelayOff[i]=0;
TrsRelayOff[i]=0;
Keep_Flag[i]=0;
// Change[i]=0;
Hdd_En[i]=Read1B(250+i,0);
Short_En[i]=Read1B(240+i,0);
Break_En[i]=Read1B(245+i,0);
}
*/
Sp_Flag=0;
Key_Count=0;
Key_New=Key_Old=Key;
Ac_Old=~Ac_Check;
Press_Count=250;
Rcv_Wp=0;
Rcv_Rp=0;
Run_Count=0;
HddEn_Count=1;
Ms10=0;
Hdd_Wp=0;
InitFram();
InitDD();
LedTest();
InitTimer();
}
/**********************************************************
*名 称:Hdd_Check
*功 能:电度采集处理
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void Hdd_Check(void)
{
BYTE i,j;
BYTE Hdd_Tmp[5];
// BYTE Constant_Range,Range;
for (i=0;i<5;i++)
{
/* if(Press_Count==101)
{
if(Short_New[i]^Short_Old[i]) Alarm_Check=1;
Short_Old[i]=Short_New[i];
}
*/
//Run=1;
Hdd_Tmp[i]=Hdd_New[Hdd_Rp][i]^Hdd_Old[i];
Hdd_Old[i]=Hdd_New[Hdd_Rp][i];
if(Hdd_Tmp[i]) //有变位
{
for(j=0;j<8;j++)
{
if(Hdd_Tmp[i]&(1<<j))
{
Keep_Count[i*8+j]=0;
Keep_Flag[i]|=(1<<j);
//Ac_Count[i*8+j]++;
}
}
}
else //无变位
{
if(Keep_Flag[i])
{
for(j=0;j<8;j++)
{
if(Keep_Flag[i]&(1<<j))
{
Keep_Count[i*8+j]++;
if(Keep_Count[i*8+j]>Smooth)
{
Keep_Count[i*8+j]=0;
Keep_Flag[i]&=~(1<<j);
Hdd_New_Bak[i]&=~(1<<j);
if (Hdd_New[Hdd_Rp][i]&(1<<j))
{
Hdd_New_Bak[i]|=(1<<j);
}
}
}
}
}
}
}
for(i=0;i<5;i++)
{
Hdd_Tmp[i]=Hdd_New_Bak[i]^Hdd_Old_Bak[i]&Hdd_New_Bak[i];
Hdd_Old_Bak[i]=Hdd_New_Bak[i];
if(Hdd_Tmp[i])
{
for(j=0;j<8;j++)
{
if(Hdd_Tmp[i]&(1<<j))
{
//Change[i]|=1<<j;
HddVal[i*8+j]++;
/*
Constant_Range=Read1B(120+i*8+j,1);
switch (Constant_Range)
{
case (0x26):
Range=0;
break;
case (0x36):
Range=1;
break;
case (0x56):
Range=2;
break;
case (0x76):
Range=3;
break;
default:
Range=0;
break;
}
Full.Full_L=Full_Val[Range];
Full.Full_L=320000000;
Read_Hdd(i*8+j);
Hdd_Str.Hdd_L++;
Hdd10s[i*8+j]++;
if(Hdd_Str.Hdd_L>Full.Full_L)
{
Hdd_Str.Hdd_L=0;
}
Write_Hdd(i*8+j);
Pulse++;
if(Pulse%2)
write7279(SEGON,0x33,1);
else
write7279(SEGOFF,0x33,1);
if(Press_Count<100) Key_Press=1;
*/
}
}
}
}
// Run=0;
Hdd_Rp++;
if(Hdd_Rp==20) Hdd_Rp=0;
}
/**********************************************************
*名 称:Bat_Check
*功 能:电池剩余电量显示
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void Bat_Check(void)
{
BYTE data i,Battery;
//Ac_Check=1;
Ac_New=Ac_Check;
Ac_Tmp=Ac_New^Ac_Old;
Ac_Old=Ac_New;
//if (Ac_Tmp)
{
if(Ac_New)
{
write7279(UNDECODE+4,0,1); // DIG(7+4)=11 Battery Red
write7279(UNDECODE+5,Bat_Val[4],1); // DIG(7+5)=12 Battery Green
}
else
{
Cs_Bat=0;
P1=0;
short_delay();
Bat_New=Bat_Old=Bat;
if(Bat_New){Battery=Bat_Val[0]; }
else{Battery=Bat_Val[4];}
for(i=0;i<5;i++)
{
P1=i;
short_delay();
Bat_New=Bat;
Bat_Tmp=Bat_New^Bat_Old;
Bat_Old=Bat_New;
if(Bat_Tmp)
{
Battery=Bat_Val[i];
}
}
write7279(UNDECODE+5,0,1);
write7279(UNDECODE+4,Battery,1);
}
}
}
/**********************************************************
*名 称:Alarm_Pro
*功 能:短路、断线报价处理
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void Alarm_Pro(void)
{
BYTE i;
Alarm_Check=0;
Type=0;
Alarm=0;
Flash=0;
for(i=0;i<5;i++)
{
Short_Bak=Read1B(170+i,0);
Break_Bak=Read1B(175+i,0);
if((Short_New[i]|Short_Bak)&Short_En[i]&Hdd_En[i]) Alarm|=0x10;
if((Break_New[i]|Break_Bak)&Break_En[i]&Hdd_En[i]) Alarm|=0x20;
if(Short_New[i]&Short_En[i]) Flash|=1;
if(Break_New[i]&Break_En[i]) Flash|=2;
}
for(i=0;i<40;i++)
{
Type=Read1B(200+i,0);
if((Hdd_En[i%8]&(1<<(i%8))))
{
if(Type&0x01) Alarm|=0x04;
if(Type&0x02) Alarm|=0x02;
if(Type&0x04) Alarm|=0x01;
if(Type&0x08) Alarm|=0x80;
}
}
Alarm_Flag=1;
}
/**********************************************************
*名 称:TrsRelay
*功 能:通过口线模拟的串口给控制器发送合分指令
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
/*
void TrsRelay(BYTE YkNo,BYTE YkHf)
{
BYTE Check;
DIR2=0;
long_delay();
PSendChar(0xfe);
PSendChar(0xeb);
PSendChar(0x90);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x06); //Length
PSendChar(0x00); //0
PSendChar(0x37);//Function
PSendChar(Relay_Station);//Station L
PSendChar(0x00);//0 H
PSendChar(YkNo);
PSendChar(YkHf);
Check=YkNo+YkHf+0x37+Relay_Station;
PSendChar(Check);
DIR2=1;
}
*/
/**********************************************************
*名 称:main
*功 能:主程序
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void WriteHddPro(void)
{
if(HddVal[WriteOrder])
{
Hdd_Str.Hdd_L=Read_Hdd(WriteOrder);
Hdd_Str.Hdd_L+=HddVal[WriteOrder];
HddVal[WriteOrder]=0;
Write_Hdd(WriteOrder);
}
WriteOrder++;
if(WriteOrder==40) WriteOrder=0;
}
/**********************************************************
*名 称:main
*功 能:主程序
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
main()
{
BYTE data i,j,Tmp1,YkNo;
Init();
loop:
WriteHddPro();
if(Press_Count<3) Speaker=0;
if(Press_Count==3 || Press_Count==4) Speaker=1;
if(Time_Counter>50)
{
// TrsRelay(1,0xcc); //////
if((Start&0x80)==0x80) Run_Count=50;
else Run_Count=0;
Run=~Run;
//if(Run) TrsRelay(1,0x33);
// else TrsRelay(1,0xcc);
Time_Counter=0;
Bat_Check();
if(Flash&0x01)
{ if(Run)
write7279(SEGON,0x34,1);
else
write7279(SEGOFF,0x34,1);
}
if(Flash&0x02)
{ if(Run)
write7279(SEGON,0x35,1);
else
write7279(SEGOFF,0x35,1);
}
if (Press_Count<250 && Sp_Flag)
{
Speaker=Run;
}
}
// if(((Start&0x80)==0x80) && (Hdd_Rp!=Hdd_Wp))
if(Hdd_Rp!=Hdd_Wp)
Hdd_Check();
if (Key_Press==1) Disp_Pro();
if (Press_Count==250)
{
Press_Count=251;
send_byte(CMD_RESET,0); // 清除显示
send_byte(CMD_RESET,1);
P2_0=P2_2=1;
House=House_Max-1;
Speaker=1;
Alarm_Check=1;
}
if(Alarm_Check) Alarm_Pro();
Key_Pro();
if(Rcv_Flag)
{
Rcv_Pro();
}
if(Trs_Flag==1 && Trs_Wp==Trs_Rp)
{
Trs_Edit();
}
if(Rcv_Count>10) Rcv_Wp=0;
if(Key_Count>100)
{
Key_Count=0;
Speaker=0;
delay10ms(100);
for(i=0;i<5;i++)
{
Short_New[i]=0;
Write1B(0,170+i,0);
Break_New[i]=0;
Write1B(0,175+i,0);
}
Speaker=1;
Start=0x80;
Write1B(0x80,255,0);
Alarm_Flag=1;
}
//Key_Number=read7279(CMD_READ);
if(Alarm_Flag)
{
Alarm_Flag=0;
write7279(UNDECODE+6,Alarm,1);
}
if(HddEn_Count)
{
HddEn_Count=0;
HddEn_Count_Pro();
}
/*
if(Ms10>140)
{
Ms10=0;
for(i=0;i<40;i++)
{
Tmp1=Read1B(200+i,1);
if(Tmp1&0x80)
{
Tmp1&=0x7f;
if(Hdd10s[i]>Tmp1)
{
RelayOff[i/8]|=1<<(i%8);
}
Hdd10s[i]=0;
}
}
}
if(Trs_Counter>15)
{
Trs_Counter=0;
for(i=0;i<5;i++)
{
if(RelayOff[i])
{
for(j=0;j<8;j++)
{
Tmp1=1<<j;
if(RelayOff[i]&Tmp1)
{
RelayOff[i]&=~Tmp1;
YkNo=i*8+j+1;
//TrsRelay(YkNo,0x33);
TrsRelayOff[i]|=Tmp1;
RelayOffTimes[YkNo-1]++;
i=5;
break;
}
}
}
}
for(i=0;i<5;i++)
{
if(TrsRelayOff[i])
{
for(j=0;j<8;j++)
{
Tmp1=1<<j;
if(TrsRelayOff[i]&Tmp1)
{
if(TrsOffCount[i*8+j]>4225)
// if(RelayOffTimes[i*8+j]<6)
{
TrsOffCount[i*8+j]=0;
YkNo=i*8+j+1;
TrsRelayOff[i]&=~Tmp1;
TrsRelay(YkNo,0xcc);
i=5;
break;
}
}
}
}
}
} */
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -