标题:
51单片机与esp8266联手控制电机和led程序 调试出现问题
[打印本页]
作者:
gyzgyz
时间:
2017-9-15 00:08
标题:
51单片机与esp8266联手控制电机和led程序 调试出现问题
我用stc89单片机与esp8266联手控制led和电机,发现必须直接在串口或者对esp8266发送两次同样信息才能让panduan()选择另一分支,如果只发一次信息,无变化;但是当我把panduan()中每个分支下的data_cls();删除了,就只发一次信息就可以改变分支了。试了好久始终不得要领,不知到是什么原因。恳请大神解惑。程序如下:
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
#define RELOAD_COUNT 0xFA
uchar Receive;
uchar Recive_table[15];
static uchar i=0;
sbit LED0=P2^1;
sbit LED1=P2^2;
sbit ji0=P0^0;
sbit ji1=P0^1;
sbit ji2=P0^2;
sbit ji3=P0^3;
void ms_delay(uint z)
{
uint x,j;
for(x=z;x>0;x--)
for(j=110;j>0;j--);
}
void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
{
SCON=0x50; //设置为串行口以方式1工作,8位异步通讯,允许接收中断。//一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。
PCON=0x80; //SMOD波特率选择位为1,SMOD=1.
TMOD=0x21; //设置定时器1为波特率发生器,工作在模式2,8位自动装载
TH1=RELOAD_COUNT;//波特率9600 ,TH1=256-FOSC/16/12/波特率
TL1=TH1;
EA=1; //总中断打开
ES=0; //关闭串口中断
TR1=1; //启动定时器1
}
void led(void)
{
LED0=0;
LED1=0;
ms_delay(100);
LED0=1;
LED1=1;
}
void SendString(char *s) //串口发送程序
{
while(*s != '\0')
{
SBUF = *(s++);
while(!TI);
TI = 0;
}
}
void zhengzhuan() //用的是电机驱动模块
{
ji0=0;
ji1=0; //先停电机
ji0=1; //
ji1=0;
ji2=0; //第二个控制没用
ji3=0;
}
void fanzhuan()
{
ji0=0;
ji1=0; //先停电机
ji0=0;
ji1=1;
ji2=0; //第二个控制没用
ji3=0;
}
void stop() //停电机
{
ji0=0;
ji1=0;
ji2=0;
ji3=0;
LED0=1;
LED1=1;
}
void data_cls() //数组清零
{
uint l;
for(l = 0; l < 15; l ++)
Recive_table[l]=0;
}
void panduan() //根据信息判断采用哪个分支
{
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
{
//if((Recive_table[3]=='1')&&(Recive_table[4]=='2'))
uint s;
s=Recive_table[10];
switch(s)
{
case '1':
{
data_cls();
LED0=0;
LED1=1;//1 灯灭
zhengzhuan();
break;
}
case '2':
{
data_cls();
LED0=1;
LED1=0; //1 灯亮
fanzhuan();
break;
}
case '3':
{
data_cls();
stop();
break;
}
default:
{
data_cls();
stop();
LED0=0;
LED1=0;
break;
}
}
}
else
{}
}
void main()
{
Uart_Init();//使用独立的波特率发生器
led();
ms_delay(1000);
SendString("AT+CIPMUX=1");
SendString("\r\n");
led();
ms_delay(1000);
SendString("AT+CIPSERVER=1,8080");
SendString("\r\n");
EA=1;
ES=1; //允许串口中断
while(1)
{
EA=1;
ES=1;
panduan();
}
}
void Uart_Interrupt() interrupt 4
{
if(RI==1)
{
RI=0;
Receive=SBUF; //MCU接收wifi模块反馈回来的数据
Recive_table[i]=Receive;
i++;
if(Recive_table[i-1]=='\n')
{
i=0; //遇到换行 重新装值
}
else
{}
}
else
{}
}
复制代码
作者:
yzwzfyz
时间:
2017-9-15 23:57
画个流程图或许能看出问题
作者:
gyzgyz
时间:
2017-9-16 10:32
yzwzfyz 发表于 2017-9-15 23:57
画个流程图或许能看出问题
谢谢。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1