久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2051|回復: 6
打印 上一主題 下一主題
收起左側

為什么esp8266連上去了我用按鍵控制的值就會亂,esp8266都沒接電源呀

[復制鏈接]
跳轉到指定樓層
樓主
ID:965637 發(fā)表于 2021-9-12 15:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:624769 發(fā)表于 2021-9-12 16:48 | 只看該作者
如果,程序中有讀其它設備值得指令, 當目標設備沒有通電時,大概率讀到值會是任意值,這是數(shù)電的正常現(xiàn)象,所以才會通過 上拉,或下拉 電阻,來避免這種情況。
回復

使用道具 舉報

板凳
ID:277550 發(fā)表于 2021-9-13 08:35 | 只看該作者
電路連接、程序,是如何的
回復

使用道具 舉報

地板
ID:965637 發(fā)表于 2021-9-19 11:25 | 只看該作者
#include<reg51.h>
#include"lcd.h"
#include "esp8266.h"
#include "uart.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義       
typedef unsigned char u8;
ulong volt;//測量的電壓值
uint vtime;        // 用來控制測量地址位的改變
uchar addr;//測量地址位,指示測量的是哪一個模擬值 (其實就是TLC2543的控制字)
sbit CLK=P1^7;//定義時鐘信號口
sbit DIN=P1^6;//定義2543數(shù)據(jù)寫入口
sbit DOUT=P1^5;//定義2543數(shù)據(jù)讀取口
sbit CS=P1^4;//定義2543片選信號口
sbit k0=P2^4;         //定義P24口是k1
sbit k1=P2^5;         //定義P25口是k0
sbit l1=P2^6;
sbit l2=P2^7;
int g=2,h=4;
u8 rxdata;
u8 i=0;
u8 a[2]={1,4};
float f;
/**********************************************************/
//函數(shù)名:delay(uint x)
//功能:延時程序 改變測量地址        
//調用函數(shù):
//輸入?yún)?shù):x
//輸出參數(shù):
//說明:
/**********************************************************/
void delay(u16 i)
{
        while(i--);       
}


/*******************************************************************************
* 函 數(shù) 名         : keypros
* 函數(shù)功能                   : 按鍵處理函數(shù),判斷按鍵K1是否按下
*******************************************************************************/
void keypros()
{
        if(k0==0)                  //檢測按鍵K1是否按下
        {       
                delay(1000);   //消除抖動 一般大約10ms
                if(k0==0)         //再次判斷按鍵是否按下
                {
                        h++;
                        if(h==10)
                        {
                        g++;
                                h=0;
                        }
                }
                while(!k0);         //檢測按鍵是否松開
        }               
        if(k1==0)                  //檢測按鍵K1是否按下
        {       
                delay(1000);   //消除抖動 一般大約10ms
                if(k1==0)         //再次判斷按鍵是否按下
                {
                        h--;
                        if(h<0)
                        {
                        g--;
                                h=9;
                        }
                }
                while(!k1);         //檢測按鍵是否松開
        }               
       
       
}

