1. 程式人生 > >製作esp8266+c51,點亮微控制器上的led小燈

製作esp8266+c51,點亮微控制器上的led小燈

最近有朋友讓我做一個手機通過wifi控制51微控制器led小燈(功能很簡單,就是一個床頭燈)。我上網查了查,esp8266wifi模組功能很強大,但是沒有基於51的(其實有幾篇,但是通過實踐都不好使,不知道是我沒做對,還是別的原因)。所以在這裡寫一篇部落格,說一下我的製作過程。

1、硬體部分


這是我在某寶上買的esp8266模組,十幾塊一個,首先測試一下模組是否好使。

模組跟一個串列埠模組連線(因為esp8266要有一個管腳要拉高,所以要改造一下)。電源最好是3.3V,有人說5V沒事,我剛開始測試的用5V,發熱量挺大的,都燙手,但是好使,結果有一天突然flash燒了,不知道怎麼回事,所以最好還是要3.3V。


這裡盜一張別人的管腳圖。


通過傳送AT指令測試,在這裡我改寫了esp8266的波特率(預設為115200,但是51微控制器最高為9600),和wifi名字和密碼(改寫完成後重啟也不會改變)

至於截圖我忘了截,但是網上有很多,或是賣家資料也有,可以參考一下,很簡單的。

2、軟體部分(我把程式打包了,可以參考一下,裡面寫的很詳細)

這是main.c

#include <reg52.h>
#include <string.h>
#include "usart.h"
#include "wifi.h"


char Recive_table[20]="";  //接收緩衝,最大20個位元組
char Recive_state = 0;  //接收完成標誌


int main (void)
{


/********************功能初始化***********************/


 Uart_Init();//串列埠初始化,波特率為9600
ms_delay(1000) ;
    WIFI_Init();//wifi初始化


/****************************************************/


/**********************主迴圈************************/

for(;;)
{
ms_delay(10) ;
if(Recive_state == 1)
{
ES=0;  //清空接收標誌位 
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//接收到的字串形式為+IPD,x,x:y
            {
                if((Recive_table[3]=='D')&&(Recive_table[6]==','))
                {   
                if(Recive_table[9]=='0')
P1 = 0;
if(Recive_table[9]=='1')
P1 = 0xff;
}
}
memset(Recive_table,'\0',20);
Recive_state = 0;
ES=1;  //開啟接收標誌位
}
}


/****************************************************/
  
}




/******************************************************************
函式:void Uart_Interrupt() interrupt 4
功能:串列埠中斷函式,將收到的字元存到Recive_table[]陣列中
引數:無
返回值: 無
*******************************************************************/


void Uart_Interrupt() interrupt 4         
{   
static char i=0;  //因為是一位一位接收,所以用static
if(RI==1)   
{  
ES = 0;
RI=0;         
Recive_table[i]=SBUF;        
i++; 
if((Recive_table[i-1] == '\n'))
{
Recive_table[i]='\0';
i=0; 
Recive_state = 1;
}
ES = 1;     
}
else
TI = 0;     
 } 

這是usart.c

#include "usart.h"


/******************************************************************
函式:void Uart_Init(void)
功能:串列埠初始化,波特率為9600(這個不會,上網百度)
引數:無
返回值: 無
*******************************************************************/
void Uart_Init(void)
{  


TMOD=0x20;
TH1=0xfD;
TL1=0xfD;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;


}

這是wifi.c

#include <stdio.h>
#include "wifi.h"


/******************************************************************
函式:void ms_delay(int t)
功能:毫秒級延時
引數:無
返回值: 無
*******************************************************************/
void ms_delay(int t) 
{  
int i,j; 
 for(i=t;i>0;i--)   
for(j=110;j>0;j--); 
}


/******************************************************************
函式:void LED(void)
功能:傳送完命令後顯示用的函式
引數:無
返回值: 無
*******************************************************************/
void LED(void)
{


P1 = 0;
ms_delay(100);
P1 = 0xff;
ms_delay(100);


}


/******************************************************************
函式:void WIFI_Init(void)
功能:wifi初始化(名字:esp8266;密碼:1234567890)
引數:無
返回值: 無
*******************************************************************/
void WIFI_Init(void)
{


ES = 0;
TI = 1;


printf("AT+RST\r\n");
LED();
ms_delay(1000) ;


printf("AT+CWMODE=3\r\n");
LED();
ms_delay(1000) ;


printf("AT+CIPMUX=1\r\n");
LED(); 
ms_delay(1000) ;


printf("AT+CIPSERVER=1,8080\r\n");
LED();
ms_delay(1000) ;


while(!TI);
TI = 0;
ES = 1;


}

3、最後成品,


esp8266通過51微控制器的串列埠(P3.0—R,P3.1—T)連線,電腦或是手機用軟體連線,模式選擇TCPClient,IP填192.168.4.1(一般都是這個,不是的話自己檢視一下),埠是8080(因為是我自己設定的)。點選連線就能連上了(這時候wifi要連上,別忘了,我有好幾次忘連了,怎麼連都連不上)。我的目的很簡單,傳送0,led亮,傳送1,led滅。

這是最後成品樣子,但是我這裡程式上有個bug,就是第一次傳送的資料,要在第二次傳送資料的時候才能處理(第一次傳送0,不亮,在傳送1,就亮了,在傳送0,滅了)。

做到這裡不想做了,所以希望誰知道是怎麼回事的,告訴我一聲,感激不盡,我QQ是516912066,大家交流一下!!!!