历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2019年10月25日 | ESP8266模块与单片机的通信程序(硬件与软件详解)

2019-10-25 来源:51hei

初次接触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


单片机源程序如下:

#include

#include

#include

#define uchar unsigned char 

#define uint unsigned int 


sbit D1 = P2^0;

sbit D2 = P2^1;

sbit D3 = P2^2;

sbit D4 = P2^3;

sbit D5 = P2^4;

sbit D6 = P2^5;

sbit D7 = P2^6;

sbit D8 = P2^7;


uchar Receive;

uchar Recive_table[15];

uchar flag = 1;

uchar flag1 = 1;

uchar flag2 = 0;

uchar num = 0;

uint i=0;

void ms_delay(uint n)        

{

        uint j,m;

        for( m =n; m>0; m--)

        for(j=110; j>0; j--);

}

void us_delay(uchar n)

{

        while(n--);

}


void Usart_init()

{

        SCON = 0x50;        //设置串行口工作在方式一,且启动串行口接收(REN=1)

        TMOD = 0x20;        //设置计数器1工作在方式二,即自动重装计数值(8位)

        PCON=0X80;

        TH1 = 0xf3;                //设置波特率为4800

        TL1 = 0xf3;

        

        EA = 1;       //开总中断

        TR1 = 1;                         //启动计数器

}


void sent_AT(uchar *at_comd)

{

        ES = 0;

        while(*at_comd != '')  //字符串结束标志

        {

                TI = 0;

                SBUF = *at_comd;

                while(!TI);

                TI = 0;

                us_delay(5);

                at_comd++;

        }

        us_delay(5);

        SBUF = 'r';

        while(!TI);

        TI = 0;

        us_delay(5);

        SBUF = 'n';

        while(!TI);

        TI = 0;

}

void main()

