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 + -
显示快捷键?