/**********************************************************/
//函數(shù)名:read2543(uchar addr)
//功能:2543驅動程序
//調用函數(shù):
//輸入?yún)?shù):addr
//輸出參數(shù):
//說明:進行ad轉換將結果存于volt變量中 addr為測量位地址
/**********************************************************/
void read2543(uchar addr)
{
        uint ad=0;
        uchar i;
        CLK=0;
        CS=0;//片選段,啟動2543
        addr<<=4;//對地址位預處理
        for(i=0;i<12;i++) //12個時鐘走完,完成一次讀取測量
        {
                if(DOUT==1)
                        ad=ad|0x01;//單片機讀取ad數(shù)據(jù)
                DIN=addr&0x80;//2543讀取測量地址位
                CLK=1;
                ;;;//很短的延時
                CLK=0;//產(chǎn)生下降沿,產(chǎn)生時鐘信號
                ;;;
                addr<<=1;
                ad<<=1;//將數(shù)據(jù)移位準備下一位的讀寫
        }
        CS=1;//關2543
        ad>>=1;
        volt=ad;//取走轉換結果
        volt=volt*1221;//例子的滿量程為5V,轉換分辯率為12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表實際1221mV        
}
/**********************************************************/
//函數(shù)名:display()
//功能:5位數(shù)碼管顯示
//調用函數(shù):delay(uint x)
//輸入?yún)?shù):
//輸出參數(shù):
//說明:將處理后的電壓值與測量位值顯示在5位數(shù)碼管上
/**********************************************************/
void display()
{  
  int a,b,c;
        LcdWriteCom(0xC4);        //寫地址 C0表示初始地址
        LcdWriteData('0'+g);
       
        LcdWriteCom(0xC6);        //寫地址 C0表示初始地址
        LcdWriteData('0'+h);
       
        if(addr==0)
        {
   a = volt/1000000;
         b=(volt/100000)%10;
         c=(volt/10000)%10;
        LcdWriteCom(0x84);                  //寫地址 80表示初始地址
        LcdWriteData('0'+a); //百位
               
        LcdWriteCom(0x86);                 //寫地址 80表示初始地址
        LcdWriteData('0'+b); //十位
               
        LcdWriteCom(0x87);                 //寫地址 80表示初始地址
        LcdWriteData('0'+c); //十位
               
                SBUF = 's';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
                SBUF = 'e';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = 't';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = ';';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
                SBUF = '0'+g;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
                SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '0'+h;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = 'V';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
                SBUF = '\r';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
                SBUF = '\n';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);
        TI = 0;
               



        if(a>=g)
                {
            if(b>=h)l1=1;
                else l1=0;
                }
                else l1=0;
       
       
       
               
                SBUF = 'V';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = ';';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
        SBUF = '0'+a;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
                SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '0'+b;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
        SBUF = '0'+c;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
                SBUF = ' ';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '0';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
        SBUF = '5';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = 'V';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
       
        }

        if(addr==1)
        {
  a = volt*2/1000000;
  b = (volt*2/100000)%10;
        c=(volt*2/10000)%10;
               
        LcdWriteCom(0x89);                  //寫地址 80表示初始地址
        LcdWriteData('0'+a); //百位
               
        LcdWriteCom(0x8B);                 //寫地址 80表示初始地址
        LcdWriteData('0'+b); //十位
               
        LcdWriteCom(0x8C);                 //寫地址 80表示初始地址
        LcdWriteData('0'+c); //十位


        if(a>=g)
                {
            if(b>=h)l2=1;
                else l2=0;
                }
                else l2=0;


       
                SBUF = 'V';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = ';';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;       
               
        SBUF = '0'+a;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
                SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '0'+b;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
        SBUF = '0'+c;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = ' ';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '0';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = '-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
               
        SBUF = '8';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
        SBUF = 'V';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
       
       
                SBUF = '\r';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
                SBUF = '\n';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
               
       
        }       
        SBUF = '\r';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;
       
                SBUF = '\n';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
        TI = 0;       
}
/*******************************************************************************
* 函 數(shù) 名         :UsartConfiguration()
* 函數(shù)功能                   :設置串口
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void UsartConfiguration()
{
        SCON=0X50;                        //設置為工作方式1
        TMOD=0X20;                        //設置計數(shù)器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //計數(shù)器初始值設置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打開接收中斷
        EA=1;                                                //打開總中斷
        TR1=1;                                        //打開計數(shù)器
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
        LcdInit();                         //初始化LCD1602
        LcdWriteCom(0x80);        //寫地址 80表示初始地址
        LcdWriteData('M');
        LcdWriteCom(0x81);        //寫地址 80表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0x82);        //寫地址 80表示初始地址
        LcdWriteData('a');
        LcdWriteCom(0x83);        //寫地址 80表示初始地址
        LcdWriteData(':');
        LcdWriteCom(0x85);        //寫地址 80表示初始地址
        LcdWriteData('.');
        LcdWriteCom(0x8A);        //寫地址 80表示初始地址
        LcdWriteData('.');
               
        LcdWriteCom(0xC0);        //寫地址 C0表示初始地址
        LcdWriteData('S');
        LcdWriteCom(0xC1);        //寫地址 C0表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0xC2);        //寫地址 C0表示初始地址
        LcdWriteData('t');
        LcdWriteCom(0xC3);        //寫地址 C0表示初始地址
        LcdWriteData(':');
        LcdWriteCom(0xC5);        //寫地址 C0表示初始地址
        LcdWriteData('.');
       
        LcdWriteCom(0xC8);        //寫地址 C0表示初始地址
        LcdWriteData('0');
        LcdWriteCom(0xC9);        //寫地址 C0表示初始地址
        LcdWriteData('-');
        LcdWriteCom(0xCA);        //寫地址 C0表示初始地址
        LcdWriteData('5');
        LcdWriteCom(0xCB);        //寫地址 C0表示初始地址
        LcdWriteData('V');
       
        LcdWriteCom(0xCC);        //寫地址 C0表示初始地址
        LcdWriteData('0');
        LcdWriteCom(0xCD);        //寫地址 C0表示初始地址
        LcdWriteData('-');
        LcdWriteCom(0xCE);        //寫地址 C0表示初始地址
        LcdWriteData('8');
        LcdWriteCom(0xCF);        //寫地址 C0表示初始地址
        LcdWriteData('V');
  UsartConfiguration();
        while(1)
        {
                read2543(addr);//調用2543驅動程序測量地址為0
                display();//調用顯示程序       
                keypros();
                ESP8266_Task();
                addr++;
    if(addr==2)
                                addr=0;
        }
}


extern void ESP8266_ReceiveData(unsigned char rxdata);
void Usart() interrupt 4
{
        if(RI)
        {
                rxdata=SBUF;//出去接收到的數(shù)據(jù)
       
        if(rxdata>='0'&&rxdata<='9')
        {
                a[i]=rxdata;
                i++;
                if(i==2)i=0;
        }
        g=a[0]-'0';
        h=a[1]-'0';
        RI = 0;//清除接收中斷標志位
    ESP8266_ReceiveData(rxdata);
}
}



//定時器0 中斷服務函數(shù)    中斷編號  1
extern void ESP8266_RxDataUnlock(void);

void Timer0_ISR(void)  interrupt    1   //20ms定時
{
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xB8;                //設置定時初值
//------------------中斷處理---------------------       

        ESP8266_RxDataUnlock();

}


void SendData(void)                                   //發(fā)送數(shù)據(jù)
{
        static unsigned char con=0;

        unsigned int integ=0;  //2.35  235
  

        con++;
        if(con>=20)
        {
                con=0;
                if(addr==0)
        {
                ESP8266_TxBuf[0]='U';                                   //buf緩存區(qū),緩存寄存器吧
                ESP8266_TxBuf[1]='1';
                ESP8266_TxBuf[2]=':';
                integ = volt/1000000;
                ESP8266_TxBuf[3]=integ+'0';
                ESP8266_TxBuf[4]='.';
                integ=(volt/100000)%10;
                ESP8266_TxBuf[5]=integ+'0';
                integ=(volt/10000)%10;
                ESP8266_TxBuf[6]=integ+'0';
                ESP8266_TxBuf[7]='V';
                ESP8266_TxBuf[8]=' ';
                ESP8266_TxBuf[9]='0';
                ESP8266_TxBuf[10]='-';
                ESP8266_TxBuf[11]='5';
                ESP8266_TxBuf[12]='\r';
        }
          if(addr==1)
        {
                ESP8266_TxBuf[14]='2';
                ESP8266_TxBuf[15]=':';
                integ = volt*2/1000000;
                ESP8266_TxBuf[16]=integ+'0';
                ESP8266_TxBuf[17]='.';
                integ=(volt*2/100000)%10;
                ESP8266_TxBuf[18]=integ+'0';
                integ=(volt*2/10000)%10;
                ESP8266_TxBuf[19]=integ+'0';
                ESP8266_TxBuf[20]='V';
                ESP8266_TxBuf[21]=' ';
                ESP8266_TxBuf[22]='0';
                ESP8266_TxBuf[23]='-';
                ESP8266_TxBuf[24]='8';
                ESP8266_TxBuf[25]='\r';
        }
                ESP8266_TxBuf[26]='S';
                ESP8266_TxBuf[27]='e';
                ESP8266_TxBuf[28]='t';
                ESP8266_TxBuf[29]=':';
                integ=g;
                ESP8266_TxBuf[30]=integ+'0';
                ESP8266_TxBuf[31]='.';
                integ=h;
                ESP8266_TxBuf[32]=integ+'0';
                ESP8266_TxBuf[33]='V';
                ESP8266_TxBuf[34]='\n';
                ESP8266_TxBuf[35]='\0';
       
        }

        if(ESP8266_RxData[0])
        {
                ESP8266_RxData[0]=0;
                con=30;
        }

}
回復

使用道具 舉報

5#
ID:965637 發(fā)表于 2021-9-19 11:26 | 只看該作者
#include"lcd.h"

/*******************************************************************************
* 函 數(shù) 名         : Lcd1602_Delay1ms
* 函數(shù)功能                   : 延時函數(shù),延時1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

/*******************************************************************************
* 函 數(shù) 名         : LcdWriteCom
* 函數(shù)功能                   : 向LCD寫入一個字節(jié)的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
#ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //選擇發(fā)送命令
        LCD1602_RW = 0;           //選擇寫入
       
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定

        LCD1602_E = 1;                  //寫入時序
        Lcd1602_Delay1ms(5);          //保持時間
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫入命令
        LCD1602_RW = 0;         //選擇寫入

        LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //發(fā)送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數(shù) 名         : LcdWriteData
* 函數(shù)功能                   : 向LCD寫入一個字節(jié)的數(shù)據(jù)
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //選擇輸入數(shù)據(jù)
        LCD1602_RW = 0;        //選擇寫入

        LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //寫入時序
        Lcd1602_Delay1ms(5);   //保持時間
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
        LCD1602_RW = 0;          //選擇寫入

        LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //寫入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數(shù) 名       : LcdInit()
* 函數(shù)功能                 : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數(shù)據(jù)指針起點
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //將8位總線轉為4位總線
        LcdWriteCom(0x28);         //在四位線下的初始化
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數(shù)據(jù)指針起點
}
#endif
回復

使用道具 舉報

6#
ID:965637 發(fā)表于 2021-9-19 11:26 | 只看該作者
#include "esp8266.h"
#include "uart.h"
#include "string.h"

#define ESP8266_BUFF_SIZE    60 //接收緩存
#define ESP8266_RX_MAX           10  //接收數(shù)據(jù)最大個數(shù)   
#define RSP8266_TX_MAX       30         //發(fā)送數(shù)據(jù)最大個數(shù)       


data unsigned char ESP8266_RxBuf[ESP8266_BUFF_SIZE]={0};        //ESP8266接收緩存
unsigned char ESP8266_TxBuf[RSP8266_TX_MAX]={0};        //最大30個字節(jié) 可以自己修改大小
unsigned char ESP8266_RxData[ESP8266_RX_MAX]={0};   //接收的處理過的數(shù)據(jù)

unsigned char ESP8266_InitFlag=0; //ESP8266初始化標志0未完成初始化 1已完成初始化
unsigned char ESP8266_RxLock=0;          //接收數(shù)據(jù)鎖
data unsigned char ESP8266_RxCon=0;          //ESP8266接收計數(shù)
unsigned char LinkID=0;                      //客戶端的連接ID:字符'0','1','2','3','4'最多連接5個
unsigned char SendFlag=0;              //發(fā)送標志  1發(fā)送成功 2發(fā)送失敗

//需要修改成ESP8266當前接的串口號
void ESP8266_SendChar(unsigned char sbyte)
{
        UART1_SendByte(sbyte);
}

//ESP8266數(shù)據(jù)解鎖功能
//定時10-50ms執(zhí)行
void ESP8266_RxDataUnlock(void)
{
        if(ESP8266_RxLock>0)
                ESP8266_RxLock++;       
}


//ESP8266發(fā)送一個字符串函數(shù)
void ESP8266_SendStr(unsigned char *str)  
{
        while(*str != '\0')
        {
                ESP8266_SendChar(*str);
                str++;
        }                                       
}



//ESP8266接收數(shù)據(jù)函數(shù)
//將此函數(shù)放入串口中斷進行接收數(shù)據(jù)
void ESP8266_ReceiveData(unsigned char rxdata)
{       
        ESP8266_RxBuf[ESP8266_RxCon++]=rxdata;
        if(ESP8266_RxCon>=ESP8266_BUFF_SIZE)         //接收數(shù)組越限處理
                ESP8266_RxCon=0;
        ESP8266_RxLock=1;
}


/*
//設置好之后等待客戶端的連接,如果有客戶端連接成功,則會收到這樣的語句
0,CONNECT
前面是LinkID:0-4 //因為ESP8266作為Server最多可以連接5個Client

//客戶端主動斷開連接
0,CLOSED
//前面是LinkID:0-4

+IPD,0,4:Anfn
+PID表示收到數(shù)據(jù),client_id:此數(shù)字表示連接的Client編號,len:此數(shù)字表示長度,:后邊表示收到的數(shù)據(jù)
*/
//接收的數(shù)據(jù)分析處理
void ESP8266_ReceiveHandle(void)
{
        char *point=NULL;       
        unsigned char rxlen=0;
        unsigned char i=0;
//-------檢測是否有客戶端連接---------------//
        point = strstr((const char *)ESP8266_RxBuf,(const char *)",CONNECT");
        if(point!=NULL)//有客戶端連接
        {
                point=point-1;
                if(*point>='0' && *point<'5')
                        LinkID=*point;                       
        }
//-------檢測是否有客戶端斷開-------------//
        point = strstr((const char *)ESP8266_RxBuf,(const char *)",CLOSED");
        if(point!=NULL)//客戶端主動斷開連接
        {
                point=point-1;
                if(*point>='0' && *point<'5')
                {
                        if(LinkID==*point) //是當前連接的客戶端斷開
                                LinkID=0;
                }       
        }
//-----檢測是否有新數(shù)據(jù)到來-------------//+IPD,0,5:Dfxd0
        point = strstr((const char *)ESP8266_RxBuf,(const char *)"+IPD");
        if(point!=NULL)//有新數(shù)據(jù)過來         +IPD,0,4:Anfn
        {                                                                //         0
/*--------------更新交互的ID--------------------*/
                point=point+5;
                if(*point>='0' && *point<'5')
                        LinkID=*point;               
/*--------------計算有效數(shù)據(jù)長度-------------------*/       
                point=point+3;          //+IPD,0,4:Anfn       
                if(*point==':')          //1位數(shù)據(jù)
                {
                        rxlen=*(point-1)-0x30;       
                }
                else //兩位數(shù)據(jù)+IPD,0,14:Anfn
                {
                        point=point+1;
                        if(*point==':')
                        {
                                rxlen=10*(*(point-2)-0x30)+(*(point-1)-0x30);       
                        }       
                }
/*--------------讀取接收的數(shù)據(jù)--------------------*/
                if(rxlen>0 && rxlen<ESP8266_RX_MAX)
                {
                        point++;
                        if(*point=='\n'||*point=='\r')          //如果接收到回車或者換行不做處理
                                return;

                        for(i=0;i<ESP8266_RX_MAX;i++)        //清空數(shù)據(jù)接收
                                ESP8266_RxData[i]=0;                               
                       
                        for(i=0;i<rxlen;i++)         //接收數(shù)據(jù)
                        {
                                ESP8266_RxData[i]=*point;
                                point++;       
                        }
                }
/*-------------------------------------------------*/       
        }

}

