找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2699|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机发送数据给手机

[复制链接]
跳转到指定楼层
楼主
ID:640802 发表于 2019-12-28 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现做了一个用手机控制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;        //自动模式

                  
}


}
}
         
  问一下,发送数据应该怎么放?,求大佬讲一下               


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:617449 发表于 2019-12-28 20:50 | 只看该作者
你好!
1、中断不能有冲突
2、初始化的AT指令要对
3、程序控制部分的命令要对
4、自动和手动,设置一个标志位
回复

使用道具 举报

板凳
ID:640802 发表于 2019-12-29 15:04 | 只看该作者
来51学习1 发表于 2019-12-28 20:50
你好!
1、中断不能有冲突
2、初始化的AT指令要对

代码上是这些问题吗?
回复

使用道具 举报

地板
ID:358382 发表于 2020-4-24 16:40 | 只看该作者
cankao和count的初始值是多少都没设置出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表