#define reg00 XBYTE [0x8000]
#define reg01 XBYTE [0x8100]
#define reg02 XBYTE [0x8200]
#define reg03 XBYTE [0x8300]
#define reg04 XBYTE [0x8400]
#define reg05 XBYTE [0x8500]
#define reg06 XBYTE [0x8600]
#define reg07 XBYTE [0x8700]
#define reg08 XBYTE [0x8800]
#define reg09 XBYTE [0x8900]
#define reg0a XBYTE [0x8a00]
#define reg0b XBYTE [0x8b00]
#define reg0c XBYTE [0x8c00]
#define reg0d XBYTE [0x8d00]
#define reg0e XBYTE [0x8e00]
#define reg0f XBYTE [0x8f00]
#define reg10 XBYTE [0x9000]
#define reg11 XBYTE [0x9100]
#define reg12 XBYTE [0x9200]
#define reg13 XBYTE [0x9300]
#define reg14 XBYTE [0x9400]
#define reg15 XBYTE [0x9500]
#define reg16 XBYTE [0x9600]
#define reg17 XBYTE [0x9700]
#define reg18 XBYTE [0x9800]
#define reg19 XBYTE [0x9900]
#define reg1a XBYTE [0x9a00]
#define reg1b XBYTE [0x9b00]
#define reg1c XBYTE [0x9c00]
#define reg1d XBYTE [0x9d00]
#define reg1e XBYTE [0x9e00]
#define reg1f XBYTE [0x9f00]
//
struct eth_head
{
uchar dest_eth_addr[6];
uchar src_eth_addr[6];
uchar type;
};
struct ip_head
{
uchar vhl;
uchar tos;
uchar len;
uchar id;
uchar offset;
uchar ttl;
uchar protocol;
uchar chksum;
uchar dest_ip_addr[4];
uchar src_ip_addr[4];
};
struct udp_head
{
uchar srcport;
uchar destport;
uchar len;
uchar chksum;
uchar msg_data;
};
//
sbit reset=P1^1;
//
uchar code eth_addr[6]={0x2b,0x5d,0x46,0xa5,0x66,0xa8};
uchar code ip_addr[4]={192,168,1,102};
uchar code dest_ip_addr[4]={192,168,1,45};
uint hostport=10001;
uchar xdata udp_send_buff[1518];
uchar xdata udp_src_buff[1518];
bit txd_buffer_select;
//
void memspy(uchar *buf1,uchar *buf2,uint time)
{
uint t;
for(t=0;t <time;t++)
{
buf1[t]=buf2[t];
}
return;
}
//延时
void late1()
{
uint i;
for(i=30000;i> 0;i--);
}
//延时
void late2()
{
uchar i;
for(i=300;i> 0;i--);
}
//8019复位
void rst_8019()
{reset=1;
late1();
reset=0;
late1();
}
//选择寄存器页面
void pagechoice(uchar pagenumber)
{uchar temp;
temp=reg00;
temp=temp&0x3b;
pagenumber=pagenumber < <6;
temp=temp|pagenumber;
reg00=temp;
}
//ne2000初始化
void ne2000init()
{rst_8019();
reg00=0x21;
late2();
pagechoice(1);
reg01=eth_addr[0];
reg02=eth_addr[1];
reg03=eth_addr[2];
reg04=eth_addr[3];
reg05=eth_addr[4];
reg06=eth_addr[5];
pagechoice(0);
reg0a=0x00;
reg0b=0x00;
reg01=0x4c;
reg02=0x80;
reg03=0x4c;
reg04=0x40;
reg07=0xff;
reg0f=0x00;
reg0e=0xc8;
pagechoice(1);
reg07=0x4d;
reg08=0x00;//MAR0
reg09=0x41; //MAR1
reg0a=0x00; //MAR2
reg0b=0x80; //MAR3
reg0c=0x00; //MAR4
reg0d=0x00; //MAR5
reg0e=0x00; //MAR6
reg0f=0x00; //MAR7
pagechoice(0);
reg0c=0xcc;
reg0d=0xe0;
reg00=0x22;
reg07=0xff;
}
//udp数据装帧
void frame_udp_data(uchar *dest_ip_addr,uchar *dest_eth_addr,uint destport,uchar srcport,uchar *dat,uchar data_len)
{struct eth_head *eth;
struct ip_head *ip;
struct udp_head *udp;
uchar *p_data;
eth=&udp_send_buff[0];
ip=&udp_send_buff[14];
udp=&udp_send_buff[34];
p_data=&udp_send_buff[42];
//以太网报头装帧
memspy(eth-> dest_eth_addr,dest_eth_addr,6);
memspy(eth-> src_eth_addr,eth_addr,6);
eth-> type=0x0800;
//IP报头装帧
ip-> vhl=45;
ip-> tos=0;
ip-> len=data_len+18;
ip-> id=0;
ip-> ttl=0x80;
ip-> offset=0;
ip-> protocol=17;
ip-> chksum=0;
memspy(ip-> src_ip_addr,ip_addr,4);
memspy(ip-> dest_ip_addr,dest_ip_addr,4);
//UDP报头装帧
udp-> srcport=srcport;
udp-> destport=destport;
udp-> len=data_len+8;
udp-> chksum=0;
//
memspy(p_data,dat,data_len);
}
//数据发送
void send(uint lenth)
{ uchar i;
uint j;
pagechoice(0);
if(lenth <60)
lenth=60;
txd_buffer_select=!txd_buffer_select;
if(txd_buffer_select)
{reg09=0x40;
reg04=0x40;
}
else
{reg09=0x46;
reg04=0x46;
}
reg08=0x00;
reg0b=lenth> > 8;
reg0a=lenth&0xff;
reg00=0x12;
for(j=0;j <lenth;j++)
{reg10=udp_send_buff[j];
}
late2();
for(i=0;i <20;i++)
{reg06=lenth> > 8;
reg05=lenth&0xff;
reg00=0x3e;
for(j=0;j <1000;j++)
{if((reg00&0x04)!=0)
break;
if((reg04&0x01)!=0)
break;
}
}
reg07=0xff;
}
//udp数据发送
void udp_send(uchar *dest_ip_addr,uint src_port,uint dest_port,uchar *dat,uint len)
{
uchar *src_eth_addr;
frame_udp_data(dest_ip_addr,src_eth_addr,src_port,dest_port,dat,len);
send(len);
}
//主程序
main()
{ char bb[]="abcdefg";
ne2000init();
txd_buffer_select=0;
late2();
late1();
while(1)
{
udp_send(dest_ip_addr,10001,10001,&bb,8);
}
}