//ESP8266接收緩存清空函數(shù)
void ESP8266_BufClr(void)
{
        unsigned char i=0;
       
        while(ESP8266_RxLock>0 &&(ESP8266_RxLock<3));        //如果正在接收數(shù)據(jù)則等待
        ESP8266_RxLock=0;
        ESP8266_ReceiveHandle();        //清空緩存之前需要先提取一下有用信息
        for(i=0;i<ESP8266_BUFF_SIZE;i++)
                ESP8266_RxBuf[i]=0;
        ESP8266_RxCon=0;       
}




//作為Server模式進行初始化步驟如下
//注意使用AT指令后邊需要加\r\n   載入發(fā)送數(shù)據(jù)的時候不用
//1:AT    握手測試
//2:ATE0  關閉回顯
//3:AT+CWMODE=2  設置成AP模式
//5:AT+RST      //一定要重啟生效   
//4:AT+CIPMUX=1  多連接
//5:AT+CIPAP="192.168.4.1"設置IP地址
//6:AT+CIPSERVER=1,9000設置端口號


//ESP8266任務函數(shù)
void ESP8266_Task(void)       
{
        unsigned char i=0;
        static unsigned char len=0;
        static unsigned char step=0;        //初始化步驟
        static unsigned int  time=0;        //間隔時間       
        char *point=NULL;       
       
        if(ESP8266_InitFlag==1)        //0的時候沒有進行初始化
        {
                time++;
                if(LinkID>0)         //有客戶端連接了
                {
                        switch(step) //0等待數(shù)據(jù)裝入發(fā)送緩存
                        {
                                case 0:         //檢測有沒有數(shù)據(jù)需要發(fā)送
                                {
/*----------------------------------------*/
                                        if(time>=2)
                                        {
                                                time=0;
                                                ESP8266_BufClr();        //檢測接收的數(shù)據(jù)       
                                        }
                                       
                                        if(ESP8266_TxBuf[0]!=0)        //發(fā)送緩存有數(shù)據(jù)載入 進行自動發(fā)送
                                        {
                                                //1:發(fā)送之前需要計算要發(fā)送數(shù)據(jù)的長度
                                                for(len=0;len<RSP8266_TX_MAX;len++)
                                                {
                                                        if(ESP8266_TxBuf[len]==0)//1230
                                                                break;
                                                }
                                                //2:請求發(fā)送數(shù)據(jù)+長度
                                                ESP8266_SendStr((unsigned char *)"AT+CIPSEND=");         
                                                ESP8266_SendChar(LinkID);
                                                ESP8266_SendChar(',');
                                                if(len>9)
                                                        ESP8266_SendChar(len/10+0x30);       
                                                ESP8266_SendChar(len%10+0x30);
                                                ESP8266_SendStr((unsigned char *)"\r\n");         
                                                step=1;       
                                        }
                                }break;
/*----------------------------------------*/
                                case 1:          //準備發(fā)送數(shù)據(jù)
                                {
                                        if(time>=2)
                                        {
                                                time=0;
                                                 point = strstr((const char *)ESP8266_RxBuf,(const char *)">");        //接收到>表示可以發(fā)送數(shù)據(jù)
                                                if(point!=NULL)//收到>表示可以發(fā)送數(shù)據(jù)
                                                {
                                                        ESP8266_BufClr();
                                                        for(i=0;i<len;i++)
                                                                ESP8266_SendChar(ESP8266_TxBuf[i]); //載入需要發(fā)送的數(shù)據(jù)
                                                        for(i=0;i<RSP8266_TX_MAX;i++)        //清空發(fā)送緩存
                                                                ESP8266_TxBuf[i]=0;       
                                                        step=2;
                                                }
                                                else  //沒有收到> 則進行LinkID檢測
                                                {
                                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid");        //連接不可用
                                                        if(point!=NULL)
                                                        {
                                                                LinkID=0;
                                                                SendFlag=2;        //發(fā)送失敗
                                                        }
                                                        step=0;
                                                        ESP8266_BufClr();
                                                }

                                        }
                                }break;
/*----------------------------------------*/
                                case 2: //發(fā)送數(shù)據(jù)反饋檢測
                                {
                                        if(time>=2)
                                        {
                                                time=0;
                                                 point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid");//連接不可用
                                                if(point!=NULL)
                                                {
                                                        LinkID=0;
                                                        SendFlag=2;        //發(fā)送失敗
                                                }
                                                point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");//連接不可用
                                                if(point!=NULL)
                                                {
                                                        SendFlag=1;        //發(fā)送成功
                                                }
                                                ESP8266_BufClr();       
                                                step=0;                                       
                                        }
                                }break;
/*----------------------------------------*/
                                default: step=0;        break;
                       
                        }//end of switch       
               
                }
                else //沒有客戶端連接
                {
                        if(time>2)
                        {
                                time=0;
                                step=0;
                                ESP8266_BufClr();
                        }
                }
        }
        else        //初始化沒有完成進行初始化操作
        {
                time++;         
                switch(step)
                {
/*--------------------step0發(fā)送握手指令AT----------------------------------*/
                        case 0:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT\r\n");         
                                step=1;       
                                time=0;
                        }break;       

                        case 1:                       
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                        if(point!=NULL)//接收到OK
                                                step=2;               
                                        else
                                                step=0;               
                                }                          
                        }break;       
