#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code SZDLJ[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};//AT+CIPMUX=1
uchar code KQFU[21]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,0x31,0x2C,0x38,0x30,0x38,0x30,0x0D,0x0A};//AT+CIPSERVER=1,8080
uint URTAReceivedCount=0,n=1; //用于串口中断子函数中计数
uchar data Tempdatatable[5],CommandDatatable[5]; //定义临时数组和用于调用控制动作的数组
/*****************************************************
函数功能:延时若1ms
*******************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/*****************************************************
函数:往串口发送数据
功能:只用于设定wifi模块
***************************************************/
void SendData(uchar *sdata,int num)
{
int i;
for(i=0;i<num;i++)
{
SBUF=sdata[i];
Delay_1ms(2);
}
}
/********************************************************************
- 函数 :Moto_Forward()
- 功能 :前进
***********************************************************************/
void Moto_Forward()
{
P1= 0x0a; Delay_1ms(100); } /******************************************************************** - 函数 :Moto_Backward()
- 功能 :后退 ***********************************************************************/ void Moto_Backward() { P1= 0x05; Delay_1ms(100); }
/********************************************************************
- 函数 :Moto_TurnLeft()
- 功能 :左转 ***********************************************************************/ void Moto_TurnLeft() { P1= 0x09; Delay_1ms(100); } /********************************************************************
- 函数 :Moto_TurnRight()
- 功能 :右转 ***********************************************************************/ void Moto_TurnRight() { P1= 0x06; Delay_1ms(100); } /********************************************************************
- 函数 :Moto_Stop()
- 功能 :停止 ***********************************************************************/ void Moto_Stop() { P1= 0x00; Delay_1ms(100); }
/****************************************************************************
函数:主函数
功能:初始化串口,并从串口发送指令到wifi模块用于设置模块,再使能中断,
再进入while循环,解析从串口收到的数据
*****************************************************************************/
void main(void)
{
Delay_1ms(3000);
TMOD=0x21; //TMOD=0010 0001B,定时器T1工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1 1起始位8数据位1停止位
PCON=0x00; //PCON=0000 0000B,波特率9600 晶振11.0592
TH1=0xFd; //根据规定给定时器T1赋初值
TL1=0xFd; //根据规定给定时器T1赋初值
TR1=1; //启动定时器T1
SendData(SZDLJ,13); //设置多连
Delay_1ms(3000);
SendData(KQFU,21); //开启server端
Delay_1ms(8000);
ES = 1; //串口中断使能
EA = 1; //开总中断
while(1) //一直循环直到中断产生,跳进中断执行中断子函数,完后再回到循环并解析数据,等待下次中断到来
{
if(CommandDatatable[0]==0xFF&&CommandDatatable[4]==0XFF)
{
switch(CommandDatatable[1])
{
case 0x00:
switch(CommandDatatable[2])
{
case 0X00:Moto_Stop();break;
case 0X01:Moto_Forward();break;
case 0X02:Moto_Backward();break;
case 0X03:Moto_TurnLeft();break;
case 0X04:Moto_TurnRight();break;
default : break;
}
default: break;
}
}
}
}
/*****************************************************************************
函数:串口中断子函数
功能:接收串口数据,组包成类 “0XFF 0X00 0X01 0X02 0XFF” 的数组,用于主函数解析,包头和包尾都是0XFF,的5元数组
******************************************************************************/
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0;
RI=0;
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]==0XFF;
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}
if(URTAReceivedCount==2)
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0;
temp="";
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];
ES=1;
}
串口助手给MCU发16进制类似“FF 00 01 02 FF”数时,不能正确解析