plc51x.c

来自「PLC源代码」· C语言 代码 · 共 621 行 · 第 1/3 页

C
621
字号
void reset_IO(void)             // I,O口初始化
{ P0M0  = 0x00;
  P0M1  = 0xff;
  P0    = 0x00;
  P1    = 0xff;
  P2    = 0xff;
  P3    = 0xff;
  Value = 0;          // 变频显示器LED显示缓冲区
  Va0   = 0;          // 变频显示器F/R指示显示缓冲区
  Va1   = 0;          // 变频显示器 Hz指示显示缓冲区
  Va2   = 0;          // 变频显示器 V 指示显示缓冲区
  Va3   = 0;          // 变频显示器 A 指示显示缓冲区 
  Va4   = 0;          // 变频显示器RUN指示显示缓冲区 
  Vb0   = 0;          // 变频显示器LED个位小数点显示缓冲区
  Vb1   = 0;          // 变频显示器LED十位小数点显示缓冲区
  Vb2   = 0;          // 变频显示器LED百位小数点显示缓冲区
  Vb3   = 0;          // 变频显示器LED千位小数点显示缓冲区
  Vc0   = 0;          // 变频显示器LED个位数熄灭标志
  Vc1   = 0;          // 变频显示器LED十位数熄灭标志
  Vc2   = 0;          // 变频显示器LED百位数熄灭标志
  Vc3   = 0;          // 变频显示器LED千位数熄灭标志
}

void reset_M8xxx(void)             // RUN 后输出一个扫描周期初始化
{ rM8xxx[0].BYTE = 0x09;
}

void reset_RAM(void)
{ unsigned char i;
  for (i=0; i<_T_num;  i++)  { _T[i][0] = 0; }
  for (i=0; i<_T_num;  i++)  { _T[i][1] = 0x7fff; }
  for (i=0; i<_C_num;  i++)  { _C[i]    = 0; }
  for (i=0; i<_T_BYTE; i++)  { rT[i].BYTE = 0; rT1[i].BYTE = 0; rTF[i].BYTE = 0; }
  for (i=0; i<_C_BYTE; i++)  { rC[i].BYTE = 0; rT1[i].BYTE = 0; rCF[i].BYTE = 0; }
  for (i=0; i<_Y_BYTE; i++)  { rY[i].BYTE = 0; rY1[i].BYTE = 0; }
  for (i=0; i<_M_BYTE; i++)  { rM[i].BYTE = 0; rM1[i].BYTE = 0; }
  for (i=0; i<_S_BYTE; i++)  { rS[i].BYTE = 0; rS1[i].BYTE = 0; }
  for (i=0; i<_M8xxx_BYTE; i++) { rM8xxx[i].BYTE = 0; rM8xxx1[i].BYTE = 0; }
  rM8xxx[0].BYTE  = 0x05;
  rM8xxx1[0].BYTE = 0x05;
  Timer_5ms     = 0;           // 5ms时基计数器,5ms Timer0中断计数
  Timer_10ms    = 0;           // 10ms时基计数器,5ms Timer0中断计数
  Timer_100ms   = 0;           // 100ms时基计数器,5ms Timer0中断计数
  Pulse_val_Sec = 0;           // 1s时基计数器
  Pulse_val_Min = 0;           // 1min时基计数器
  CODE_ERROR    = 0;
  input_IO(); 
  for (i=0; i<_X_BYTE; i++) { rX1[i].BYTE = rX[i].BYTE; }
}

void reset_interrupt(void)
{ IP   = 0x00;
  IE   = 0x00;
  TCON = 0x00;		         // 定时器控制寄存器, 注意:TCON只需操作一次
  TMOD = 0x01;
  T0  = Value_T0_cons;       // 装入5ms Timer0中断常数
  PT0 = 1;
  ET0 = 1;
  TR0 = 1;
}

void mov_to_old(void)
{ unsigned char i;
  for (i=0; i<_X_BYTE; i++) { rX1[i].BYTE = rX[i].BYTE; }
  for (i=0; i<_Y_BYTE; i++) { rY1[i].BYTE = rY[i].BYTE; }
  for (i=0; i<_M_BYTE; i++) { rM1[i].BYTE = rM[i].BYTE; }
  for (i=0; i<_S_BYTE; i++) { rS1[i].BYTE = rS[i].BYTE; }
  for (i=0; i<_T_BYTE; i++) { rT1[i].BYTE = rT[i].BYTE; }
  for (i=0; i<_C_BYTE; i++) { rC1[i].BYTE = rC[i].BYTE; }
  for (i=0; i<_M8xxx_BYTE; i++) { rM8xxx1[i].BYTE = rM8xxx[i].BYTE; }
  for (i=0; i<_T_num; i++ )
    { if (_T[i][0] >= _T[i][1])
	  	{ rT[((&_T[i][0]-&_T[0][0])/2)/8].BYTE |= 1<<(((&_T[i][0]-&_T[0][0])/2)%8); 
		} 
	  else { rT[((&_T[i][0]-&_T[0][0])/2)/8].BYTE &= ~(1 << (((&_T[i][0]-&_T[0][0])/2)%8));
		   }  
    }
  PS1_BIT = PS_BIT;
}