/*--------------------step1關閉回顯----------------------------------*/
                        case 2:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"ATE0\r\n");         
                                step=3;       
                                time=0;
                        }break;       
                        case 3:                       
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                        if(point!=NULL)//接收到OK
                                                step=4;               
                                        else
                                                step=0;               
                                }                          
                        }break;         
/*--------------------step2設置成AP模式----------------------------------*/
                        case 4:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT+CWMODE=2\r\n");         
                                step=5;       
                                time=0;
                        }break;       
                        case 5:                       
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                        if(point!=NULL)//接收到OK
                                                step=6;               
                                        else
                                                step=0;               
                                }                          
                        }break;       

/*--------------------重啟生效---------------------------------*/
                        case 6:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT+RST\r\n");         
                                step=7;       
                                time=0;
                        }break;       
                        case 7:                       
                        {
                                if(time>15)
                                {
                                        time=0;
                                        step=8;       
                                }         
                        }break;       
       
/*--------------------step3設置多連接AT+CIPMUX=1---------------------------------*/
                        case 8:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT+CIPMUX=1\r\n");         
                                step=9;       
                                time=0;
                        }break;       
                        case 9:                       
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                        if(point!=NULL)//接收到OK
                                                step=10;               
                                        else
                                                step=0;               
                                }                          
                        }break;       
