找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8602|回复: 24
打印 上一主题 下一主题
收起左侧

W5500以太网模块的51单片机控制源码

  [复制链接]
跳转到指定楼层
楼主
51单片机搭载以太网模块,实现UDP模式,服务器模式,客户端模式,源码分享,有需要的伙伴可以下载参考
全部资料51hei下载地址:
W5500模块-客户端模式例程(51单片机).zip (86.63 KB, 下载次数: 175)
W5500模块-服务端模式例程(51单片机).zip (86.31 KB, 下载次数: 116)
W5500模块-UDP模式例程(51单片机).zip (86.78 KB, 下载次数: 127)


单片机源程序如下:
  1. /***************************************************************************************
  2. * 工程名  :W5500模块-UDP模式例程
  3. * 描述    :W5500的端口0工作在UDP模式,端口通信不需要建立连接即可接收其它UDP模式端口发来的数据,
  4. *                         数据的前4个字节为对方端口IP地址,第5、6个字节为端口号,获得对方IP和端口号后W5500端口0
  5. *                         将定时给对应端口发送字符串"\r\nWelcome To ChuangWeiElec!\r\n",同时将接收
  6. *                         到的数据回发给对应端口。
  7. * 实验平台:51单片机开发板 + W5500以太网(TCP/IP)模块
  8. * 硬件连接:  P3^2 -> W5500_RST   
  9. *             P3^3 -> W5500_INT(本例程没有用到中断,此引脚可以不接)     
  10. *             P3^6 -> W5500_SCS      
  11. *             P3^7 -> W5500_SCK   
  12. *             P3^4 -> W5500_MISO   
  13. *             P3^5 -> W5500_MOSI   
  14. * 库版本  :ST_v3.5
  15. ***************************************************************************************/

  16. /*例程网络参数*/
  17. //网关:192.168.1.1
  18. //掩码:        255.255.255.0
  19. //物理地址:0C 29 AB 7C 00 01
  20. //本机IP地址:192.168.1.199
  21. //端口0的端口号:5000
  22. //端口0的目的IP地址:192.168.1.190
  23. //端口0的目的端口号:6000

  24. #include <reg51.h>
  25. #include "W5500.h"                               
  26. #include <string.h>

  27. void Delay(unsigned int d);                        //延时函数(ms)

  28. /*******************************************************************************
  29. * 函数名  : W5500_Initialization
  30. * 描述    : W5500初始货配置
  31. * 输入    : 无
  32. * 输出    : 无
  33. * 返回值  : 无
  34. * 说明    : 无
  35. *******************************************************************************/
  36. void W5500_Initialization(void)
  37. {
  38.         W5500_Init();                //初始化W5500寄存器函数
  39.         Detect_Gateway();        //检查网关服务器
  40.         Socket_Init(0);                //指定Socket(0~7)初始化,初始化端口0
  41. }

  42. /*******************************************************************************
  43. * 函数名  : Load_Net_Parameters
  44. * 描述    : 装载网络参数
  45. * 输入    : 无
  46. * 输出    : 无
  47. * 返回值  : 无
  48. * 说明    : 网关、掩码、物理地址、本机IP地址、端口号、目的IP地址、目的端口号、端口工作模式
  49. *******************************************************************************/
  50. void Load_Net_Parameters(void)
  51. {
  52.         Gateway_IP[0] = 192;//加载网关参数
  53.         Gateway_IP[1] = 168;
  54.         Gateway_IP[2] = 1;
  55.         Gateway_IP[3] = 1;

  56.         Sub_Mask[0]=255;//加载子网掩码
  57.         Sub_Mask[1]=255;
  58.         Sub_Mask[2]=255;
  59.         Sub_Mask[3]=0;

  60.         Phy_Addr[0]=0x0c;//加载物理地址
  61.         Phy_Addr[1]=0x29;
  62.         Phy_Addr[2]=0xab;
  63.         Phy_Addr[3]=0x7c;
  64.         Phy_Addr[4]=0x00;
  65.         Phy_Addr[5]=0x01;

  66.         IP_Addr[0]=192;//加载本机IP地址
  67.         IP_Addr[1]=168;
  68.         IP_Addr[2]=1;
  69.         IP_Addr[3]=199;

  70.         S0_Port[0] = 0x13;//加载端口0的端口号5000
  71.         S0_Port[1] = 0x88;

  72. //        S0_DIP[0]=192;//加载端口0的目的IP地址
  73. //        S0_DIP[1]=168;
  74. //        S0_DIP[2]=1;
  75. //        S0_DIP[3]=190;
  76. //       
  77. //        S0_DPort[0] = 0x17;//加载端口0的目的端口号6000
  78. //        S0_DPort[1] = 0x70;

  79. //        UDP_DIPR[0] = 192;        //UDP(广播)模式,目的主机IP地址
  80. //        UDP_DIPR[1] = 168;
  81. //        UDP_DIPR[2] = 1;
  82. //        UDP_DIPR[3] = 190;
  83. //
  84. //        UDP_DPORT[0] = 0x17;        //UDP(广播)模式,目的主机端口号
  85. //        UDP_DPORT[1] = 0x70;

  86.         S0_Mode=UDP_MODE;//加载端口0的工作模式,UDP模式
  87. }

  88. /*******************************************************************************
  89. * 函数名  : W5500_Socket_Set
  90. * 描述    : W5500端口初始化配置
  91. * 输入    : 无
  92. * 输出    : 无
  93. * 返回值  : 无
  94. * 说明    : 分别设置4个端口,根据端口工作模式,将端口置于TCP服务器、TCP客户端或UDP模式.
  95. *                        从端口状态字节Socket_State可以判断端口的工作情况
  96. *******************************************************************************/
  97. void W5500_Socket_Set(void)
  98. {
  99.         if(S0_State==0)//端口0初始化配置
  100.         {
  101.                 if(S0_Mode==TCP_SERVER)//TCP服务器模式
  102.                 {
  103.                         if(Socket_Listen(0)==TRUE)
  104.                                 S0_State=S_INIT;
  105.                         else
  106.                                 S0_State=0;
  107.                 }
  108.                 else if(S0_Mode==TCP_CLIENT)//TCP客户端模式
  109.                 {
  110.                         if(Socket_Connect(0)==TRUE)
  111.                                 S0_State=S_INIT;
  112.                         else
  113.                                 S0_State=0;
  114.                 }
  115.                 else//UDP模式
  116.                 {
  117.                         if(Socket_UDP(0)==TRUE)
  118.                                 S0_State=S_INIT|S_CONN;
  119.                         else
  120.                                 S0_State=0;
  121.                 }
  122.         }
  123. }

  124. /*******************************************************************************
  125. * 函数名  : Process_Socket_Data
  126. * 描述    : W5500接收并发送接收到的数据
  127. * 输入    : s:端口号
  128. * 输出    : 无
  129. * 返回值  : 无
  130. * 说明    : 本过程先调用S_rx_process()从W5500的端口接收数据缓冲区读取数据,
  131. *                        然后将读取的数据从Rx_Buffer拷贝到Temp_Buffer缓冲区进行处理。
  132. *                        处理完毕,将数据从Temp_Buffer拷贝到Tx_Buffer缓冲区。调用S_tx_process()
  133. *                        发送数据。
  134. *******************************************************************************/
  135. void Process_Socket_Data(SOCKET s)
  136. {
  137.         unsigned short size;
  138.         size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
  139.         UDP_DIPR[0] = Rx_Buffer[0];
  140.         UDP_DIPR[1] = Rx_Buffer[1];
  141.         UDP_DIPR[2] = Rx_Buffer[2];
  142.         UDP_DIPR[3] = Rx_Buffer[3];

  143.         UDP_DPORT[0] = Rx_Buffer[4];
  144.         UDP_DPORT[1] = Rx_Buffer[5];
  145.         memcpy(Tx_Buffer, Rx_Buffer+8, size-8);                       
  146.         Write_SOCK_Data_Buffer(s, Tx_Buffer, size);
  147. }

  148. /*******************************************************************************
  149. * 函数名  : main
  150. * 描述    : 主函数,用户程序从main函数开始运行
  151. * 输入    : 无
  152. * 输出    : 无
  153. * 返回值  : int:返回值为一个16位整形数
  154. * 说明    : 无
  155. *******************************************************************************/
  156. int main(void)
  157. {
  158.         unsigned int W5500_Send_Delay_Counter =0;

  159.         Load_Net_Parameters();                //装载网络参数       
  160.         W5500_Hardware_Reset();                //硬件复位W5500
  161.         W5500_Initialization();                //W5500初始货配置
  162.         while (1)
  163.         {
  164.                 W5500_Socket_Set();//W5500端口初始化配置
  165.                
  166.                 W5500_Interrupt_Process();//W5500中断处理程序框架

  167.                 if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到数据
  168.                 {
  169.                         S0_Data&=~S_RECEIVE;
  170.                         Process_Socket_Data(0);//W5500接收并发送接收到的数据
  171.                 }
  172.                 else if(W5500_Send_Delay_Counter >= 3000)//定时发送字符串
  173.                 {
  174.                         if(S0_State == (S_INIT|S_CONN))
  175.                         {
  176.                                 S0_Data&=~S_TRANSMITOK;
  177. ……………………

  178. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:456878 发表于 2019-1-12 21:30 | 只看该作者
感谢这么重要的学习资料,不过是不是用ch9121的方案更方便呢

评分

参与人数 1黑币 +15 收起 理由
凌净清河 + 15 赞一个!还有这种芯片,了解了

查看全部评分

回复

使用道具 举报

板凳
ID:387915 发表于 2019-7-14 09:30 | 只看该作者
我试了这个例程不能用啊,在STC89C51单片机用不了
回复

使用道具 举报

地板
ID:585455 发表于 2019-8-9 20:29 | 只看该作者
感謝分享
回复

使用道具 举报

5#
ID:585455 发表于 2019-8-12 23:10 | 只看该作者
STC89C52RC程式碼編譯沒問題
但是無法連線
ping不到

我用arduino uno連接w5500測試沒問題
表示硬件是ok的

不知版主是否能指導一下
回复

使用道具 举报

6#
ID:599723 发表于 2019-8-13 14:14 | 只看该作者

感謝分享
回复

使用道具 举报

7#
ID:614124 发表于 2019-10-19 18:03 | 只看该作者
是的,我使用STC12C5A60S2,亦不能用,ping不通,有没有什么秘诀?
回复

使用道具 举报

8#
ID:20672 发表于 2019-11-22 20:51 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ID:660412 发表于 2019-12-10 11:12 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:314228 发表于 2020-4-6 14:57 | 只看该作者
十分感谢
回复

使用道具 举报

11#
ID:742898 发表于 2020-5-2 17:16 | 只看该作者
感谢分享
回复

使用道具 举报

12#
ID:382220 发表于 2021-2-1 16:09 | 只看该作者
可以用的吗,我来测试一下
回复

使用道具 举报

13#
ID:153777 发表于 2022-3-2 22:44 | 只看该作者

感谢这么重要的学习资料,不过是不是用ch9121的方案更方便呢
回复

使用道具 举报

14#
ID:603160 发表于 2022-3-3 11:58 | 只看该作者
dzxqyt 发表于 2022-3-2 22:44
感谢这么重要的学习资料,不过是不是用ch9121的方案更方便呢

ch9121用的开源广场技小新PCB文件打板的,焊接了3块,一块都不行,用不了
回复

使用道具 举报

15#
ID:688893 发表于 2022-3-3 13:08 来自手机 | 只看该作者
我也遇到同样的问题
回复

使用道具 举报

16#
ID:688893 发表于 2022-3-3 13:10 来自手机 | 只看该作者
dzxqyt 发表于 2022-3-2 22:44
感谢这么重要的学习资料,不过是不是用ch9121的方案更方便呢

你们用的怎么样,我是用的联不上
回复

使用道具 举报

17#
ID:688008 发表于 2022-3-3 14:48 | 只看该作者
好用又不贵!
回复

使用道具 举报

18#
ID:688893 发表于 2022-5-3 23:44 来自手机 | 只看该作者
huogq 发表于 2022-3-3 13:10
你们用的怎么样,我是用的联不上

可以用,我都联上了。
回复

使用道具 举报

19#
ID:307719 发表于 2022-5-23 09:33 | 只看该作者
我也是用ch9121方案的

222.png (569.34 KB, 下载次数: 77)

222.png

9121.png (568.61 KB, 下载次数: 80)

9121.png

22222.png (496.05 KB, 下载次数: 81)

22222.png
回复

使用道具 举报

20#
ID:932719 发表于 2023-6-13 10:22 | 只看该作者
DHCP的有吗?
回复

使用道具 举报

21#
ID:1085441 发表于 2023-6-30 20:45 | 只看该作者
W5500刚调通,收发数据都可以,我用的单片机是STC8C2K64S4
回复

使用道具 举报

22#
ID:796531 发表于 2023-6-30 21:49 | 只看该作者
好东西,手头正好有W5500以太网模块,借鉴程序来试试
回复

使用道具 举报

23#
ID:1085441 发表于 2023-7-1 00:18 | 只看该作者
liangjing 发表于 2019-1-12 21:30
感谢这么重要的学习资料,不过是不是用ch9121的方案更方便呢

刚才看了一下CH9121,感觉比W5500简单,准备试试CH9121
回复

使用道具 举报

24#
ID:1086732 发表于 2023-7-1 08:54 | 只看该作者
太好了。刚才看了一下CH9121,感觉比W5500简单,准备试试CH9121
回复

使用道具 举报

25#
ID:1085441 发表于 2023-7-2 01:48 | 只看该作者
如果不需要多个socket,可以用CH9120,更简单一些,价格也便宜一些。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表