//-------------------------------------------------------------------------------------//
//  延迟 函数  delay_ms(unsigned int time)                                             //
//-------------------------------------------------------------------------------------//

void delay_ms(unsigned int time)
{
	volatile unsigned int i;
	volatile unsigned char j;
	for (i=0; i<time; i++)
	  {	for(j=0;j<0xfe;j++);
		for(j=0;j<0xfe;j++);
	  }
}

//-------------------------------------------------------------------------------------//
//   串口初始化 函数  UartInit();                                                      //
//-------------------------------------------------------------------------------------//

void UartInit(void)
{
	SCON  = 0x50;
	//PCON |= 0x80;
	//AUXR2|= 0x40;
	//Timer1Init();
	TR1=0;				//停止定时器
//	TCON=0x00;			//定时器控制寄存器 注意:TCON只需操作一次
	TMOD |= 0x20;		//定时器1
	TL1 = -(SYSCLK/12/32/baud);//0xfa;	// -(SYSCLK/12/32/baud);	//注意波特率加倍位
   	TH1 = TL1;
	TR1=1;				//启动定时器1
//	ET1=1;				//打开定时器1中断
	UartReceiveCounter=0;
	UartRxTimerStartFlag=0;
}

//-------------------------------------------------------------------------------------//
//   PLC 入口 函数  main_PLC();                                                        //
//-------------------------------------------------------------------------------------//

void main_PLC (void)
{
  CODE_p = (unsigned char code *)CODE_START;
  Pi = 0x01;
  do{
      orderL = *CODE_p;
	  CODE_p++;
      orderH = *CODE_p;
	  CODE_p++;
      ppp = order & 0xfff;
      (*key_list[orderH >> 4])();
    } while((CODE_p < CODE_END) && (CODE_p != CODE_START));
}

//-------------------------------------------------------------------------------------//
//  主程序入口 主函数                                                                  //
//-------------------------------------------------------------------------------------//

void main(void)
{ unsigned char reset_i=1;
  unsigned int i;
  unsigned char PLCType=0x01;
  unsigned char PLCTypeArray[PLCTypeArrayLen]="FX1N PLC";	//	PLC类型标识;最长19个字节
  unsigned char code ArrFirstused[]="First used!\0";
  unsigned char code ArrPass[]="PASS!\0";
  reset_IO();
  reset_RAM();
  reset_interrupt();
  UartInit();
  EA = 1;
  PLCType=IAPFlashReadMode(PLCTypeAddr);		//	上电,核实 PLC 硬件版本号
  if(PLCType!=0)								//	第一次使用. IAP -- "FX1N PLC\r\n".
	{ ErasurePLC(ErasureALL);					//	全部擦除	初始PLC程序为空
	  IAPFlashProgremMode(PLCTypeAddr,0);		//	更新硬件版本号标识符标志
	  for(i=0;i<PLCTypeArrayLen;i++)			//	更新硬件版本号
		{ IAPFlashProgremMode(PLCTypeAddr+1+i,PLCTypeArray[i]);
		}
	  for(i=0;i<46;i++)						//	写入PLC初始化代码			查询地址0x8000. 0x802e.
		{ IAPFlashProgremMode(0x8000+i,OrderSend3[i]);
		  IAPFlashProgremMode(0x802e+i,OrderSend4[i]);
		}
	  UartSendString(ArrFirstused);
	}
  else UartSendString(ArrPass);
  for(i=0;i<PLCTypeArrayLen;i++)
	{ PLCTypeArray[i]=IAPFlashReadMode(PLCTypeAddr+1+i);
	}
  UartSendByte(PLCTypeArray,PLCTypeArrayLen);
  UartSendString("\r\n");
  Value=0;
  while (((P1 & 0x03) == 0) && (RUN == 0)) 
    { FX1NProcessing();						//	PLC下载通信处理
		if ((P1 & 0x03) != 0)	 
		  { delay_ms(20);
		  	if ((P1 & 0x03) != 0)
		      { RUN = 1;
			    IFMT  = 0;	      // 
			    ISPCR = 0x20;	  // SWBS  = 0; 选择AP空间, SWRST = 1; 软复位
				while (1) { ; }
			  }
		  }
    }
  CODE_scan();
  while (1)
    { input_IO();
	  if (CODE_ERROR == 0)
        { main_PLC();
		}
	  else 
	    { if (Pulse_Sec != 0)
		    { P1 &= 0xfc;	     // PLC 程序出错报警,X0,X1灯闪烁。
			}
		  else
		    { P1 |= 0x03;
			}
		}
      _T100mS();
	  _T1Set();
      mov_to_old();
	  if (reset_i != 0) 
        { reset_i--; reset_M8xxx(); 
		}
    }
}

//-------- main  END ----------//

⌨️ 快捷键说明

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