/*--------------------step4設置IP地址AT+CIPAP=\"192.168.4.1\"----------------------*/
                        case 10:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT+CIPAP=\"192.168.4.1\"\r\n");         
                                step=11;       
                                time=0;
                        }break;       
                        case 11:                       
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                        if(point!=NULL)//接收到OK
                                                step=12;               
                                        else
                                                step=0;               
                                }                          
                        }break;                                
/*--------------------step5設置Port:AT+CIPSERVER=1,9000----------------------*/
                        case 12:                       
                        {
                                ESP8266_BufClr();                 //清空接收緩存
                                ESP8266_SendStr((unsigned char *)"AT+CIPSERVER=1,9000\r\n");         
                                step=13;       
                                time=0;
                        }break;
                               
                        case 13:
                        {
                                if(time>=6)
                                {
                                        time=0;
                                        point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
                                           if(point!=NULL)//接收到OK
                                                ESP8266_InitFlag=1;        //初始化成功               
                                        else
                                                ESP8266_InitFlag=0;        //初始化失敗
                                        step=0;               
                                }
                        }break;       
                        default:        step=0;        ESP8266_InitFlag=0;        break;       
                }                                        

        }

}














回復

使用道具 舉報

7#
ID:965637 發(fā)表于 2021-9-19 11:28 | 只看該作者
電路就esp8266直接連RXD和TXD
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情a∨在线视频播放 成人免费共享视频 | 在线视频91| 亚洲欧美一区二区三区视频 | 国产精品色一区二区三区 | av片在线观看 | 国产高清视频在线观看 | 中文字幕在线人 | 久久精品国产久精国产 | 久久久涩| 久久久久久久av | 久久久99国产精品免费 | 视频在线亚洲 | 亚洲成av人片在线观看 | 日韩欧美亚洲 | www.夜夜骑.com | 成人在线观看免费视频 | 成年免费在线观看 | 久久久精品一区二区三区 | av不卡一区 | 亚洲福利av| 成人免费在线 | 国产日韩一区二区三免费高清 | se婷婷| 欧美激情一区二区三区 | 欧美一级免费 | 国产精品人人做人人爽 | 黄色一级特级片 | 国产aa| 99热这里有精品 | 亚洲三区在线观看 | 亚洲色图在线观看 | 日本在线视频一区二区 | www.日日夜夜 | 亚洲欧美成人影院 | 欧美日韩1区2区3区 欧美久久一区 | 国产视频在线观看一区二区三区 | 国产一区二区高清在线 | 欧美日韩国产精品一区 | 国产精品国产三级国产播12软件 | 日韩精品一区二区三区中文在线 | 日韩在线免费 |