找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ESP8266模块与单片机的通信程序(硬件与软件详解)

  [复制链接]
跳转到指定楼层
楼主
  初次接触ESP8266模块,说实话还是费了很大的劲,从硬件部分到软件部分,一个一个的问题对于我这个新手来说,确实有些吃力。不过还好,在51hei电子论坛有很多这方面的资料,也有很多很友好的人,感谢他们给予的帮助。
  虽然我是一个菜鸟,但我还是希望和大家分享一下。时间比较仓促,代码也有很多不成熟的地方,希望能对初次接触这个模块的人有一些帮助。
  1,硬件:USB转TTL是必需的,ESP8266模块,一般模块出厂就已经烧好了固件,拿到就可以直接发AT指令,AT指令的手册网上很多,可以自行百度。
  硬件连接  TXD-RXD, RXD-TXD; 交叉连接,有的模块需要自己拉高一个引脚的电平,如图所示,电源最好是3.3V,模块发热很严重,不要长时间接电。
  2 ,软件:在执行代码之前,模块要先设定好什么模式,用串口助手发送AT指令设定。我的是AP模式,模块设定为server端,然后生成一个WiFi,名字随   意,这个时候(当然得知道模块的IP地址),可以用电脑上的网络助手,尝试连接模块,电脑必须连接ESP8266模块产生的WiFi才可以;这几步之后,模块就可以连接已经下载好的单片机了,在上面设定好之后,模块断电重启后,在设定的模式不会变,WiFi不会变,后面的指令就需要通过单片机发送了。到这儿基本就可以实现简单的通讯了,程序工程已附上。

