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

📄 controlboard.c

📁 C51单片机电表程序下载测试程序,用于电表的内部程序下载
💻 C
📖 第 1 页 / 共 2 页
字号:
              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 + -