导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→哪位大哥作过用8019做以太网通讯的啊 看看我这个程序有什么

* 100101: 哪位大哥作过用8019做以太网通讯的啊 看看我这个程序有什么问题啊

   hysi2005 
hysi2005发表的帖子 

 哪位大哥作过用8019做以太网通讯的啊 看看我这个程序有什么问题啊
这个只是UDP发送的程序 直接调试板子和PC之间的通讯
#include   <reg51.h>  
#include   <absacc.h>  
#define uchar unsigned char
#define uint unsigned int

#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);
    }
}


发表时间:2006年11月30日10:16:06

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:问题不清楚,无法回答你得告诉大伙已知条件和要求的结果,否则怎么回答啊,比如已知正弦值求角度
[下一篇帖子]:发现一个资源和高手巨多的电子开发网,给大家共享一下发现一个资源和高手巨多的电子开发网,不敢独享 BR