📄 controlboard.c
字号:
if(_inFlashBusy)
{ //为1无效,复位FlashCount
FlashCount[channel]=0;
}
else
{ //为0有效,进行计数和判断
if( ++FlashCount[channel]>40)
{ //40次,合100ms
++FlashState[channel];
FlashCount[channel]=0;
}
}
break;
}
case 1: //等待_inFlashBusy无效 且_inFlashEnd有效
{
if( _inFlashBusy && (!_inFlashEnd) )
{
if(++FlashCount[channel]>20)
{ //_inFlashBusy 连续50ms无效不忙
++FlashState[channel];
FlashCount[channel]=0;
}
}
else
{
FlashCount[channel]=0;
}
break;
}
case 2: //读_inFlashErr1和_inFlashErr2
{
uchar tmp=0x00;
if(_inFlashErr1) tmp|=0x01;
if(_inFlashErr2) tmp|=0x10;
tmp<<=channel;
if( _inFlashBusy && (!_inFlashEnd) && ((FlashResult&(0x11<<channel))==tmp) )
{
if(++FlashCount[channel]>20)
{ //连续50ms状态确定,FLASH编程结束
++FlashState[channel];
FlashCount[channel]=0;
}
}
else
{
//状态不确定
FlashCount[channel]=0;
FlashResult&=(~(0x11<<channel)); //复位此通道状态位
FlashResult|=tmp; //保存新状态位
}
break;
}
case 3:
{
//给出本通道MPPC低有效复位信号前沿
uchar tmp1=( ~(0x02 << (2*channel)) );
P0&=tmp1; //P01、P03、P05、P07分别为第1、2、3、4通道的复位口线
++FlashState[channel];
FlashCount[channel]=0;
//同时认为FRAM/RTC结束
MppcEnd|=(0x10<<channel);
break;
}
case 4: //此阶段,本通道MPPC处于复位状态
{
if(++FlashCount[channel]>40) //40*2.5ms=100ms
{
//复位已有100ms,给出后沿
uchar tmp1=(0x02 << (2*channel) );
P0|=tmp1; //P01、P03、P05、P07分别为第1、2、3、4通道的复位口线
MppcEnd|=(0x01<<channel); //FLASH写入已完成
}
break;
}
default:
{
//给出本通道MPPC低有效复位信号前沿
uchar tmp1=( ~(0x02 << (2*channel)) );
P0&=tmp1; //P01、P03、P05、P07分别为第1、2、3、4通道的复位口线
FlashState[channel]=4;
FlashCount[channel]=0;
FlashResult&=(~(0x11<<channel));
//同时认为FRAM/RTC结束
MppcEnd|=(0x10<<channel);
break;
}
}
}
}
if(MppcEnd==0xFF) break; //此条件退出为完全正常结束
} //此处退出为超时
if(MppcEnd!=0xFF) //判断是否有非正常退出
{ //有非正常退出
uchar tmp=40;
//给出复位低有效前沿
if( (MppcEnd&0x11) != 0x11) P0&=0xFD; //第一通道非正常结束
if( (MppcEnd&0x22) != 0x22) P0&=0xF7; //第二通道非正常结束
if( (MppcEnd&0x44) != 0x44) P0&=0xDF; //第三通道非正常结束
if( (MppcEnd&0x88) != 0x88) P0&=0x7F; //第四通道非正常结束
//保持100ms
do
{
while(!w25msf);
w25msf=0;
}while(--tmp);
//给出后沿
P0|=0xAA;
}
}
//将结果发送缓冲区
SendBuffer[1]=(((FlashResult&0x11)==0x11)?'1':'0');
SendBuffer[2]=((FramRtcResult&0x01)?'1':'0');
SendBuffer[3]=((FramRtcResult&0x10)?'1':'0');
SendBuffer[4]=(((FlashResult&0x22)==0x22)?'1':'0');
SendBuffer[5]=((FramRtcResult&0x02)?'1':'0');
SendBuffer[6]=((FramRtcResult&0x20)?'1':'0');
SendBuffer[7]=(((FlashResult&0x44)==0x44)?'1':'0');
SendBuffer[8]=((FramRtcResult&0x04)?'1':'0');
SendBuffer[9]=((FramRtcResult&0x40)?'1':'0');
SendBuffer[10]=(((FlashResult&0x88)==0x88)?'1':'0');
SendBuffer[11]=((FramRtcResult&0x08)?'1':'0');
SendBuffer[12]=((FramRtcResult&0x80)?'1':'0');
}
//******************************************************************************
//******************************************************************************
void Init()
{
uchar i,j;
//中断配置:本系统仅使用串口中断(高优先级)和定时中断0(低优先级),
//BIT 7 6 5 4 3 2 1 0
//IE: EA – ET2 ES ET1 EX1 ET0 EX0
// 0 0 0 1 0 0 1 0
IE=0x12;
IP=0x10;
//delay some time for stable
for(i=0;i<200;i++) for(j=0;j<250;j++);
//I/O端口初始化
P0=0xFF; //P0为给MPPC的/RESET和/REQ信号,正常状态无效置高
P1=0xFF; //P1为从MPPC输入经过74HC244缓冲的的输入信号,要求置高才能读
P2=0xFF; //P20,P21为给译码器74HC139地址信号A0和A1,其它未用置高
P3=0xFF; //P30,P31分别为串口信号RXD和TXD,
//设定串口模式为:8位波特率可鹿编程单机模式,即模式1,置接收使能
SCON=0x50;
//T0用作2.5mm定时器,T1用作9600bps的波特率发生器
TMOD=0x21; //T1为8位自动重载,T0为16位软件重载定时
TH0=0xF7; //2.5ms=0.0025=Tosc*12*(0x10000-T0)==>T0=0x10000-0.0025*Fosc/12=0xF700
TL0=0x00;
PCON=0x00; //SMOD=0
TH1=TL1=0xFD; //TH1=256-Fosc/{[2^(1-SMOD)]*16*12*9600bps}=0xFD
TCON=0x50; //0101 0000 (TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0)
//定时器2未用,设为缺省值
T2CON=T2MOD=0x00;
RCAP2L=RCAP2H=0x00;
TL2=TH2=0x00;
EA=1;
}
//******************************************************************************
//******************************************************************************
void Recieve()interrupt 4 using 3 //command recieve
//0xA5,0x5A,len,msg,cs
{
static uchar len,i; //定义len和i为静态存贮变量,即在程序运行期间,固定分配物理空间。
static uchar CheckSum;
if(RI&&(MsgOk!=0x55))
{
switch(Rs232State)
{
case 0:
{
if(SBUF==0xA5)
{
++Rs232State;
Rs232Timer=20; //设定超时值100ms*20=2S!
}
break;
}
case 1:
{
if(SBUF==0x5A) ++Rs232State;
else Rs232State=0;
break;
}
case 2:
{
len=SBUF;
if( (len==1) || (len==2) )
{
++Rs232State;
CheckSum=0;
i=0;
}
else Rs232State=0;
break;
}
case 3:
{
ReceiveBuffer[i]=SBUF;
CheckSum+=ReceiveBuffer[i];
if(++i==len) Rs232State=4;
break;
}
case 4:
{
uchar tmp=SBUF;
if(CheckSum==tmp) MsgOk=0x55;
Rs232State=0;
break;
}
default:Rs232State=0;break;
}
}
RI=TI=0;
}
//******************************************************************************
//******************************************************************************
void Timer0(void)interrupt 1 using 2
//2.5ms一次中断
{
static uchar i=40; //定义j和i为静态存贮变量,即在程序运行期间,固定分配物理空间。而不是需要才分配。
static uchar j=10;
TR0=0;TH0=0xf7;TL0=0x00;TR0=1;
w25msf=1;
if(Timer2500us) Timer2500us--;
if(--i==0)
{
i=40;
if(Timer100ms) Timer100ms--;
if(Rs232Timer) Rs232Timer--;
if(Rs232Timer==0) Rs232State=0;
if(--j==0)
{
j=10;
if(Timer1s) Timer1s--;
}
}
}
//******************************************************************************
//******************************************************************************
void main()
{
Init();
while(1)
{
if(MsgOk==0x55)
{ //收到PC机命令
switch(ReceiveBuffer[0])
{
case 0xA0: //收到启动命令消息
{
//将电表切换至5V电源
_outEn9V=HIGH;
_outEn5V=LOW;
//给PC机确认应答消息
SendBuffer[0]=0x01;
Send(1);
//操作MPPC
// ResetMppc();
// StartAndCheckMppc();
//将电表切换至9V电源
_outEn5V=HIGH;
_outEn9V=LOW;
//复位电表
/*
{
uchar tmp;
//切换电源后稳定100ms
tmp=40;
do
{
while(!w25msf);w25msf=0;
}while(--tmp);
//给出PCB复位前沿
_outRstPcb=LOW;
//保持复位状态100ms
tmp=40;
do
{
while(!w25msf);w25msf=0;
}while(--tmp);
//给出PCB复位后沿
_outRstPcb=HIGH;
//复位后等待500ms,以便电表进入正常运行状态
tmp=200;
do
{
while(!w25msf);w25msf=0; //2.5ms delay
}while(--tmp);
} */
//将MPPC结果传回给PC机
SendBuffer[0]=0x30;
Send(13);
break;
}
case 0xA1: //收到结束命令
{
//将电表5V电源、9V电源均关掉
_outEn9V=HIGH;
_outEn5V=HIGH;
SendBuffer[0]=0x31;
Send(1);
break;
}
default: //其它命令保留
{
break;
}
}
MsgOk=0x00;
}
}
}
//******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -