现做了一个用手机控制51单片机的窗帘自动控制系统,其中在手机手机上分为自动模式和控制模式。
自动模式下单片机可以根据光敏传感器模块来打开或关闭窗帘和LED灯,其中还要显示当前窗帘和LED灯的状态。
发送到手机上采用的是ES8266。当时预想是根据光敏传感器模块来判断灯和窗帘的状态,但是一旦加上发送后自动模式就会失去控制。
代码如下:
/*
通信波特率: 9600Mbps
引脚定义: led1=2.0
*/
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*以下是51单片机的晶振大小 */
#define FOSC_110592M
/*引脚定义 */
sbit led=P1^1;//灯
sbit guang=P1^0;//光敏传感器
sbit xianwei1=P1^2; //限位位动开关
sbit xianwei2=P1^3;
sbit led1=P0^0;// 第一个电机转动提示灯
sbit led2=P0^1;//
unsigned char Key_Value=0;
unsigned char code RUN1[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//正转
unsigned char code RUN2[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//反转
//变量定义
uchar cankao;
uchar shezhi;//灯亮灭程度设置
uchar count;
char *strx=0;//
unsigned char x=1,y=0,Rxbuff[50],Rxnum;
unsigned char Tx_Buf[1];
unsigned char LE,aa;
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
str++;
}
}
/******延时函数****************/
void delaybj(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<60; k++)//用for的空循环延长程序的执行时间
{ }
}
}
void delayms(unsigned int x)
{
unsigned int i;
while(x--)
for(i=125;i>0;i--);
}
void Clear_Buffer(void)//清空缓存
{
int i;
for(i=0;i<50;i++)
Rxbuff[i]=0;//
Rxnum=0;
}
void UART_send_byte(char dat)//发送一个字节
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
void Send_Str(unsigned char *buf) // 发送字符串
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void Send_DATA(uchar *buffer) //发送数据
{
//Uart1Sends("AT+CIPSEND=0,1\r\n");
Send_Str("AT+CIPSEND=0,1\r\n");
delayms(300);
Send_Str(buffer);//发送数据
// Uart1Sends(buffer);
delayms(100);
Clear_Buffer();
}
//步进电机驱动 正转
void motor_ffw()
{
unsigned char i;
for (i=0; i<8; i++) //一个周期转3.75*8=30度
{
P2 = RUN1[i]&0x1f; //取数据
delaybj(2); //调节转速
}
}
//步进电机驱动 反转
void motor_ffz()
{
unsigned char i;
for (i=0; i<8; i++) //一个周期转3.75*8=30度
{
P2 = RUN2[i]&0x1f; //取数据
delaybj(2); //调节转速
}
}
void guangkong() //光敏控制
{
if(guang==1)//有光的时候电机转动
{
motor_ffz();
led1=1;
led2=0;
shezhi=10;
}
if(guang==0)//无光的时候电机关闭
{
motor_ffw();
led1=0;
led2=1;
shezhi=0;
LE=0; //发送数据到手机
Tx_Buf[0]=LE+0x30;
Send_DATA(Tx_Buf);
}
}
//串口初始化函数
void init()
{
TMOD=0x21;
SM0=0;
SM1=1;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
IE=0X82;
cankao=10; //设置的参考电平时间
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
IP=0x10;
TR1=1;
ES = 1;
EA=1;
}
void fs()
{
if(led1==0)
{
//
// LE=led1;
// Tx_Buf[0]=LE+0x30;
// Send_DATA(Tx_Buf);
}
}
void delay(uint ttt)
{
while(ttt--);
}
//ESP8266上电初始化
void esp8266_init()
{
Uart1Sends("AT+CIPMUX=1\r\n");
delay(50000);
Uart1Sends("AT+CIPSERVER=1,8080\r\n");
}
//主函数
void main()
{
delay(50000);
delay(500);
init();
esp8266_init();
while(1)
{
if(Key_Value==1)//正转
{
motor_ffw();
}
if(Key_Value==2)//反转
{
motor_ffz();
}
if(Key_Value==3)//停止电机
{
P2=0xf0;
// P0=0xff;
}
if(xianwei1==0||xianwei2==0)
{
Key_Value=3;
}
if(shezhi<0)//调光亮度极限值的控制
{
shezhi=1;
}
if(shezhi>10)
{
shezhi=10;
}
if(Key_Value==4)//光控
{
guangkong();
}
}
}
void timer() interrupt 1 //PWM占空比调节服务函数
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if (count==shezhi)
{
led=1;
}
count++;
if(count ==cankao)
{
count=0;
if(shezhi!=0)
led=0;
}
}
//串口服务的函数
void time() interrupt 4
{
//手机控制的数据
if(RI)
{
RI=0;
switch(SBUF)
{
case 'a':shezhi++;break;//灯亮度加
case 'b':shezhi--;break; // 灯亮度减
case 'c':shezhi=10;break;// 打开灯
case 'd':shezhi=0;break; // 关闭灯
case 'e':Key_Value=1;led1=0;led2=1;break; //正转
case 'f':Key_Value=2;led1=1;led2=0;break; //反转
case 'i':Key_Value=3;led1=1;led2=1;break; //停止转动
case 'g':led=1;Key_Value=3;led1=1;led2=1;break; //手动模式
case 'h':led=1;Key_Value=4;break; //自动模式
}
}
}
问一下,发送数据应该怎么放?,求大佬讲一下
|