📄 tcp.c
字号:
#include <c8051F020.h> // AT89S52
#include <absacc.h> // Absolute address access
#include <string.h> // Related to the string
#include <ctype.h>
#include <stdio.h> // Standard input or output
#define uchar unsigned char
#define uint unsigned int
/*#define P0MDIN 0xF1;
#define P0MDOUT 0xA4;
#define P1MDOUT 0xA5;
#define P2MDOUT 0xA6;
#define P3MDOUT 0xA7;
#define XBR0 0xE1;
#define XBR1 0xE2;
#define XBR2 0xE3;
#define OSCXCN 0xB1;
#define OSCICL 0xB3;
#define OSCICN 0xB2;
#define FLSCL 0xB6;
#define PSCTL 0x8F;
#define EMI0CN 0xAF;
#define EMI0TC 0xA1;
#define EMI0CF 0xA3;*/
sbit r1=P0^7 ;
sbit r2=P0^6;
uchar gs0_rx_base,gs1_rx_base,gs2_rx_base, gs3_rx_base;
uchar gs0_rx_mask,gs1_rx_mask,gs2_rx_mask,gs3_rx_mask;
uchar gs0_tx_base, gs1_tx_base, gs2_tx_base, gs3_tx_base;
uchar gs0_tx_mask,gs1_tx_mask,gs2_tx_mask,gs3_tx_mask;
uchar data2[]={0};
uchar data1[]={'A'};
void s0_init(void);
void send(void);
void Flash_init()
{ FLSCL=0x81;
PSCTL=0x03;
}
void Power_init(void)
{ PCON=0x00;
}
void Osci_init(void)
{ OSCICN=0x84;
}
void Oscx_init(void)
{ OSCXCN=0x80; //晶体振荡器正在运行并且工作稳定.关闭 XTAL1 引脚内部接地
}
void Emio_init(void)
{ EMI0CN=0x00; //0x0000 -- 0x00FF
EMI0CF=0x18;
EMI0TC=0x97; //地址建立时间=0个SYSCLK周期./WR和/RD脉冲宽度=1个 SYSCLK周期.地址保持时间 = 0 个 SYSCLK周期
}
void Xbr_init( void)
{
XBR0=0x00;
XBR1=0x00;
XBR2=0x02;
}
void Pn_init(void)
{
P0MDOUT=0xFF;
P1MDOUT=0xFF;
P2MDOUT=0xFF;
P3MDOUT=0xFF;
}
delay()
{
int d;
for(d=0;d<10;d++);
}
void Wrcmd(j,k,l)
{
r1=0;
P1=j;
P2=k;
P3=l;
r1=1;
}
Recmd(x,y)
{
int z;
r2=0;
P1=x;
P2=y;
z=P3;
r2=1;
return z;
}
void Send(void)
{ int t1,t2,t,sn,sn1,sn2,k,a1,a2,a3,a4;
int c1;
uint sendsize=10;
uchar getoffset,getstartaddress,upsize,leftsize,get_start_address;
t1=Recmd(0x04,0x20);
t2=Recmd(0x04,0x21);
t=(t1<<8)||t2;
if(t<sendsize)
{
send();
}
else
sn1=Recmd(0x04,0x24);
sn2=Recmd(0x04,0x25);
sn1=sn1<<8;
sn=sn1||sn2;
getoffset=sn&&gs0_tx_mask;
getstartaddress=gs0_tx_base+getoffset;
if((getoffset+sendsize)>(gs0_tx_mask+1))
{
upsize=gs0_tx_mask+1-getoffset;
for(k=0;k<upsize;k++)
{
a1=getstartaddress&&0x00FF;
a2=(getstartaddress>>8)&&0x00FF;
Wrcmd(a2,a1,data1[k]);
if(a1==0xFF)
{
a2++;
a1=0x00;
}
else a1++;
}
leftsize=sendsize-upsize;
a3=gs0_rx_base&&0x00FF;
a4=(gs0_rx_base>>8)&&0x00FF;
Wrcmd(a4,a3,data1[k++]);
if(a3==0xFF)
{
a4++;
a3=0x00;
}
else a3++;
}
else
{
for(k=0;k<sendsize;k++)
{
a1=get_start_address&&0x00FF;
a2=(get_start_address>>8)&&0x00FF;
Wrcmd(a4,a3,data1[k++]);
if(a1==0xFF)
{ a2++;
a1=0x00;
}
else a1++;
}
Wrcmd(0x04,0x01,0x20);
c1=Recmd(0x04,0x03);
if(c1==0x1c)
Wrcmd(0x04,0x01,0x08);
else
if(c1==0x00)
Wrcmd(0x04,0x01,0x10);
}
}
void recieve()
{
int r,d,rz;
uchar getoffset,get_start_address,leftsize,sn,sn1,sn2,upsize,a1,a2,a3,a4;
uint k,h=0;
r=Recmd(0x04,0x26);
d=Recmd(0x04,0x27);
r=r<<8;
rz=r||d;
sn1=Recmd(0x04,0x28);
sn2=Recmd(0x04,0x29);
sn1=sn1<<8;
sn=sn1||sn2;
getoffset=sn&&gs0_rx_mask;
get_start_address=gs0_rx_base+getoffset;
if((getoffset+rz)>(gs0_rx_mask+1))
{
upsize=gs0_rx_mask+1-getoffset;
for(k=0;k<upsize;k++)
{
a1=get_start_address&&0x00FF;
a2=(get_start_address>>8)&&0x00FF;
data2[h++]=Recmd(a2,a1);
if(a1==0xFF)
{
a2++;
a1=0x00;
}
else a1++;
}
leftsize=rz-upsize;
a3=gs0_rx_base&&0x00FF;
a4=(gs0_rx_base>>8)&&0x00FF;
data2[h]=Recmd(a4,a3);
if(a3==0xFF)
{
a4++;
a3=0x00;
}
else a3++;
}
else
{
for(k=0;k<rz;k++)
{
a1=get_start_address&&0x00FF;
a2=(get_start_address>>8)&&0x00FF;
data2[h++]=Recmd(a2,a1);
if(a1==0xFF)
{
a2++;
a1=0x00;
}
else a1++;
}
sn+=rz;
Wrcmd(0x04,0x01,0x40);
}
}
void connect(void)
{
int c,r,d;
c=Recmd(0x04,0x03);
while(c==0x17)
{
r=Recmd(0x04,0x26);
d=Recmd(0x04,0x27);
while(r!=0||d!=0)
recieve();
}
}
void listen(void)
{
uint li;
Wrcmd(0x04,0x01,0x02);
delay();
li=Recmd(0x04,0x03);
if(li!=0x14)
{
Wrcmd(0x04,0x01,0x10);
s0_init();
}
else connect();
}
void s0_init(void)
{ int n;
Wrcmd(0x04,0x00,0x01);
Wrcmd(0x04,0x04,0x13);
Wrcmd(0x04,0x05,0x88);
Wrcmd(0x04,0x01,0x01);
n=Recmd(0x04,0x03);
if(n!=0x13)
{
Wrcmd(0x04,0x01,0x10);
s0_init();
}
else listen();
}
void W5100_init(void)
{
Wrcmd(0x00,0x00,0x00);
Wrcmd(0x00,0x01,0xC0);
Wrcmd(0x00,0x02,0xA8);
Wrcmd(0x00,0x03,0x01);
Wrcmd(0x00,0x04,0x01);
Wrcmd(0x00,0x05,0xFF);
Wrcmd(0x00,0x06,0xFF);
Wrcmd(0x00,0x07,0xFF);
Wrcmd(0x00,0x08,0x00);
Wrcmd(0x00,0x09,0x00);
Wrcmd(0x00,0x0A,0x08);
Wrcmd(0x00,0x0B,0xDC);
Wrcmd(0x00,0x0C,0x01);
Wrcmd(0x00,0x0D,0x02);
Wrcmd(0x00,0x0E,0x03);
Wrcmd(0x00,0x0F,0xC0);
Wrcmd(0x00,0x10,0xA8);
Wrcmd(0x00,0x11,0x01);
Wrcmd(0x00,0x12,0x88);
Wrcmd(0x00,0x16,0xC0);
Wrcmd(0x00,0x17,0x0F);
Wrcmd(0x00,0x18,0xA0);
Wrcmd(0x00,0x19,0x08);
Wrcmd(0x00,0x1A,0x55);
gs0_rx_base=0x6000;
gs0_rx_mask=0x7FF;
gs1_rx_base=0x6800;
gs1_rx_mask=0x7FF;
gs2_rx_base=0x7000;
gs2_rx_mask=0x7FF;
gs3_rx_base=0x7800;
gs3_rx_mask=0x7FF;
Wrcmd(0x00,0x1B,0x55);
gs0_tx_base=0x4000;
gs0_tx_mask=0x7FF;
gs1_tx_base=0x4800;
gs1_tx_mask=0x7FF;
gs2_tx_base=0x5000;
gs2_tx_mask=0x7FF;
gs3_tx_base=0x5800;
gs3_tx_mask=0x7FF;
s0_init();
}
void main(void)
{
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
Osci_init();
Oscx_init();
Flash_init();
Power_init();
Xbr_init();
Emio_init();
Pn_init();
W5100_init();
Send();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -