|
楼主 |
发表于 2009-4-26 12:00:39
|
显示全部楼层
用2051制作的PLC(类PLC基于C语言,简易PLC基于FX1S)
(原文件名:图片_0~1.JPG)
部份代码
#include "intrins.h"
#include "STRING.H"
#include "ABSACC.H"
#include "text2.h"
typedef unsigned char byte;
typedef unsigned int word;
#define nop _nop_()
#define FOSC 12000000
#define BUOD 9600
#define T5ms_rec (word)(65536-((FOSC*5)/(12*1000)))
#define REC_LOADH (byte)(T5ms_rec/256)
#define REC_LOADL (byte)(T5ms_rec%256)
#define RECBUOD (256-(((FOSC)/BUOD/32)/1))
#define sofint_rst 0x30 /*软件复位*/
#define WDT_Tim 0x3b /*22118400*200/393216000*/
#define v ((unsigned char volatile pdata *) 0x000)
//2800-2fff 512*4=2048字节/4=512步
//内存区
#define D16 0x40 //
#define ram ((unsigned char volatile pdata *) 0x00)
#define T 0x00 //16bit 2byte t0-t15
#define X 0x08 //I
#define TRF 0x10 //16bit 2byte tr0-tr15
#define Y 0x18 //O
#define C 0x20 //128bit 2byte c0-c15
#define M8 0x28 //64bit 8byte M8000-M80063
#define CRF 0x30 //128bit 2byte cr0-cr15
#define M 0x40 //128bit 16byte dr6-dr727
#define FR 0x50 //128bit 16byte f0-f127
#define dram ((unsigned int volatile pdata *) 0x60)
/*
#define TV 0x60 //16 word 32byte tv0-tv15
#define TP 0x80 //16 word 32byte tp0-tp15
#define CV 0xA0 //16 word 32byte cv0-cv15
#define CP 0xC0 //16 word 32byte cp0-cp15
#define D 0xE0 //16 word 32byte d0-d15
*/
byte code ASC[]={"0123456789ABCDEF"};
byte code HEX[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,
0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
#define s ((unsigned char volatile idata *) 0x0b0)
sbit X0=P3^4; //ON 0
sbit X1=P3^5; //ON 0
sbit X2=P1^3; //ON 0
sbit X3=P1^2; //ON 0
sbit X4=P1^1; //ON 0
sbit X5=P1^0; //ON 0
sbit X10=P2^4; //bcd 1 ON 0
sbit X11=P2^5; //bcd 2 ON 0
sbit X12=P2^7; //bcd 4 ON 0
sbit X13=P2^6; //bcd 8 ON 0
sbit Y0=P1^4; //0 ON
sbit Y1=P1^5; //0 ON
sbit Y2=P1^6; //0 ON
sbit Y3=P1^7; //0 ON
sbit Y4=P2^0; //0 ON
sbit Y5=P2^1; //0 ON
sbit Y6=P2^2; //音乐播放 0 播放 1 停止
sbit run_lamp=P3^7;
/*****************公共运算区*********************/
byte bdata m8 _at_ 0x20;
sbit M8000=m8^0; //程序运行
sbit M8001=m8^1; //程序清除
sbit M8002=m8^2; //一扫描周期后ON
sbit M8003=m8^3; //程序运行
sbit M8004=m8^4; //等于标志(零标志)
sbit M8005=m8^5; //大于标志(进位标志)
sbit M8006=m8^6; //小于标志(借位标志)
sbit M8007=m8^7; //内核占用标志位
/**************位运算占用4个字节*****************/
byte bdata br1 _at_ 0x21; /***输入,输出,中间运算位结果***/
byte bdata br2 _at_ 0x22; /***堆栈使用***/
sbit b0=br1^0;
sbit b1=br1^1;
sbit b2=br1^2;
sbit b3=br1^3;
sbit b4=br1^4;
sbit b5=br1^5;
sbit b6=br1^6;
sbit b7=br1^7;
sbit b10=br2^0;
sbit b11=br2^1;
sbit b12=br2^2;
sbit b13=br2^3;
sbit b14=br2^4;
sbit b15=br2^5;
sbit b16=br2^6;
sbit b17=br2^7;
/******************8个字节位运算**************************/
byte bdata dr1 _at_ 0x23; //位运算占用字节
byte bdata dr2 _at_ 0x24; //位运算占用字节
sbit sb0=dr1^0;
sbit sb1=dr1^1;
sbit sb2=dr1^2;
sbit sb3=dr1^3;
sbit sb4=dr1^4;
sbit sb5=dr1^5;
sbit sb6=dr1^6;
sbit sb7=dr1^7;
sbit sb8=dr2^0;
sbit sb9=dr2^1;
sbit sb10=dr2^2;
sbit sb11=dr2^3;
sbit sb12=dr2^4;
sbit sb13=dr2^5;
sbit sb14=dr2^6;
sbit sb15=dr2^7;
/*******************************************************/
/******************6个字节运算**************************/
byte bdata dr3 _at_ 0x25; //内核占用字节
byte bdata dr4 _at_ 0x26; //内核占用字节
byte bdata dr5 _at_ 0x27; //内核占用字节
byte bdata dr6 _at_ 0x28; //内核占用字节
byte bdata dr7 _at_ 0x2a; //内核占用字节
byte bdata dr8 _at_ 0x3b; //内核占用字节
/********************************************************/
byte data T5MS _at_ 0x2c; //5MS基本时钟
byte data point _at_ 0x2d; //通讯数据存放指针
byte data OAB _at_ 0x2e; //块与块或计数用
byte data MPPD _at_ 0x2f; //堆栈计数 7
byte data PFSD _at_ 0x30; //上升下降沿堆栈计数占用 1BYTE 256点
/*****************4个字****************************/
word bdata wr1 _at_ 0x31; //运算占用字
sbit wrb0 = wr1^0;
sbit wrb1 = wr1^1;
sbit wrb2 = wr1^2;
sbit wrb3 = wr1^3;
sbit wrb4 = wr1^4;
sbit wrb5 = wr1^5;
sbit wrb6 = wr1^6;
sbit wrb7 = wr1^7;
sbit wrb8 = wr1^8;
sbit wrb9 = wr1^9;
sbit wrb10 = wr1^10;
sbit wrb11 = wr1^11;
sbit wrb12 = wr1^12;
sbit wrb13 = wr1^13;
sbit wrb14 = wr1^14;
sbit wrb15 = wr1^15;
word data wr2 _at_ 0x33; //运算占用字
word data T100MS _at_ 0x35; //0.1S时基
word data prog _at_ 0x37; //程序指针(0x2800_0x2fD0)
/***********************************************/
byte bdata dwHH _at_ 0x3c;
byte bdata dwH _at_ 0x3d;
byte bdata dwL _at_ 0x3e;
byte bdata dwLL _at_ 0x3f;
sbit dwb0 = dwLL^0;
sbit dwb1 = dwLL^1;
sbit dwb2 = dwLL^2;
sbit dwb3 = dwLL^3;
sbit dwb4 = dwLL^4;
sbit dwb5 = dwLL^5;
sbit dwb6 = dwLL^6;
sbit dwb7 = dwLL^7;
sbit dwb8 = dwL^0;
sbit dwb9 = dwL^1;
sbit dwb10 = dwL^2;
sbit dwb11 = dwL^3;
sbit dwb12 = dwL^4;
sbit dwb13 = dwL^5;
sbit dwb14 = dwL^6;
sbit dwb15 = dwL^7;
sbit dwb16 = dwH^0;
sbit dwb17 = dwH^1;
sbit dwb18 = dwH^2;
sbit dwb19 = dwH^3;
sbit dwb20 = dwH^4;
sbit dwb21 = dwH^5;
sbit dwb22 = dwH^6;
sbit dwb23 = dwH^7;
sbit dwb24 = dwHH^0;
sbit dwb25 = dwHH^1;
sbit dwb26 = dwHH^2;
sbit dwb27 = dwHH^3;
sbit dwb28 = dwHH^4;
sbit dwb29 = dwHH^5;
sbit dwb30 = dwHH^6;
sbit dwb31 = dwHH^7;
/*********************************************/
byte codeH _at_ 0x40;
byte codeL _at_ 0x41;
/*********************************************/
extern send(byte n);
extern plc_stop();
extern runinit();
/********************取代码*************************/
take_code()
{ byte i;
ISP_CONTR=0x80;
ISP_CMD = 1;
for(i=0;i<4;i++)
{ ISP_ADDRH=prog/256;
ISP_ADDRL=prog%256;
EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
nop;
s=HEX[ISP_DATA];
EA=1;
prog++;
}
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
/************************输出位****************************/
/*
函数原型: out_bit
使用资源: dr6:
dr7:
dr1:
R7:
R5:
出口参数: 无
*/
out_bitc(byte addrB,byte addr,byte n)
{ dr6=addrB+addr/8;
dr7=addr%8;
dr1=ram[dr6];
if(dr7==0) sb0=n;
if(dr7==1) sb1=n;
if(dr7==2) sb2=n;
if(dr7==3) sb3=n;
if(dr7==4) sb4=n;
if(dr7==5) sb5=n;
if(dr7==6) sb6=n;
if(dr7==7) sb7=n;
ram[dr6]=dr1;
}
/************************取位状态****************************/
/*
函数原型: take_bit
入口参数: R7:
R5:
dr6: 位地址区,
dr7: 位地址
dr1: 位地址
出口参数: CY
*/
bit take_bitc(byte addB,byte addr)
{
dr6=addB+addr/8;
dr7=addr%8;
dr1=ram[dr6];
if(dr7==0) return(sb0);
if(dr7==1) return(sb1);
if(dr7==2) return(sb2);
if(dr7==3) return(sb3);
if(dr7==4) return(sb4);
if(dr7==5) return(sb5);
if(dr7==6) return(sb6);
if(dr7==7) return(sb7);
}
/**********************取数据************************
使用资源: take_code(); 读取代码
dr1;
dr2:
dr3:
dr4:
dr5:
dr6:
dr7:
dwLL:
dwL:
dwH:
出口参数:dr2: 16位无符号整数高8位
dr1: 16位无符号整数低8位
CY: 执行结果
****************************************************/
take_data()
{
take_code();
dr3=s[0]*16+s[1];
dr4=(s[2]*16+s[3])-0x80;
take_code();
dr5=s[0]*16+s[1];
dr6=(s[2]*16+s[3])-0x80;
if(dr4==0){if(dr6==0) {wr1=dr5*256+dr3;}}
else if(dr4==4){
if(dr5==4) {dwLL=ram[X];dwL=ram[X+1];dwH=0;}
else if(dr5==5){dwLL=ram[Y];dwL=ram[Y+1];dwH=0;}
else if(dr5==8){if(dr3<128)
{ dwLL=ram[(M+dr3/8)];
if(dr3<120)
{dwL=ram[(M+1+dr3/8)];
if(dr3<112) dwH=ram[(M+1+dr3/8)];
}
}
}
dr7=dr3%8;
dr1=0;
dr2=0;
if(dr7==0){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb0;wrb1=dwb1;wrb2=sb2;wrb3=dwb3;}
if(dr6>=4) {wrb4=dwb4;wrb5=dwb5;wrb6=dwb6;wrb7=dwb7;}
if(dr6>=6) {wrb8=dwb8;wrb9=dwb9;wrb10=dwb10;wrb11=dwb11;}
if(dr6>=8) {wrb12=dwb12;wrb13=dwb13;wrb14=sb14;wrb15=dwb15;}
}
else if(dr7==1){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb1;wrb1=dwb2;wrb2=dwb3;wrb3=dwb4;}
if(dr6>=4) {wrb4=dwb5;wrb5=dwb6;wrb6=dwb7;wrb7=dwb8;}
if(dr6>=6) {wrb8=dwb9;wrb9=sb10;wrb10=dwb11;wrb11=dwb12;}
if(dr6>=8) {wrb12=dwb13;wrb13=dwb14;wrb14=dwb15;wrb15=dwb16;}
}
else if(dr7==2){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb2;wrb1=dwb3;wrb2=dwb4;wrb3=dwb5;}
if(dr6>=4) {wrb4=dwb6;wrb5=dwb7;wrb6=dwb8;wrb7=dwb9;}
if(dr6>=6) {wrb8=dwb10;wrb9=dwb11;wrb10=dwb12;wrb11=dwb13;}
if(dr6>=8) {wrb12=dwb14;wrb13=dwb15;wrb14=dwb16;wrb15=dwb17;}
}
else if(dr7==3){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb3;wrb1=dwb4;wrb2=dwb5;wrb3=dwb6;}
if(dr6>=4) {wrb4=dwb7;wrb5=dwb8;wrb6=dwb9;wrb7=dwb10;}
if(dr6>=6) {wrb8=dwb11;wrb9=dwb12;wrb10=dwb13;wrb11=dwb14;}
if(dr6>=8) {wrb12=dwb15;wrb13=dwb16;wrb14=dwb17;wrb15=dwb18;}
}
else if(dr7==4){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb4;wrb1=dwb5;wrb2=dwb6;wrb3=dwb7;}
if(dr6>=4) {wrb4=dwb8;wrb5=dwb9;wrb6=dwb10;wrb7=dwb11;}
if(dr6>=6) {wrb8=dwb12;wrb9=dwb13;wrb10=dwb14;wrb11=dwb15;}
if(dr6>=8) {wrb12=dwb16;wrb13=dwb17;wrb14=dwb18;wrb15=dwb19;}
}
else if(dr7==5){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb5;wrb1=dwb6;wrb2=dwb7;wrb3=dwb8;}
if(dr6>=4) {wrb4=dwb9;wrb5=dwb10;wrb6=dwb11;wrb7=dwb12;}
if(dr6>=6) {wrb8=dwb13;wrb9=dwb14;wrb10=dwb15;wrb11=dwb16;}
if(dr6>=8) {wrb12=dwb17;wrb13=dwb18;wrb14=dwb19;wrb15=dwb20;}
}
else if(dr7==6){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb6;wrb1=dwb7;wrb2=dwb8;wrb3=dwb9;}
if(dr6>=4) {wrb4=dwb10;wrb5=dwb11;wrb6=dwb12;wrb7=dwb13;}
if(dr6>=6) {wrb8=dwb14;wrb9=dwb15;wrb10=dwb16;wrb11=dwb17;}
if(dr6>=8) {wrb12=dwb18;wrb13=dwb19;wrb14=dwb20;wrb15=dwb21;}
}
else if(dr7==7){if(dr6==0) {wr1=0;}
if(dr6>=2) {wrb0=dwb7;wrb1=dwb8;wrb2=dwb9;wrb3=dwb10;}
if(dr6>=4) {wrb4=dwb11;wrb5=dwb12;wrb6=dwb13;wrb7=dwb14;}
if(dr6>=6) {wrb8=dwb15;wrb9=dwb16;wrb10=dwb17;wrb11=dwb18;}
if(dr6>=8) {wrb12=dwb19;wrb13=dwb20;wrb14=dwb21;wrb15=dwb22;}
}
}
else if(dr4==6)
{
if(dr6==2){if(dr5==0){if(dr3<32) {wr1=dram[T+dr3/2];}}}
else if(dr6==4){if(dr5==0){if(dr3<32) {wr1=dram[C+dr3/2];}}}
else if(dr6==6){if(dr5==0){if(dr3<32) {wr1=ram[(0xe0+dr3)/2];}}}
}
}
/************************************************************
dr3:
dr6:
dr7:
wr1:
dw:
*************************************************************/
/*tz_bit()
{dr7=dr3%8;
if(dr7==0){if(dr6>=2){dwb0=wrb0;dwb1=wrb1;dwb2=wrb2;dwb3=wrb3;}
if(dr6>=4){dwb4=wrb4;dwb5=wrb5;dwb6=wrb6;dwb7=wrb7;}
if(dr6>=6){dwb8=wrb8;dwb9=wrb9;dwb10=wrb10;dwb3=wrb11;}
if(dr6>=2){dwb12=wrb12;dwb13=wrb13;dwb14=wrb14;dwb15=wrb15;}
}
else if(dr7==1){if(dr6>=2){dwb1=wrb0;dwb2=wrb1;dwb3=wrb2;dwb4=wrb3;}
if(dr6>=4){dwb5=wrb4;dwb6=wrb5;dwb7=wrb6;dwb8=wrb7;}
if(dr6>=6){dwb9=wrb8;dwb10=wrb9;dwb11=wrb10;dwb12=wrb11;}
if(dr6>=2){dwb13=wrb12;dwb14=wrb13;dwb15=wrb14;dwb16=wrb15;}
}
else if(dr7==2){if(dr6>=2){dwb2=wrb0;dwb3=wrb1;dwb4=wrb2;dwb5=wrb3;}
if(dr6>=4){dwb6=wrb4;dwb7=wrb5;dwb8=wrb6;dwb9=wrb7;}
if(dr6>=6){dwb10=wrb8;dwb11=wrb9;dwb12=wrb10;dwb13=wrb11;}
if(dr6>=2){dwb14=wrb12;dwb15=wrb13;dwb16=wrb14;dwb17=wrb15;}
}
else if(dr7==3){if(dr6>=2){dwb3=wrb0;dwb4=wrb1;dwb5=wrb2;dwb6=wrb3;}
if(dr6>=4){dwb7=wrb4;dwb8=wrb5;dwb9=wrb6;dwb10=wrb7;}
if(dr6>=6){dwb11=wrb8;dwb12=wrb9;dwb13=wrb10;dwb14=wrb11;}
if(dr6>=2){dwb15=wrb12;dwb16=wrb13;dwb17=wrb14;dwb18=wrb15;}
}
else if(dr7==4){if(dr6>=2){dwb4=wrb0;dwb5=wrb1;dwb6=wrb2;dwb7=wrb3;}
if(dr6>=4){dwb8=wrb4;dwb9=wrb5;dwb10=wrb6;dwb11=wrb7;}
if(dr6>=6){dwb12=wrb8;dwb13=wrb9;dwb14=wrb10;dwb15=wrb11;}
if(dr6>=2){dwb16=wrb12;dwb17=wrb13;dwb18=wrb14;dwb19=wrb15;}
}
else if(dr7==5){if(dr6>=2){dwb5=wrb0;dwb6=wrb1;dwb7=wrb2;dwb8=wrb3;}
if(dr6>=4){dwb9=wrb4;dwb10=wrb5;dwb11=wrb6;dwb12=wrb7;}
if(dr6>=6){dwb13=wrb8;dwb14=wrb9;dwb15=wrb10;dwb16=wrb11;}
if(dr6>=2){dwb17=wrb12;dwb18=wrb13;dwb19=wrb14;dwb20=wrb15;}
}
else if(dr7==6){if(dr6>=2){dwb6=wrb0;dwb7=wrb1;dwb8=wrb2;dwb9=wrb3;}
if(dr6>=4){dwb10=wrb4;dwb11=wrb5;dwb12=wrb6;dwb13=wrb7;}
if(dr6>=6){dwb14=wrb8;dwb15=wrb9;dwb16=wrb10;dwb17=wrb11;}
if(dr6>=2){dwb18=wrb12;dwb19=wrb13;dwb20=wrb14;dwb21=wrb15;}
}
else if(dr7==7){if(dr6>=2){dwb7=wrb0;dwb8=wrb1;dwb9=wrb2;dwb10=wrb3;}
if(dr6>=4){dwb11=wrb4;dwb12=wrb5;dwb13=wrb6;dwb14=wrb7;}
if(dr6>=6){dwb15=wrb8;dwb16=wrb9;dwb17=wrb10;dwb18=wrb11;}
if(dr6>=2){dwb19=wrb12;dwb20=wrb13;dwb21=wrb14;dwb22=wrb15;}
}
}
mov_data()
{
if(dr4==4)
{if(dr5==5){dwLL=ram[Y];dwL=ram[Y+1];dwH=0;tz_bit();ram[Y]=dwLL;ram[Y+1]=dwL;}
else if(dr5==8){if(dr3<128)
{dwLL=ram[M+dr3/8];
if(dr3<120)
{dwL=ram[M+dr3/8+1];
if(dr3<112) dwH=ram[M+dr3/8+2];else dwH=0;
}else dwL=0;
tz_bit();
ram[M+dr3/8]=dwLL;
if(dr3<120)
{ram[M+1+dr3/8]=dwL;
if(dr3<112)
{ram[M+2+dr3/8]=dwH;}
}
}}}
else if(dr4==6)
{
if(dr6==2){if(dr5==0){if(dr3<32){dram[T+dr3/2]=wr1;}else M8007=1;}}
else if(dr6==4){if(dr5==0){if(dr3<32){dram[C+dr3/2]=wr1;}M8007=1;}}
else if(dr6==6){if(dr5==0){if(dr3<32){dram[0xe0+dr3/2]=wr1;}M8007=1;}}
}
}*/
/**************************************************************************
取数据寄存器地址
dr3:
dr4:
dr5:
dr6:
CY:
**************************************************************************/
/*bit take_addr()
{
take_code();
dr3=s[0]*16+s[1];
dr4=s[2]*16+s[1]-0x80;
take_code();
dr5=s[0]*16+s[1];
dr6=s[2]*16+s[1]-0x80;
if(dr4==6)
{if(dr6==2)
{if(dr5==0)if(dr3<32) {wr1=T+dr3/2;} else M8007=1;}
if(dr6==4)
{if(dr5==0)if(dr3<32) {wr1=C+dr3/2;} else M8007=1;}
if(dr6==6)
{if(dr5==0)if(dr3<32) {wr1=(0xe0+dr3)/2;}else M8007=1;}
}
return(M8007);
}
*/
/***********************求输入位内存地址****************************
使用资源: dr4:
dr3:
*******************************************************************/
in_bit_addr()
{
dr4=s[0]*16+s[1];
if(s[3]==4) {if(dr4<16){dr3=X;}}
if(s[3]==5) {if(dr4<16){dr3=Y;}}
if(s[3]==6) {if(dr4<16){dr3=T;}}
if(s[3]==8) {if(dr4<128){dr3=M;}}
if(s[3]==14){if(dr4<16){dr3=C;}}
if(s[3]==15){if(dr4<64){dr3=M8;}}
}
/***********************求输出位内存地址****************************
使用资源: dr4:
dr3:
*******************************************************************/
out_bit_addr()
{ dr4=s[0]*16+s[1];
if(s[3]==5) {if(dr4<16){dr3=Y;}}
if(s[3]==8) {if(dr4<128){dr3=M;}}
}
/**********************************************/
//30 38 30 30 pls
//30 30 38 35 Y0
fun_pls()
{
take_code();
out_bit_addr();
if(PFSD<128)
{if(b0)
{
if(!take_bitc(FR,PFSD))
{
out_bitc(dr3,dr4,1);
out_bitc(FR,PFSD,1);
}else out_bitc(dr3,dr4,0);
}else {out_bitc(dr3,dr4,0);
out_bitc(FR,PFSD,0);
}
}
PFSD++;
}
//30 39 30 30 plf
//30 30 38 35 Y0
fun_plf()
{
take_code();
out_bit_addr();
if(PFSD<128)
{if(!b0)
{
if(!take_bitc(FR,PFSD))
{
out_bitc(dr3,dr4,1);
out_bitc(FR,PFSD,1);
}else out_bitc(dr3,dr4,0);
}else {out_bitc(dr3,dr4,0);
out_bitc(FR,PFSD,0);
}
}
PFSD++;
}
//30 43 30 30 rst_ct
fun_rst_ct()
{
take_code();
dr3=s[0]*16+s[1];
if(b0)
{
if(s[3]==6)
{if(dr3<16)
{
out_bitc(T,dr3,0);
out_bitc(TRF,dr3,0);
dram[T+dr3]=65535;
}
}
else if(s[3]==14)
{if(dr3<16)
{out_bitc(C,dr3,0);
out_bitc(CRF,dr3,0);
dram[C+dr3]=0;
}
}
}
}
fun_out_t()
{
take_data();
dram[T+codeL]=wr1;
if(codeL<16)
{if(b0)
{if(~take_bitc(TRF,codeL))
{dram[TRF+codeL]=T100MS;
out_bitc(TRF,codeL,1);}
if(~take_bitc(T,codeL))
{if((T100MS-dram[TRF+codeL])>=dram[T+codeL]){out_bitc(T,codeL,1);}
else {out_bitc(T,codeL,0);}}
}else {out_bitc(T,codeL,0);
out_bitc(TRF,codeL,0);
dram[TRF+codeL]=T100MS;}
}
}
fun_out_c()
{
take_data();
dram[CRF+codeL]=wr1;
if(codeL<16)
{
if(b0)
{
if(~take_bitc(CRF,codeL))
{
if(~take_bitc(C,codeL))
{
dram[C+codeL]++;
if(dram[C+codeL]>=dram[CRF+codeL])
out_bitc(C,codeL,1);
else out_bitc(C,codeL,0);
}
out_bitc(CRF,codeL,1);
}
}else out_bitc(CRF,codeL,0);
}
send(codeL);
send(wr1/256);
send(wr1%256);
send(dram[C+codeL]/256);
send(dram[C+codeL]%256);
send(b0);
send(take_bitc(CRF,codeL));
send(take_bitc(CRF,codeL));
}
//alt
fun_alt()
{
take_code();
dr4=s[0]*16+s[1];
take_code();
if(b0)
{if(s[1]==5)if(dr4<16){ sb10=~take_bitc(Y,dr4);out_bitc(Y,dr4,sb10);}
if(s[1]==8)if(dr4<128){ sb10=~take_bitc(M,dr4);out_bitc(M,dr4,sb10);}
}
}
fun_altp()
{ take_code();
dr4=s[0]*16+s[1];
take_code();
dr3=s[1];
if(PFSD<128)
{if(b0)
{if(!take_bitc(FR,PFSD))
{
if(dr3==5)if(dr4<16){ sb10=~take_bitc(Y,dr4);out_bitc(Y,dr4,sb10);}
if(dr3==8)if(dr4<128){sb10=~take_bitc(M,dr4);out_bitc(M,dr4,sb10);}
out_bitc(FR,PFSD,1);
}
}else out_bitc(FR,PFSD,0);
}
PFSD++;
}
fun_ldp()
{ br1>>=1;
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)if(OAB<8)
{if(take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
b0=1;
out_bitc(FR,PFSD,1);
}else{b0=0;}
}else {out_bitc(FR,PFSD,0); b0=0; }
}
OAB++;
PFSD++;
}
fun_ldf()
{ br1>>=1;
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)if(OAB<8)
{if(!take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
b0=1;
out_bitc(FR,PFSD,1);
}else{b0=0;}
}else {out_bitc(FR,PFSD,0); b0=0; }
}
OAB++;
PFSD++;
}
fun_andp()
{
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)
{if(take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
out_bitc(FR,PFSD,1);
}else{b0=0;}
}else {out_bitc(FR,PFSD,0); b0=0; }
}
PFSD++;
}
fun_andf()
{
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)
{if(!take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
out_bitc(FR,PFSD,1);
}else{b0=0;}
}else {out_bitc(FR,PFSD,0); b0=0; }
}
PFSD++;
}
fun_orp()
{
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)
{if(take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
b0=1;
out_bitc(FR,PFSD,1);
}
}else {out_bitc(FR,PFSD,0);}
}
PFSD++;
}
fun_orf()
{
take_code();
dr4=s[0]*16+s[1];
in_bit_addr();
if(PFSD<128)
{if(!take_bitc(dr3,dr4))
{if(!take_bitc(FR,PFSD))
{
b0=1;
out_bitc(FR,PFSD,1);
}
}else {out_bitc(FR,PFSD,0);}
}
PFSD++;
}
cmd()
{
take_data();
wr2=wr1;
take_data();
if(wr2==wr1) {M8005=0;M8006=0;M8004=1;}
if(wr2>wr1) {M8004=0;M8006=0;M8005=1;}
if(wr2<wr1) {M8004=0;M8005=0;M8006=1;}
}
fun_ld0()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=M8004;
}
OAB++;
}
fun_ld2()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=M8005;
}
OAB++;
}
fun_ld4()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=M8006;
}
OAB++;
}
fun_ld8()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=~M8004;
}
OAB++;
}
fun_ld10()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=~M8005;
}
OAB++;
}
fun_ld12()
{
if(OAB<8)
{
br1<<=1;
cmd();
b0=~M8006;
}
OAB++;
}
fun_and0()
{
cmd();
b0&=M8004;
}
fun_and2()
{
cmd();
b0&=M8005;
}
fun_and4()
{
cmd();
b0&=M8006;
}
fun_and8()
{
cmd();
b0&=~M8004;
}
fun_and10()
{
cmd();
b0&=~M8005;
}
fun_and12()
{
cmd();
b0&=~M8006;
}
fun_or0()
{
cmd();
b0|=M8004;
}
fun_or2()
{
cmd();
b0|=M8005;
}
fun_or4()
{
cmd();
b0|=M8006;
}
fun_or8()
{
cmd();
b0|=~M8004;
}
fun_or10()
{
cmd();
b0|=~M8005;
}
fun_or12()
{
cmd();
b0|=M8006;
}
/*
fun_plsy()
{
}
fun_plsr()
{
}
*/
/*
fun_mov()
{
take_data();
wr1=dr2*256+dr1;
take_code();
dr3=s[0]*16+s[1];
dr4=(s[2]*16+s[3])-0x80;
take_code();
dr5=s[0]*16+s[1];
dr6=(s[2]*16+s[3])-0x80;
if(b0)if(~M8007)
{mov_data();}
}
fun_movp()
{
sb10=b0&&take_bitc(FR,PFSD);
take_data();
take_code();
dr3=s[0]*16+s[1];
dr4=(s[2]*16+s[3])-0x80;
take_code();
dr5=s[0]*16+s[1];
dr6=(s[2]*16+s[3])-0x80;
if(PFSD<128)
{if(sb10)if(~M8007) {mov_data();}
out_bitc(FR,PFSD,b0);
}
PFSD++;
}
fun_inc()
{
if(b0)if(!take_addr())
{
dram[wr1]++;
}
}
fun_dec()
{
if(b0)if(!take_addr())
{
dram[wr1]--;
}
}
fun_add()
{
take_data();
wr2=wr1;
take_data();
wr2=wr2+wr1;
if(b0)if(!M8007)if(!take_addr())
{
dram[wr1]=wr2;
}
}
fun_sub()
{
take_data();
wr2=wr1;
take_data();
wr2=wr2-wr1;
if(b0)if(!M8007)if(!take_addr())
{
dram[wr1]=wr2;
}
}
*/
take_1()
{
switch(codeH)
{
case 0x00:
{
if(codeL==0x08) fun_pls();
if(codeL==0x09) fun_plf();
if(codeL==0x0C) fun_rst_ct();
if(codeL==0x0F) M8003=1;
//if(codeL==0x28) fun_mov();
//if(codeL==0x38) fun_add();
//if(codeL==0x3A) fun_sub();
//if(codeL==0x40) fun_inc();
//if(codeL==0x42) fun_dec();
if(codeL==0x94) fun_alt();
} break;
case 0x01:
{
if(codeL==0xCA) fun_ldp();
else if(codeL==0xCB) fun_ldf();
else if(codeL==0xCC) fun_andp();
else if(codeL==0xCD) fun_andf();
else if(codeL==0xCE) fun_orp();
else if(codeL==0xCF) fun_orf();
else if(codeL==0xD0) fun_ld0();
else if(codeL==0xD2) fun_ld2();
else if(codeL==0xD4) fun_ld4();
else if(codeL==0xD8) fun_ld8();
else if(codeL==0xDA) fun_ld10();
else if(codeL==0xDC) fun_ld12();
else if(codeL==0xE0) fun_and0();
else if(codeL==0xE2) fun_and2();
else if(codeL==0xE4) fun_and4();
else if(codeL==0xE8) fun_and8();
else if(codeL==0xEA) fun_and10();
else if(codeL==0xEC) fun_and12();
else if(codeL==0xF0) fun_or0();
else if(codeL==0xF2) fun_or2();
else if(codeL==0xF4) fun_or4();
else if(codeL==0xF8) fun_or8();
else if(codeL==0xFA) fun_or10();
else if(codeL==0xFC) fun_or12();
}break;
case 0x02: break;
case 0x03: break;
case 0x04: break;
case 0x05: break;
case 0x06: fun_out_t();break;
case 0x07: break;
case 0x08: break;
case 0x09: break;
case 0x0A: break;
case 0x0B: break;
case 0x0C: break;
case 0x0D: break;
case 0x0E: fun_out_c();break;
case 0x0F: break;
case 0x10:
{//if(codeL==0x28) fun_movp();
if(codeL==0x94) fun_altp();}break;
case 0x11: break;
case 0x12: break;
case 0x13: break;
case 0x14: break;
case 0x15: break;
case 0x16: break;
case 0x17: break;
case 0x18: break;
case 0x19: break;
case 0x1A: break;
case 0x1B: break;
case 0x1C: break;
case 0x1D: break;
case 0x1E: break;
case 0x1F: break;
case 0x20: break;
case 0x21: break;
case 0x22: break;
case 0x23: break;
case 0x24:{if(OAB<8){br1<<=1;if(codeL<16) b0=take_bitc(X,codeL);}OAB++; } break;
case 0x25:{if(OAB<8){br1<<=1;if(codeL<16) b0=take_bitc(Y,codeL);}OAB++; } break;
case 0x26:{if(OAB<8){br1<<=1;if(codeL<16) b0=take_bitc(T,codeL);}OAB++; } break;
case 0x27: break;
case 0x28:{if(OAB<8){br1<<=1;if(codeL<128) b0=take_bitc(M,codeL);}OAB++; } break;
case 0x29: break;
case 0x2A: break;
case 0x2B: break;
case 0x2C: break;
case 0x2D: break;
case 0x2E:{if(OAB<8){br1<<=1;if(codeL<16) b0=take_bitc(C,codeL);}OAB++; }break;
case 0x2F:{if(OAB<8){br1<<=1;if(codeL<64) b0=take_bitc(M8,codeL);}OAB++; }break;
case 0x30:break;
case 0x31:break;
case 0x32:break;
case 0x33:break;
case 0x34:{if(OAB<8){br1<<=1;if(codeL<16) b0=~take_bitc(X,codeL);}OAB++; }break;
case 0x35:{if(OAB<8){br1<<=1;if(codeL<16) b0=~take_bitc(Y,codeL);}OAB++; }break;
case 0x36:{if(OAB<8){br1<<=1;if(codeL<16) b0=~take_bitc(T,codeL);}OAB++; }break;
case 0x37:break;
case 0x38:{if(OAB<8){br1<<=1;if(codeL<128) b0=~take_bitc(M,codeL);}OAB++; }break;
case 0x39:break;
case 0x3A:break;
case 0x3B:break;
case 0x3C:break;
case 0x3D:break;
case 0x3E:{if(OAB<8){br1<<=1;if(codeL<16) b0=~take_bitc(C,codeL);}OAB++; }break;
case 0x3F:{if(OAB<8){br1<<=1;if(codeL<64) b0=~take_bitc(M8,codeL);}OAB++; }break;
case 0x40:break;
case 0x41:break;
case 0x42:break;
case 0x43:break;
case 0x44:{if(codeL<16) b0&=take_bitc(X,codeL); } break;
case 0x45:{if(codeL<16) b0&=take_bitc(Y,codeL); }break;
case 0x46:{if(codeL<16) b0&=take_bitc(T,codeL); }break;
case 0x47:break;
case 0x48:{if(codeL<128) b0&=take_bitc(M,codeL);}break;
case 0x49:break;
case 0x4A:break;
case 0x4B:break;
case 0x4C:break;
case 0x4D:break;
case 0x4E:{if(codeL<16) b0&=take_bitc(C,codeL);}break;
case 0x4F:{if(codeL<64) b0&=take_bitc(M8,codeL);}break;
}
}
take_2()
{dr8=codeH+0xB0;
switch(dr8)
{
case 0x0:break;
case 0x1:break;
case 0x2:break;
case 0x3:break;
case 0x4:{if(codeL<16) b0&=~take_bitc(X,codeL);}break;
case 0x5:{if(codeL<16) b0&=~take_bitc(Y,codeL);}break;
case 0x6:{if(codeL<16) b0&=~take_bitc(T,codeL);}break;
case 0x7:break;
case 0x8:{if(codeL<128) b0&=~take_bitc(M,codeL); }break;
case 0x9:break;
case 0xA:break;
case 0xB:break;
case 0xC:break;
case 0xD:break;
case 0xE:{if(codeL<16) b0&=~take_bitc(C,codeL);}break;
case 0xF:{if(codeL<64) b0&=~take_bitc(M8,codeL);}break;
case 0x10:break;
case 0x11:break;
case 0x12:break;
case 0x13:break;
case 0x14:{if(codeL<16) b0|=take_bitc(X,codeL);}break;
case 0x15:{if(codeL<16) b0|=take_bitc(Y,codeL); }break;
case 0x16:{if(codeL<16) b0|=take_bitc(T,codeL); }break;
case 0x17:break;
case 0x18:{if(codeL<128) b0|=take_bitc(M,codeL); }break;
case 0x19:break;
case 0x1A:break;
case 0x1B:break;
case 0x1C:break;
case 0x1D:break;
case 0x1E:{if(codeL<16) b0|=take_bitc(C,codeL); }break;
case 0x1F:{if(codeL<64) b0|=take_bitc(M8,codeL); }break;
case 0x20:break;
case 0x21:break;
case 0x22:break;
case 0x23:break;
case 0x24:{if(codeL<16) b0|=~take_bitc(X,codeL); }break;
case 0x25:{if(codeL<16) b0|=~take_bitc(Y,codeL); }break;
case 0x26:{if(codeL<16) b0|=~take_bitc(T,codeL); }break;
case 0x27:break;
case 0x28:{if(codeL<128) b0|=~take_bitc(M,codeL); }break;
case 0x29:break;
case 0x2A:break;
case 0x2B:break;
case 0x2C:break;
case 0x2D:break;
case 0x2E:{if(codeL<16) b0|=~take_bitc(C,codeL); }break;
case 0x2F:{if(codeL<64) b0|=~take_bitc(M8,codeL); }break;
}
}
take_3()
{dr8=codeH+0x40;
switch(dr8)
{
case 0x0:break;
case 0x1:break;
case 0x2:break;
case 0x3:break;
case 0x4:break;
case 0x5:{if(codeL<16) out_bitc(Y,codeL,b0);}break;
case 0x6:break;
case 0x7:break;
case 0x8:{if(codeL<128) out_bitc(M,codeL,b0);}break;
case 0x9:break;
case 0xA:break;
case 0xB:break;
case 0xC:break;
case 0xD:break;
case 0xE:break;
case 0xF:break;
case 0x10:break;
case 0x11:break;
case 0x12:break;
case 0x13:break;
case 0x14:break;
case 0x15: {if(codeL<16)if(b0) out_bitc(Y,codeL,1);}break;
case 0x16:break;
case 0x17: break;
case 0x18: {if(codeL<16)if(b0) out_bitc(M,codeL,1);}break;
case 0x19:break;
case 0x1A:break;
case 0x1B:break;
case 0x1C:break;
case 0x1D:break;
case 0x1E:break;
case 0x1F:break;
case 0x20:break;
case 0x21:break;
case 0x22:break;
case 0x23:break;
case 0x24:break;
case 0x25:{if(codeL<16)if(b0) out_bitc(Y,codeL,0);}break;
case 0x26:break;
case 0x27:break;
case 0x28:{if(codeL<16)if(b0) out_bitc(M,codeL,0);}break;
case 0x29:break;
case 0x2A:break;
case 0x2B:break;
case 0x2C:break;
case 0x2D:break;
case 0x2E:break;
case 0x2F:break;
case 0x30:break;
case 0x31:break;
case 0x32:break;
case 0x33:break;
case 0x34:break;
case 0x35:break;
case 0x36:break;
case 0x37:break;
case 0x38:break;
case 0x39:break;
case 0x3A:break;
case 0x3B:break;
case 0x3C:break;
case 0x3D:break;
case 0x3E:break;
case 0x3F:break;
{
if(codeL==0xF8){if(b0){br1>>=1;}else{br1>>=1;b0=0;}} //anb
else if(codeL==0xF9){if(b0){br1>>=1;b0=1;}else{br1>>=1;}} //orb
else if(codeL==0xFA){if(MPPD<8){br2<<=1;b10=b0;MPPD++;}}
else if(codeL==0xFB){b0=b10;}
else if(codeL==0xFC){if(MPPD>0){b0=b10;MPPD--;}}
else if(codeL==0xFF){nop;nop;nop;nop;nop;} //nop
} break;
}
}
/******************周期扫描****************************/
scan()
{
take_code(); //取指令
codeH=s[2]*16+s[3];
codeL=s[0]*16+s[1];
if(codeH<0x50) take_1();
else if(codeH>=0x50)if(codeH<0x80) take_2();
else if(codeH>=0xC0) take_3();
}
/*****************************/
stop_plc()
{
Y0=1;
Y1=1;
Y2=1;
Y3=1;
Y4=1;
Y5=1;
Y6=1;
run_lamp=1;
M8000=0; //复位PLC运行位
TR0=0;
ET0=0;
plc_stop();
}
void com()
{
byte i;
//PLC型号版本
// _00E 02 02_6C
//02 30 30 45 30 32 30 32 03 36 43
//_6266_D7 FX1N
//_F65E_F9 FX2N
if(v[1]==0X30)if(v[2]==0X30)if(v[3]==0X45)if(v[4]==0X30)
if(v[5]==0X32)if(v[6]==0X30)if(v[7]==0X32)if(v[8]==0X03)
if(v[9]==0X36)if(v[10]==0X43)
{
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X36);
send(0X32);
send(0X36);
send(0X36);
send(0X03);
send(0X44);
send(0X37);
}
//_E01 8000 40_D5
//02 45 30 31 38 30 30 30 34 30 03 44 35
//02 30 38 30 30 44 39 31 44 30 30 30 30 30 30 30 30 32 30 32 30 32 30 32 30 32
// 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32
// 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32
// 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30
// 46 34 30 39 46 46 30
// 42 46 34 30 31 45 37
// 30 33 36 34 30 45 43
// 37 30 45 44 43 30 45
// 46 46 30 45 03 46 33
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[4]==0X38)
if(v[5]==0X30)if(v[6]==0X30)if(v[7]==0X30)if(v[8]==0X34)
if(v[9]==0X30)if(v[10]==0X03)if(v[11]==0X44)if(v[12]==0X35)
{//固定通讯协议
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X30);
send(0X38);
send(0X30);
send(0X30);
send(0X44);
send(0X39);
send(0X31);
send(0X44);
for(i=8;i>0;i--)
{send(0X30);}
for(i=40;i>0;i--)
{
send(0X32);
send(0X30);
}
send(0X46);
send(0X34);
send(0X30);
send(0X39);
send(0X46);
send(0X46);
send(0X30);
send(0X42);
send(0X46);
send(0X34);
send(0X30);
send(0X31);
send(0X45);
send(0X37);
send(0X30);
send(0X33);
send(0X36);
send(0X34);
send(0X30);
send(0X45);
send(0X43);
send(0X37);
send(0X30);
send(0X45);
send(0X44);
send(0X43);
send(0X30);
send(0X45);
send(0X46);
send(0X46);
send(0X30);
send(0X45);
send(0X03);
send(0X46);
send(0X33);
}
//_E0180401C_E9
//02 45 30 31 38 30 34 30 31 43 03 45 39
//02 39 30 30 31 46 45 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
//30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
//30 03 42 42
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[4]==0X38)
if(v[5]==0X30)if(v[6]==0X34)if(v[7]==0X30)if(v[8]==0X31)
if(v[9]==0X43)if(v[10]==0X03)if(v[11]==0X45)if(v[12]==0X39)
{//固定通讯协议
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X39);
send(0X30);
send(0X30);
send(0X31);
send(0X46);
send(0X45);
send(0X30);
send(0X33);
for(i=48;i>0;i--)
{send(0X30);}
send(0X03);
send(0X42);
send(0X42);
}
//PLC RUN/STOP _E00 01C0 01_DD
//02 45 30 30 30 31 43 30 30 31 03 44 44
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X30)if(v[4]==0X30)
if(v[5]==0X31)if(v[6]==0X43)if(v[7]==0X30)if(v[8]==0X30)
if(v[9]==0X31)if(v[10]==0X03)if(v[11]==0X44)if(v[12]==0X44)
{//固定通讯协议
for(i=0;i<200;i++)v=0;
if(!M8000){
send(0X02);
send(0X30);
send(0X41);
send(0X03);
send(0X37);
send(0X34);
}else{ stop_plc();
send(2);
send(0X30);
send(0X39);
send(0X03);
send(0X36);
send(0X43);
}
}
//E00 0E06 02_E5
// 02 45 30 30 30 45 30 36 30 32 03 45 35
// 02 31 30 30 30 03 43 34//固定通讯协议
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X30)if(v[4]==0X30)
if(v[5]==0X45)if(v[6]==0X30)if(v[7]==0X36)if(v[8]==0X30)
if(v[9]==0X32)if(v[10]==0X03)if(v[11]==0X45)if(v[12]==0X35)
{
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X31);
send(0X30);
send(0X30);
send(0X30);
send(0X03);
send(0X43);
send(0X34);
}
//PLC密码 _E01 8008 08 _E1
//SEND:02 45 30 31 38 30 30 38 30 38 03 45 31
//ACK: 02 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 03 31 33 无密码
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[4]==0X38)
if(v[5]==0X30)if(v[6]==0X30)if(v[7]==0X38)if(v[8]==0X30)
if(v[9]==0X38)if(v[10]==0X03)if(v[11]==0X45)if(v[12]==0X31)
{ //固定通讯协议
for(i=0;i<200;i++)v=0;
send(0X02);
for(i=8;i>0;i--)
{
send(0X32);
send(0X30);
}
send(0X03);
send(0X31);
send(0X33);
}
//_E0180002E_E8
//SEND: 02 45 30 31 38 30 30 30 32 45 03 45 38
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[4]==0X38)
if(v[5]==0X30)if(v[6]==0X30)if(v[7]==0X30)if(v[8]==0X32)
if(v[9]==0X45)if(v[10]==0X03)if(v[11]==0X45)if(v[12]==0X38)
{//固定通讯协议
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X30);
send(0X38);
send(0X30);
send(0X30);
send(0X43);
send(0X35);
send(0X44);
send(0X43);
for(i=8;i>0;i--)
{send(0X30);}
for(i=38;i>0;i--)
{
send(0X32);
send(0X30);
}
send(0X03);
send(0X44);
send(0X36);
}
//E01 802E 2E _FF
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[4]==0X38)
if(v[5]==0X30)if(v[6]==0X32)if(v[7]==0X45)if(v[8]==0X32)
if(v[9]==0X45)if(v[10]==0X03)if(v[11]==0X46)if(v[12]==0X46)
{//固定通讯协议
for(i=0;i<200;i++)v=0;
send(0X02);
send(0X32);
send(0X30);
send(0X32);
send(0X30);
send(0X46);
send(0X34);
send(0X30);
send(0X39);
send(0X46);
send(0X46);
send(0X30);
send(0X42);
send(0X46);
send(0X34);
send(0X30);
send(0X31);
send(0X45);
send(0X37);
send(0X30);
send(0X33);
send(0X36);
send(0X34);
send(0X30);
send(0X45);
send(0X43);
send(0X37);
send(0X30);
send(0X45);
send(0X44);
send(0X43);
send(0X30);
send(0X45);
send(0X46);
send(0X46);
send(0X30);
send(0X45);
send(0X39);
send(0X30);
send(0X30);
send(0X31);
send(0X46);
send(0X45);
send(0X30);
send(0X33);
for(i=48;i>0;i--)
{send(0X30);}
send(0X03);
send(0X45);
send(0X35);
}
//固定通讯码
//E7250E_5b
//02 45 37 32 35 30 45 03 35 42
//06
if(v[1]==0x45)if(v[2]==0x37)if(v[3]==0x32)if(v[4]==0x35)
if(v[5]==0x30)if(v[6]==0x45)if(v[7]==0x03)if(v[8]==0x35)if(v[9]==0x42)
{
for(i=0;i<200;i++)v=0;
send(0X06);
}
//固定通讯码
//_E7760E_61
//02 45 37 37 36 30 45 03 36 31
if(v[1]==0X45)if(v[2]==0X37)if(v[3]==0X37)if(v[4]==0X36)
if(v[5]==0X30)if(v[6]==0X45)if(v[7]==0X03)if(v[8]==0X36)
if(v[9]==0X31)
{
for(i=0;i<200;i++)v=0;
send(0X06);
}
/* 读取一段程序
SEND: 02 45 30 31 38 30 35 43 34 30 03 45 44
STX CMD 单元一 字数 ETX SUM
步数=字数/2(16位机一步占两个字,8位机一步占4个字节)
字节数=字数*2
805(基数)单元一
ACK: 02 N个字节 03 两个校验码
*/
if(v[1]==0X45)if(v[2]==0X30)if(v[3]==0X31)if(v[7]==0X43)if(v[10]==3)
{
wr1=((HEX[(v[4])]*256+HEX[(v[5])]*16+HEX[(v[6])])-0x805)/4; //单元号 400 共8000步
dr8=(HEX[(v[8])]*16+HEX[(v[9])])*2; //字节数<128=(字数*2(一个单元最多64字))*2
wr2=0x2800+wr1*128; //存储器首地址
for(i=0;i<200;i++)v=0;
send(2);
dr3=0;
if(wr1<16){ ISP_CONTR=0x80;
ISP_CMD = 1;
for(i=dr8;i>0;i--)
{ ISP_ADDRH=wr2/256;
ISP_ADDRL=wr2%256;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
nop;
dr7=ISP_DATA;
send(dr7);
dr3=dr3+dr7;
wr2++;
}
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
else{for(i=dr8;i>0;i--)
{
send(0x46);
dr3=dr3+0x46;
}}
send(3);
dr3=dr3+3;
send(ASC[dr3/16]);
send(ASC[dr3%16]);
}
/*
SEND: 02 45 31 31 38 30 35 43 30 30 (字节) 03 两个校验码
ACK:06 单元号 (步数=字数/2) 步数*4
*/
if(v[1]==0x45)if(v[2]==0x31)if(v[3]==0x31)if(v[7]==0x43)
{
wr1=((HEX[(v[4])]*256+HEX[(v[5])]*16+HEX[(v[6])])-0x805)/4; //单元号 STC12C5410 2K字节,500步
dr8=(HEX[(v[8])]*16+HEX[(v[9])])*2; //字节数<128=(字数*2(一个单元最多64字))*2
if(M8001)
{ M8001=0;
dr3=0x28; //程序存储器0页地址 每页512字节
ISP_CONTR=0x80;
ISP_CMD = 3;
for(i=4;i>0;i--)
{ ISP_ADDRH = dr3; //程序存储器页地址
ISP_ADDRL = 0;
EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
EA=1;
dr3+=2;
}ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
if(wr1<16)
{ wr2=0x2800+wr1*128;
for(i=0;i<dr8;i++)
{ ISP_CONTR= 0x80;
ISP_CMD = 2;
dr4=v[10+i];
ISP_ADDRH=wr2/256;
ISP_ADDRL=wr2%256;
EA=0;
ISP_DATA=dr4;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
EA=1;
wr2++;
dr5++;
}
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
for(i=0;i<200;i++)v=0;
send(6);
}
//_E00E1406_E8
// 02 45 30 30 30 45 31 34 30 36 03 45 38
// 02 30 41 30 30 30 41 30 30 30 41 30 30 03 37 36
if(v[1]==0x45)if(v[2]==0x30)if(v[3]==0x30)if(v[4]==0x30)
if(v[5]==0x45)if(v[6]==0x31)if(v[7]==0x34)if(v[8]==0x30)if(v[9]==0x36)
if(v[10]==03)
{
for(i=0;i<200;i++)v=0;
send(2);
send(0x30);
send(0x41);
send(0x30);
send(0x30);
send(0x30);
send(0x41);
send(0x30);
send(0x30);
send(0x30);
send(0x41);
send(0x30);
send(0x30);
send(3);
send(0x37);
send(0x36);
}
//_E8760E_62
//02 45 38 37 36 30 45 03 36 32
if(v[1]==0X45)if(v[2]==0X38)if(v[3]==0X37)if(v[4]==0X36)
if(v[5]==0X30)if(v[6]==0X45)if(v[7]==0X03)if(v[8]==0X36)
if(v[9]==0X32)
{
for(i=0;i<200;i++)v=0;
send(0X06);
}
//_B_45
//SEND:02 42 03 34 35 开始校验
//ACK:06
if(v[1]==0x42)if(v[2]==0x03)if(v[3]==0x34)if(v[4]==0x35)
{
for(i=0;i<200;i++)v=0;
send(6);
ISP_CONTR=sofint_rst; //通讯结束软复位到应用程序区执行程序
}
} |
|