标题: ESP8266模块与单片机的通信程序(硬件与软件详解) [打印本页]

作者: fkup    时间: 2017-12-27 16:44
标题: 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)



作者: ntlclxyc    时间: 2018-2-11 16:53
好定西,值得参考
作者: 妒不    时间: 2018-4-19 15:15
谢谢分享
作者: 惯性想象me    时间: 2018-4-27 11:05
那个RST引脚和IO-O引脚是不是不用接?
作者: 戚嘉丶    时间: 2018-4-27 14:52
感谢分享
作者: 76711031    时间: 2018-4-30 13:22
谢谢分享
作者: 余大哥    时间: 2018-6-14 17:41
谢谢分享
作者: aj8714523    时间: 2018-7-8 22:58
perfect123 发表于 2018-6-30 15:13
你写了半天代码,也没说清楚到底实现了什么功能,硬件连接实物图也没有照片

你真看代码了吗?实现的功能就是用单片机对ESP8266进行设置。
作者: jhyeqf    时间: 2018-7-10 21:28
感谢楼主分享
作者: stinfo    时间: 2018-7-21 10:36
楼主你好,请问下你单片机发送指令时候,不用带\r\n吗?

另外有个问题想请教,我用C51单片机开发板,把C51的TXD,RXD和ESP2866RXD,TXD连接后,用串口助手链接到开发板的COM口,都是直接联入ESP2866里面,C51不响应我发送的指令,但是ESP2866会响应,请问您有没有遇到这个情况?
作者: qwthh    时间: 2018-7-26 09:55
电路图能不能看看呢

作者: 特儿小跟班    时间: 2018-7-30 17:46
谢谢分享

作者: fuzhoudaxuelin    时间: 2018-8-7 20:52
不错的
作者: yrb1993    时间: 2018-8-8 09:26
stinfo 发表于 2018-7-21 10:36
楼主你好,请问下你单片机发送指令时候,不用带\r\n吗?

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

如果发的指令后面不带\r\n,ESP8266就不会有回复
作者: lyMarvin    时间: 2018-8-9 07:08
在此基础上,是否可以通过ESP8266读取某网站的天气信息?
一直没有找到用51单片机获得天气信心的资料
作者: lizengjie    时间: 2018-8-9 08:10
好东西,学习一下
作者: 中分男神    时间: 2018-9-4 19:12
惯性想象me 发表于 2018-4-27 11:05
那个RST引脚和IO-O引脚是不是不用接?

我也想知道诶,请问一下你找到答案了吗?
作者: leviiii    时间: 2018-9-7 21:34
很给力!
作者: leviiii    时间: 2018-9-7 22:39
好东西
作者: yleer3407    时间: 2018-10-4 13:31
点赞!!!!!!!!!!!!!!!!
作者: Duo2048    时间: 2018-10-5 16:35
看看啊看
作者: zjj1998    时间: 2018-10-31 01:51
感谢楼主分享!
作者: 单片机1234567    时间: 2018-10-31 09:21
谢谢分享,这个可以用吗
作者: gogokl    时间: 2018-11-12 09:41
谢谢分享
作者: qq23230233    时间: 2018-11-12 17:32
lyMarvin 发表于 2018-8-9 07:08
在此基础上,是否可以通过ESP8266读取某网站的天气信息?
一直没有找到用51单片机获得天气信心的资料

和你做同一样东西,至于天气情况我能通过Python爬取天气网站信息获得,那么如何通过8266+c51----电脑之间连接数据我就不懂了
作者: zhao321    时间: 2018-11-14 11:22
很好,很清楚
作者: zdxshr    时间: 2018-12-1 19:43
硬件连接那部分学习到了,谢谢
作者: qxm666    时间: 2019-3-12 15:29
还没试过
作者: 811787454    时间: 2019-3-14 03:24
谢谢分享!
作者: ZICHENGYINGJIAN    时间: 2019-3-14 11:13
谢谢楼主分享!
作者: zcy5621194    时间: 2019-3-21 12:55
我顶楼主,我想问个问题,就是esp8266如何发送数据给51单片机
作者: fanxiaoer    时间: 2019-3-22 15:06
太感谢您的帮助了
作者: JC111111    时间: 2019-3-23 16:04
谢谢分享
作者: wanglx    时间: 2019-4-10 20:33
正想学习ESP8266,谢谢楼主
作者: ben0147    时间: 2019-4-16 12:49
谢谢分享!!!!!!!
作者: qinjiabao    时间: 2019-4-17 17:15
好东西呀
作者: HughDai    时间: 2019-4-17 21:28
谢谢楼主  之前8266一直是用延时做的 现在能让他自行判断了
作者: JamesGordan    时间: 2019-4-22 22:33
为什么我的WiFi模块连接上单片机 通过sscom发送AT指令 串口没有反应
作者: 1962306553    时间: 2019-5-9 22:00
这真的很不错
作者: 西瓜不懂柠檬    时间: 2019-5-15 22:58
很好用
作者: gnalorange    时间: 2019-5-25 21:50
是完整资料么?
作者: panlongdian    时间: 2019-5-26 09:53
感谢分享,有时间可以做做。
作者: lwh999995    时间: 2019-6-6 23:05
学习学习!!!!!!!!  AT没怎么玩过,用的SDK
作者: jemery1030    时间: 2019-7-19 12:07
感謝寶貴資料無私分享
作者: 追蝴蝶的猫    时间: 2019-7-25 17:29
感谢楼主分享
作者: 401086798    时间: 2019-10-23 12:55
感谢楼主
作者: ouwen    时间: 2019-11-4 16:51
谢谢楼主
作者: szzxl10    时间: 2019-11-4 18:08
这真的很不错
作者: GitHub    时间: 2019-11-5 09:20
不错,初学有意
作者: diligence丶    时间: 2019-11-14 11:32
谢谢,很不错啊
作者: pxh316    时间: 2019-11-30 09:41
谢谢楼主分享
作者: 1286086241    时间: 2019-12-16 02:10
谢谢分享!
作者: STC89C54RC    时间: 2019-12-27 16:51
正在准备学习, 模块也到了, 希望能有帮助。感谢楼主分享。
作者: A_heibai    时间: 2020-5-22 16:36
感谢分享!!
作者: fannec    时间: 2021-6-28 09:08
也是新人,刚好可以学习,感谢分享。
作者: 12111lll    时间: 2022-1-16 23:30
stinfo 发表于 2018-7-21 10:36
楼主你好,请问下你单片机发送指令时候,不用带\r\n吗?

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

你解决这个问题了嘛,我遇到了





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1