时间仓促,我也是这几天才学的,分享只是为了更多的分享,不足的地方希望谅解,目前准备做433M。有愿意指导的或是技术交流的可以加我qq1946706342

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit D1 = P2^0;
  7. sbit D2 = P2^1;
  8. sbit D3 = P2^2;
  9. sbit D4 = P2^3;
  10. sbit D5 = P2^4;
  11. sbit D6 = P2^5;
  12. sbit D7 = P2^6;
  13. sbit D8 = P2^7;

  14. uchar Receive;
  15. uchar Recive_table[15];
  16. uchar flag = 1;
  17. uchar flag1 = 1;
  18. uchar flag2 = 0;
  19. uchar num = 0;
  20. uint i=0;
  21. void ms_delay(uint n)        
  22. {
  23.         uint j,m;
  24.         for( m =n; m>0; m--)
  25.         for(j=110; j>0; j--);
  26. }
  27. void us_delay(uchar n)
  28. {
  29.         while(n--);
  30. }

  31. void Usart_init()
  32. {
  33.         SCON = 0x50;        //设置串行口工作在方式一,且启动串行口接收(REN=1)
  34.         TMOD = 0x20;        //设置计数器1工作在方式二,即自动重装计数值(8位)
  35.         PCON=0X80;
  36.         TH1 = 0xf3;                //设置波特率为4800
  37.         TL1 = 0xf3;
  38.         
  39.         EA = 1;       //开总中断
  40.         TR1 = 1;                         //启动计数器
  41. }

  42. void sent_AT(uchar *at_comd)
  43. {
  44.         ES = 0;
  45.         while(*at_comd != '\0')  //字符串结束标志
  46.         {
  47.                 TI = 0;
  48.                 SBUF = *at_comd;
  49.                 while(!TI);
  50.                 TI = 0;
  51.                 us_delay(5);
  52.                 at_comd++;
  53.         }
  54.         us_delay(5);
  55.         SBUF = '\r';
  56.         while(!TI);
  57.         TI = 0;
  58.         us_delay(5);
  59.         SBUF = '\n';
  60.         while(!TI);
  61.         TI = 0;
  62. }
  63. void main()
  64. {

  65.                 uchar Recivedat;
  66.         //        uchar Rec;
  67.         
  68.                 Usart_init();
  69.                 ms_delay(5000);
  70.                 ES = 0;
  71.                 while(flag == 1){
  72.                         sent_AT("AT+CIPMUX=1");//最方便的是直接printf("AT+CIPMUX=1\r\n");我想弄清楚发送原理,所以绕了一个弯
  73.                                 flag1 = 1;
  74.                                 while(flag1 == 1)//检测模块是否返回OK
  75.                                 {
  76.                                         if(RI)
  77.                                         {
  78.                                                 RI = 0;
  79.                                                 Recivedat = SBUF;
  80.                                                 if(Recivedat == 'K')
  81.                                                 {
  82.                                                         flag = 0;
  83.                                                         flag1 = 0;
  84.                                                 }
  85.                                         }
  86.                                         num++;
  87.                                         if(num == 1000)
  88.                                         {
  89.                                                 num = 0;
  90.                                                 flag1 = 0;
  91.                                         }
  92.                                 }
  93.                         }
  94.                 flag = 1;
  95.                 flag1 = 1;
  96.                 num = 0;
  97.           D1 = 0;
  98.                         
  99.                 while(flag == 1){
  100.                                 sent_AT("AT+CIPSERVER=1,8080");
  101.                                 flag1 = 1;
  102.                                 while(flag1 == 1)
  103.                                 {
  104.                                         if(RI)
  105.                                         {
  106.                                                 RI = 0;
  107.                                                 Recivedat = SBUF;
  108.                                                 if(Recivedat == 'K')
  109.                                                 {
  110.                                                         flag = 0;
  111.                                                         flag1 = 0;
  112.                                                 }
  113.                                         }
  114.                                         num++;
  115.                                         if(num == 1000)
  116.                                         {
  117.                                                 num = 0;
  118.                                                 flag1 = 0;
  119.                                         }
  120.                                 }
  121.                         }
  122.                 flag = 1;
  123.                 flag1 = 1;
  124.                 num = 0;
  125.                 D2 = 0;                        
  126. //                RI=0;

  127.         ES = 1;        //开串口中断,接收完数据,进行处理
  128.         while(1);//挂住不让代码死掉
  129. }

  130. void Usat()interrupt 4//串口中断里面接收从client端发过来的信息
  131. {
  132.                 if(RI==1)
  133.                 {
  134.                         RI=0;
  135.                         Recive_table[i] = SBUF;
  136.                         if(Recive_table[0]=='+')
  137.                         {
  138.                                 D3=0;
  139.                                 i++;
  140.                         }else{
  141.                                 D4=0;
  142.                                 i=0;
  143.                         }
  144.                         if(i>=10)  //这个参数很重要,因为i++
  145.                         {        
  146. ……………………

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

所有资料51hei提供下载:
wifi_51_3.rar (31.37 KB, 下载次数: 827)


评分

参与人数 2黑币 +105 收起 理由
aiaiaia + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:217448 发表于 2018-2-11 16:53 | 只看该作者
好定西,值得参考
回复

使用道具 举报

板凳
ID:311693 发表于 2018-4-19 15:15 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:314506 发表于 2018-4-27 11:05 | 只看该作者
那个RST引脚和IO-O引脚是不是不用接?
回复

使用道具 举报

5#
ID:317780 发表于 2018-4-27 14:52 | 只看该作者
感谢分享
回复

使用道具 举报

6#
ID:66302 发表于 2018-4-30 13:22 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:346924 发表于 2018-6-14 17:41 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:120672 发表于 2018-7-8 22:58 | 只看该作者
perfect123 发表于 2018-6-30 15:13
你写了半天代码,也没说清楚到底实现了什么功能,硬件连接实物图也没有照片

你真看代码了吗?实现的功能就是用单片机对ESP8266进行设置。
回复

使用道具 举报

9#
ID:352182 发表于 2018-7-10 21:28 | 只看该作者
感谢楼主分享
回复

使用道具 举报

10#
ID:373010 发表于 2018-7-21 10:36 | 只看该作者
楼主你好,请问下你单片机发送指令时候,不用带\r\n吗?

另外有个问题想请教,我用C51单片机开发板,把C51的TXD,RXD和ESP2866RXD,TXD连接后,用串口助手链接到开发板的COM口,都是直接联入ESP2866里面,C51不响应我发送的指令,但是ESP2866会响应,请问您有没有遇到这个情况?
回复

使用道具 举报

11#
ID:364328 发表于 2018-7-26 09:55 | 只看该作者
电路图能不能看看呢
回复

使用道具 举报

12#
ID:328493 发表于 2018-7-30 17:46 | 只看该作者
谢谢分享
回复

使用道具 举报

13#
ID:280466 发表于 2018-8-7 20:52 | 只看该作者
不错的
回复

使用道具 举报

14#
ID:382890 发表于 2018-8-8 09:26 | 只看该作者
stinfo 发表于 2018-7-21 10:36
楼主你好,请问下你单片机发送指令时候,不用带\r\n吗?

另外有个问题想请教,我用C51单片机开发板,把C ...

如果发的指令后面不带\r\n,ESP8266就不会有回复
回复

使用道具 举报

15#
ID:58110 发表于 2018-8-9 07:08 | 只看该作者
在此基础上,是否可以通过ESP8266读取某网站的天气信息?
一直没有找到用51单片机获得天气信心的资料
回复

使用道具 举报

16#
ID:384430 发表于 2018-8-9 08:10 | 只看该作者
好东西,学习一下
回复

使用道具 举报

17#
ID:336603 发表于 2018-9-4 19:12 | 只看该作者
惯性想象me 发表于 2018-4-27 11:05
那个RST引脚和IO-O引脚是不是不用接?

我也想知道诶,请问一下你找到答案了吗?
回复

使用道具 举报

18#
ID:395175 发表于 2018-9-7 21:34 | 只看该作者
很给力!
回复

使用道具 举报

19#
ID:395175 发表于 2018-9-7 22:39 | 只看该作者
好东西
回复

使用道具 举报

20#
ID:109365 发表于 2018-10-4 13:31 | 只看该作者
点赞!!!!!!!!!!!!!!!!
回复

使用道具 举报

21#
ID:297735 发表于 2018-10-5 16:35 | 只看该作者
看看啊看
回复

使用道具 举报

22#
ID:418276 发表于 2018-10-31 01:51 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

23#
ID:411697 发表于 2018-10-31 09:21 来自手机 | 只看该作者
谢谢分享,这个可以用吗
回复

使用道具 举报

24#
ID:413993 发表于 2018-11-12 09:41 | 只看该作者
谢谢分享
回复

使用道具 举报

25#
ID:339500 发表于 2018-11-12 17:32 | 只看该作者
lyMarvin 发表于 2018-8-9 07:08
在此基础上,是否可以通过ESP8266读取某网站的天气信息?
一直没有找到用51单片机获得天气信心的资料

和你做同一样东西,至于天气情况我能通过Python爬取天气网站信息获得,那么如何通过8266+c51----电脑之间连接数据我就不懂了
回复

使用道具 举报

26#
ID:424996 发表于 2018-11-14 11:22 | 只看该作者
很好,很清楚
回复

使用道具 举报

27#
ID:437316 发表于 2018-12-1 19:43 | 只看该作者
硬件连接那部分学习到了,谢谢
回复

使用道具 举报

28#
ID:489266 发表于 2019-3-12 15:29 | 只看该作者
还没试过
回复

使用道具 举报

29#
ID:490403 发表于 2019-3-14 03:24 | 只看该作者
谢谢分享!
回复

使用道具 举报

30#
ID:490559 发表于 2019-3-14 11:13 | 只看该作者
谢谢楼主分享!
回复

使用道具 举报

31#
ID:495308 发表于 2019-3-21 12:55 | 只看该作者
我顶楼主,我想问个问题,就是esp8266如何发送数据给51单片机
回复

使用道具 举报

32#
ID:496159 发表于 2019-3-22 15:06 | 只看该作者
太感谢您的帮助了
回复

使用道具 举报

33#
ID:496765 发表于 2019-3-23 16:04 | 只看该作者
谢谢分享
回复

使用道具 举报

34#
ID:367948 发表于 2019-4-10 20:33 | 只看该作者
正想学习ESP8266,谢谢楼主
回复

使用道具 举报

35#
ID:403027 发表于 2019-4-16 12:49 | 只看该作者
谢谢分享!!!!!!!
回复

使用道具 举报

36#
ID:479547 发表于 2019-4-17 17:15 | 只看该作者
好东西呀
回复

使用道具 举报

37#
ID:514993 发表于 2019-4-17 21:28 | 只看该作者
谢谢楼主  之前8266一直是用延时做的 现在能让他自行判断了
回复

使用道具 举报

38#
ID:470508 发表于 2019-4-22 22:33 | 只看该作者
为什么我的WiFi模块连接上单片机 通过sscom发送AT指令 串口没有反应
回复

使用道具 举报

39#
ID:463636 发表于 2019-5-9 22:00 | 只看该作者
这真的很不错
回复

使用道具 举报

40#
ID:501681 发表于 2019-5-15 22:58 | 只看该作者
很好用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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