{


                uchar Recivedat;

        //        uchar Rec;

        

                Usart_init();

                ms_delay(5000);

                ES = 0;

                while(flag == 1){

                        sent_AT("AT+CIPMUX=1");//最方便的是直接printf("AT+CIPMUX=1rn");我想弄清楚发送原理,所以绕了一个弯

                                flag1 = 1;

                                while(flag1 == 1)//检测模块是否返回OK

                                {

                                        if(RI)

                                        {

                                                RI = 0;

                                                Recivedat = SBUF;

                                                if(Recivedat == 'K')

                                                {

                                                        flag = 0;

                                                        flag1 = 0;

                                                }

                                        }

                                        num++;

                                        if(num == 1000)

                                        {

                                                num = 0;

                                                flag1 = 0;

                                        }

                                }

                        }

                flag = 1;

                flag1 = 1;

                num = 0;

          D1 = 0;

                        

                while(flag == 1){

                                sent_AT("AT+CIPSERVER=1,8080");

                                flag1 = 1;

                                while(flag1 == 1)

                                {

                                        if(RI)

                                        {

                                                RI = 0;

                                                Recivedat = SBUF;

                                                if(Recivedat == 'K')

                                                {

                                                        flag = 0;

                                                        flag1 = 0;

                                                }

                                        }

                                        num++;

                                        if(num == 1000)

                                        {

                                                num = 0;

                                                flag1 = 0;

推荐阅读

史海拾趣

Cree(科瑞)公司的发展小趣事

随着全球LED市场的日益成熟,竞争也日趋激烈。面对这一形势,Cree通过收购和出售的方式,逐渐调整了其在LED市场的主要业务。这一战略调整使得Cree能够专注于更高端、更具技术含量的LED产品研发和生产,从而保持了其在行业内的领先地位。

Hirschmann公司的发展小趣事
在通信领域中,定时电路也扮演着重要角色。例如,在数字通信系统中,定时电路可以用于产生同步信号或控制信号的定时发送。这种可编程定时电路可以根据通信协议的要求灵活设置定时参数,确保通信过程的稳定性和可靠性。
ATO SOLUTION公司的发展小趣事

面对日益激烈的市场竞争,ATO SOLUTION公司不断创新营销策略,提升品牌知名度和影响力。公司利用互联网和社交媒体等新媒体平台,开展线上宣传和推广活动;同时,还积极参加各类行业展会和论坛,与业界同行和潜在客户进行深入交流和合作。这些创新的营销策略有效地提升了公司的市场影响力,为公司的业务拓展提供了有力支持。

Essentra Components公司的发展小趣事

Essentra Components公司一直将客户服务放在首位,通过提供优质的售前咨询、售中支持和售后服务,赢得了客户的广泛赞誉。公司不仅为客户提供了丰富的产品选择,还根据客户的具体需求提供定制化的解决方案。此外,公司还建立了完善的物流配送体系,确保产品能够及时、准确地送达客户手中。这些努力使得Essentra Components在客户中树立了良好的口碑,为公司的发展奠定了坚实的基础。

Amkor公司的发展小趣事

Essentra Components公司自创立之初,就深知技术创新在电子行业的重要性。公司通过不断投入研发资源,成功开发出了一系列具有创新性的塑料注塑成型、乙烯基浸塑成型技术,这些技术不仅提高了产品的性能和质量,还大大降低了生产成本。随着技术的不断升级和完善,Essentra Components的产品逐渐在市场上占据了重要地位,公司也因此迅速发展壮大。

AIRPAX公司的发展小趣事

近年来,随着数字化技术的快速发展,AIRPAX也开始积极探索数字化转型之路。公司加大了对智能化、自动化生产线的投入,提高了生产效率和质量。同时,AIRPAX还积极利用大数据、云计算等先进技术,对客户需求和市场趋势进行深入分析,以更好地满足客户需求并推动创新发展。

这些故事只是AIRPAX发展历程中的一部分,它们展示了AIRPAX如何在技术、市场、环保和创新等多个方面取得了显著成就。然而,随着电子行业的不断发展和竞争的加剧,AIRPAX仍需继续努力,以保持其在电气保护领域的领先地位。

问答坊 | AI 解惑

大学时代影响我的人生的10件大事

在大学里我对人生有了新的认识,也想清楚了很多问题.大一时候曾经迷茫,大二也曾经郁闷,\"郁闷\"似乎是现在大学生的口头禅.今天,这些感觉正随着时间慢慢褪去.我觉得这是很正常的.   关于排名第一的那件事情,现在的想法还不系统,而思考也随 ...…

查看全部问答>

E题最新分析

本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 内有图片为证  …

查看全部问答>

双激式变压器开关电源(part1) 开关电源原理与设计(连载26)

1-8.双激式变压器开关电源 所谓双激式变压器开关电源,就是指在一个工作周期之内,变压器的初级线圈分别被直流电压正、反激励两次。与单激式变压器开关电源不同,双激式变压器开关电源一般在整个工作周期之内,都向负载提供功率输出。双激式变压 ...…

查看全部问答>

单片机视频教程【10】LCD1602液晶

$(\'swf_r2D\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30391850/v.swf\'), ...…

查看全部问答>

关于S3C2410的DMA 实验的问题

实验代码里有: for(i=srcAddr; i…

查看全部问答>

-------- win ce 模拟问题 ------------

在windows xp 操作系统下安装了Windows CE 5.0 和EVC 4.0   Windows CE 5.0 内容包括:Documentation                            Micros ...…

查看全部问答>

关于InterlockedIncrement的问题

关于InterlockedIncrement,在winbase.h中有如下定义: …… #elif defined(x86) #pragma warning(disable:4035)               // re-enable below   __inline   LON ...…

查看全部问答>

Linux设备驱动开发专业论坛--www.linuxdriver.cn开通散分(100)

尊敬的各位同行: 大家好!开设Linuxdriver.cn的想法由来已久,最近终于得闲启动了这个社区。这里根据Linux设备驱动开发专业论坛linuxdriver.cn工程师关心的问题,分门别类地给出了如下版块: (1)Linux内核分析 讨论Linux内核的移植,以及Linu ...…

查看全部问答>

串口读取数据问题

现有一个串口类,读取数据使用事件触发模式。setcommmask(hComm,ev_rxchar|ev_rxflag),另一个程序每隔一定时间向串口发送数据,时间间隔大约为20ms,现用这个串口类读取数据,readfile一看,一次竟然读了好几条数据!!在读的线程中使用GetTickCoun ...…

查看全部问答>