?? plc51x.c
字號(hào):
void reset_IO(void) // I,O口初始化
{ P0M0 = 0x00;
P0M1 = 0xff;
P0 = 0x00;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
Value = 0; // 變頻顯示器LED顯示緩沖區(qū)
Va0 = 0; // 變頻顯示器F/R指示顯示緩沖區(qū)
Va1 = 0; // 變頻顯示器 Hz指示顯示緩沖區(qū)
Va2 = 0; // 變頻顯示器 V 指示顯示緩沖區(qū)
Va3 = 0; // 變頻顯示器 A 指示顯示緩沖區(qū)
Va4 = 0; // 變頻顯示器RUN指示顯示緩沖區(qū)
Vb0 = 0; // 變頻顯示器LED個(gè)位小數(shù)點(diǎn)顯示緩沖區(qū)
Vb1 = 0; // 變頻顯示器LED十位小數(shù)點(diǎn)顯示緩沖區(qū)
Vb2 = 0; // 變頻顯示器LED百位小數(shù)點(diǎn)顯示緩沖區(qū)
Vb3 = 0; // 變頻顯示器LED千位小數(shù)點(diǎn)顯示緩沖區(qū)
Vc0 = 0; // 變頻顯示器LED個(gè)位數(shù)熄滅標(biāo)志
Vc1 = 0; // 變頻顯示器LED十位數(shù)熄滅標(biāo)志
Vc2 = 0; // 變頻顯示器LED百位數(shù)熄滅標(biāo)志
Vc3 = 0; // 變頻顯示器LED千位數(shù)熄滅標(biāo)志
}
void reset_M8xxx(void) // RUN 后輸出一個(gè)掃描周期初始化
{ 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時(shí)基計(jì)數(shù)器,5ms Timer0中斷計(jì)數(shù)
Timer_10ms = 0; // 10ms時(shí)基計(jì)數(shù)器,5ms Timer0中斷計(jì)數(shù)
Timer_100ms = 0; // 100ms時(shí)基計(jì)數(shù)器,5ms Timer0中斷計(jì)數(shù)
Pulse_val_Sec = 0; // 1s時(shí)基計(jì)數(shù)器
Pulse_val_Min = 0; // 1min時(shí)基計(jì)數(shù)器
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; // 定時(shí)器控制寄存器, 注意:TCON只需操作一次
TMOD = 0x01;
T0 = Value_T0_cons; // 裝入5ms Timer0中斷常數(shù)
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;
}
//-------------------------------------------------------------------------------------//
// 延遲 函數(shù) 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++);
}
}
//-------------------------------------------------------------------------------------//
// 串口初始化 函數(shù) UartInit(); //
//-------------------------------------------------------------------------------------//
void UartInit(void)
{
SCON = 0x50;
//PCON |= 0x80;
//AUXR2|= 0x40;
//Timer1Init();
TR1=0; //停止定時(shí)器
// TCON=0x00; //定時(shí)器控制寄存器 注意:TCON只需操作一次
TMOD |= 0x20; //定時(shí)器1
TL1 = -(SYSCLK/12/32/baud);//0xfa; // -(SYSCLK/12/32/baud); //注意波特率加倍位
TH1 = TL1;
TR1=1; //啟動(dòng)定時(shí)器1
// ET1=1; //打開定時(shí)器1中斷
UartReceiveCounter=0;
UartRxTimerStartFlag=0;
}
//-------------------------------------------------------------------------------------//
// PLC 入口 函數(shù) 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));
}
//-------------------------------------------------------------------------------------//
// 主程序入口 主函數(shù) //
//-------------------------------------------------------------------------------------//
void main(void)
{ unsigned char reset_i=1;
unsigned int i;
unsigned char PLCType=0x01;
unsigned char PLCTypeArray[PLCTypeArrayLen]="FX1N PLC"; // PLC類型標(biāo)識(shí);最長19個(gè)字節(jié)
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); // 上電,核實(shí) PLC 硬件版本號(hào)
if(PLCType!=0) // 第一次使用. IAP -- "FX1N PLC\r\n".
{ ErasurePLC(ErasureALL); // 全部擦除 初始PLC程序?yàn)榭? IAPFlashProgremMode(PLCTypeAddr,0); // 更新硬件版本號(hào)標(biāo)識(shí)符標(biāo)志
for(i=0;i<PLCTypeArrayLen;i++) // 更新硬件版本號(hào)
{ 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; 軟復(fù)位
while (1) { ; }
}
}
}
CODE_scan();
while (1)
{ input_IO();
if (CODE_ERROR == 0)
{ main_PLC();
}
else
{ if (Pulse_Sec != 0)
{ P1 &= 0xfc; // PLC 程序出錯(cuò)報(bào)警,X0,X1燈閃爍。
}
else
{ P1 |= 0x03;
}
}
_T100mS();
_T1Set();
mov_to_old();
if (reset_i != 0)
{ reset_i--; reset_M8xxx();
}
}
}
//-------- main END ----------//
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -