入门级教程,大神请飘过
最近做了个esp8266与手机app的点灯和温度回传小实验。在51单片机上完成温度读取和小灯的控制。
esp8266入手,先是阅读数据手册,看WiFi模块esp8266工作的波特率,了解AT指令。
我使用的esp8266模块波特率是115200,型号是ATK-esp8266.
esp8266工作在AP模式,即esp8266模块作为热点,手机连接esp8266,根据scoket通信的要求,需要知道esp8266的IP和端口号手机才能给esp8266发送命令字符。
接下来是esp8266模块的AT指令。
AT //AT测试AT启动语句
返回以OK结尾的字符串
AT+CWMODE=2 //设置WIFI模式,=1时Sta模式,=2时AP模式,=3时为Sta/AP模式
返回以OK结尾的字符串
AT+RST //重启WIFI模块
返回以ready结尾的字符串
AT+CIFSR //查看路由器分配给模组的IP地址
返回IP地址,像192.168.4.1
AT+CWSAP="my_wifi","12345678",1,0,4,0 //设置wifi名称为my_wifi,12345678是WiFi密码
返回以OK结尾的字符串
AT+CIPMUX=1 //设置多连接方式
返回以OK结尾的字符串
AT+CIPSERVER=1,8086 //设置wifi模块端口号
返回以OK结尾的字符串
连接esp8266的wifi,点击连接app里的小灯,在串口看到app发送到esp8266的字符。
测试完成,贴代码。
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit led1=P1^0; //第一个灯
sbit led2=P1^1;//第二个灯
sbit led3=P1^2;//第三个灯
sbit led4=P1^3;//第四个灯
sbit ds=P2^2; //ds18b20的io口
uint temp; //int型的温度值
float f_temp;//float型的温度值
uchar xdata Receive_table[255]=""; //接收缓冲数组
uchar Receive,i;
uchar UART0_Len=0; //接收数组下标
uchar Len=0; //接收到字符‘+’的下标
void Delay_Us(uchar us)
{
while(us--);
}
void delay(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//*****DS18B20******
void dsreset(void) 写bit
{
uint i;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bit tempreadbit(void) 读bit
{
uint i;
bit dat;
ds=0;
i++;
ds=1;
i++;
i++;
dat=ds;
i=8;
while(i>0)
i--;
return(dat);
}
uchar tempread(void) 读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat) 写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;
ds=1;
i=8;
while(i>0)
i--;
}
else
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;
i++;
}
}
}
void tempchange(void) 转换温度
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp() 计算温度
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
void init_com(void) 串口初始化
{
TMOD=0x20;
SCON = 0X50; //定时器2,16位自动重装
TH2=0XFF; //给定时器赋初值
TL2=0XFD; //给定时器赋初值
RCAP2H=0XFF;//定时器自动重装初值
RCAP2L=0XFD;//16位自动重装初值
TCLK=1;
RCLK=1;
C_T2=0;
EXEN2=0;
TR2=1;
ES = 1;
EA = 1;
}
void comm(char *parr)//发送数组
{
do{
SBUF=*parr++;
while(!TI);
TI=0;
}while(*parr);
}
void Uart_Send_Char(uchar dat)//·发送字符
{
ES = 0;
TI = 0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void Uart_Send_String(uchar *string)//发送字符串
{
while(*string)
{
Uart_Send_Char(*string++);
Delay_Us(5);
}
delay(20);
}
void ESP8266_Init() //esp8266的AT指令初始化
{
//Uart_Send_String("AT\r\n");
Uart_Send_String("AT+RST\r\n");
Uart_Send_String("AT+CWMODE=2\r\n");
Uart_Send_String("AT+CIPMUX=1\r\n");
Uart_Send_String("AT+CIPSERVER=1,8086\r\n");
}
void Init()//串口+esp8266初始化
{
init_com();
delay(100);
ESP8266_Init();
}
void main()
{
uchar buff[4],a=0;
Init();
while(1)
{
if(Receive_table[Len+1]==0x49) //判断接收到的是否是‘I’,esp8266发送协议字符之前加‘+IPD,0,1:’
{
if((Receive_table[Len+2]==0x50)&&(Receive_table[Len+3]==0x44))
switch(Receive_table[Len+9]) //字符为’1‘亮第一个灯,为’4‘灭第一个灯,为’2‘亮第二个灯,为’5‘灭第二个灯,
//依次类推
{
case 0x31: led1=0;break;
case 0x32: led2=0;break;
case 0x33: led3=0;break;
case 0x34: led4=0;break;
case 0x35: led1=1;break;
case 0x36: led2=1;break;
case 0x37: led3=1;break;
case 0x38: led4=1;break;
}
}
tempchange();
a++;
for(i=1;i>0;i--)
{
get_temp();
}
if(a==100){
sprintf(buff,"%f",f_temp); // 将flaot类型的温度转换为只有两位小数的字符型
ES=0;
Uart_Send_String("AT+CIPSEND=0,11\r\n");//发送数据的AT指令
comm(buff);
Uart_Send_String("\r\n");
ES=1;
}
}
}
void UART1_int(void) interrupt 4
{
ES=0;
RI=0;
Receive_table[UART0_Len] = SBUF;
if(SBUF==0x2B)
{
Len=UART0_Len;
}
ES=1;
UART0_Len++;
}
初次之作,发现叙述有错误,请留言滴滴我,望指正!