天天看點

基于51單片機智能家居家電繼電器開關插座定時WiFi無線proteus仿真原理圖PCB

功能:

0.本系統采用STC89C52作為單片機

1.手機通過wifi控制4路繼電器的開和關以及定時:

手機發送OA,繼電器全部打開,

手機發送CA,繼電器全部關閉,

手機發送O14,繼電器14打開,

手機發送C14,繼電器14閉合,

就是手機發送U14,繼電器14,10s後打開,

就是手機發送D14,繼電器14,10s後關閉。

2.系統具備四路繼電器可以控制四種家電

3.采用DC002作為電源接口可直接輸入5V給整個系統供電

原理圖:

基于51單片機智能家居家電繼電器開關插座定時WiFi無線proteus仿真原理圖PCB

PCB :

基于51單片機智能家居家電繼電器開關插座定時WiFi無線proteus仿真原理圖PCB

主程式:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "delay.h"

/************************* 宏定義 *************************/
#define FALSE 0x01
#define OPEN 0x22
#define CLOSE 0x33

#define ON 0
#define OFF 1

/************************* 管腳定義 *************************/
sbit RELAY1 = P3^5; //繼電器控制
sbit RELAY2 = P3^4;
sbit RELAY3 = P3^3;
sbit RELAY4 = P3^2;

/************************* 變量定義 *************************/
unsigned char relay1Flag = CLOSE; //狀态标志
unsigned char relay2Flag = CLOSE;
unsigned char relay3Flag = CLOSE;
unsigned char relay4Flag = CLOSE;

unsigned char CountLater1 = 0; //延時計數
unsigned char CountLater2 = 0;
unsigned char CountLater3 = 0;
unsigned char CountLater4 = 0;

unsigned char Rxd_Busy = 0; //序列槽判忙
unsigned char record = 0;	//記錄序列槽結束資料長度
unsigned char Tmepbuf[3] = {0,0,0};	//暫存序列槽接收資料
unsigned char i;

/************************* 函數聲明 *************************/
void Timer0_Init(void); //定時器0初始化
void UART_Init(void); //序列槽初始化
void UART_SendByte(unsigned char dat); //序列槽發送位元組資料
void SendStr(unsigned char *s, unsigned char length); //序列槽發送字元串

void main(void)
{
    Timer0_Init(); //定時器0初始化
    UART_Init();   //序列槽初始化 波特率115200

    DelayMs(100);

    SendStr("AT+CIPMUX=1\r\n", 13); //打開多連接配接
    DelayMs(250);
    SendStr("AT+CIPSERVER=1,8080\r\n", 21); //建立服務 端口号為8080
    DelayMs(250);
    while (1); //主循環
}

void Timer0_Init(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01; // 使用模式1,16位定時器,使用"|"符号可以在使用多個定時器時不受影響
    TL0 = 0x00;   // 設定定時初始值
    TH0 = 0x4C;   // 設定定時初始值 50ms
    EA = 1;       // 總中斷打開
    ET0 = 1;      // 定時器中斷打開
    TR0 = 1;      // 定時器開關打開
}

void Timer0_isr(void) interrupt 1
{
    static unsigned char times50ms = 0; // 系統 定時器計數
    TL0 = 0x00;                         // 設定定時初始值
    TH0 = 0x4C;                         // 設定定時初始值 50ms

    times50ms++;
    if (times50ms > 20) //延時 約1s
    {
        times50ms = 0;
        if (CountLater1 > 0) //延時資料大于0時遞減
        {
            CountLater1--;
        } //--
        else
        {
            if (relay1Flag == OPEN) //延時資料為0時操作
            {
                RELAY1 = ON;
            }
            else if (relay1Flag == CLOSE)
            {
                RELAY1 = OFF;
            }
        }

        if (CountLater2 > 0)
        {
            CountLater2--;
        }
        else
        {
            if (relay2Flag == OPEN)
            {
                RELAY2 = ON;
            }
            else if (relay2Flag == CLOSE)
            {
                RELAY2 = OFF;
            }
        }

        if (CountLater3 > 0)
        {
            CountLater3--;
        }
        else
        {
            if (relay3Flag == OPEN)
            {
                RELAY3 = ON;
            }
            else if (relay3Flag == CLOSE)
            {
                RELAY3 = OFF;
            }
        }

        if (CountLater4 > 0)
        {
            CountLater4--;
        }
        else
        {
            if (relay4Flag == OPEN)
            {
                RELAY4 = ON;
            }
            else if (relay4Flag == CLOSE)
            {
                RELAY4 = OFF;
            }
        }
    }
//    Rxd_Busy++;
//    if (Rxd_Busy >= 20) //判忙判斷 防止序列槽接收出現紊亂
//    {
//        record = 0;
//        for (i = 0; i < 15; i++)
//        {
//            Tmepbuf[i] = 0x00; //清空接收到的資料
//        }
//    }
}

void UART_Init(void)
{
    SCON = 0x50;
    TH2 = 0xFF;
    TL2 = 0xFD;
    RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200
    RCAP2L = 0xFD;

    /*****************/
    TCLK = 1;
    RCLK = 1;
    C_T2 = 0;
    EXEN2 = 0;

    /*****************/
    TR2 = 1;
    ES  = 1; //打開序列槽中斷
    EA  = 1; //打開總中斷
}

void SendByte(unsigned char dat) //序列槽發送單位元組資料
{
    unsigned char time_out;
    time_out = 0x00;
    SBUF = dat;						  //将資料放入SBUF中
    while ((!TI) && (time_out < 100)) //檢測是否發送出去
    {
        time_out++;
        DelayUs10x(2);
    }		//未發送出去 進行短暫延時
    TI = 0; //清除ti标志
}

void SendStr(unsigned char *s, unsigned char length) //發送定長度字元串
{
    unsigned char NUM;
    NUM = 0x00;
    while (NUM < length) //發送長度對比
    {
        SendByte(*s); //放松單位元組資料
        s++;		  //指針++
        NUM++;		  //下一個++
    }
}
void UART_SER(void) interrupt 4 //串行中斷服務程式
{
    unsigned char R_buf;
    static unsigned char firstBit = 0;
    // Rxd_Busy = 0;
    if (RI) //判斷是接收中斷産生
    {
        RI = 0; //标志位清零
        R_buf = SBUF;
        if (R_buf == '*')
        {
            firstBit = 1;
            record = 0;
            Tmepbuf[0] = 0;
            Tmepbuf[1] = 0;
            Tmepbuf[2] = 0; //清空資料
            record++;
        }
        else if (firstBit == 1)
        {
            Tmepbuf[record] = R_buf; //存儲接收
            record++;
            if (record >= 3)
            {
                firstBit = 0;
            }
            if (Tmepbuf[2] == '1')
            {
                if (Tmepbuf[1] == 'O')
                {
                    relay1Flag = OPEN; //狀态記錄
                    CountLater1 = 0; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'C')
                {
                    relay1Flag = CLOSE; //擷取狀态
                    CountLater1 = 0;  //擷取延時時間
                }
                else if (Tmepbuf[1] == 'U')
                {
                    relay1Flag = OPEN;  //狀态記錄
                    CountLater1 = 10; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'D')
                {
                    relay1Flag = CLOSE; //狀态記錄
                    CountLater1 = 10; //擷取延時時間
                }
            }
            else if (Tmepbuf[2] == '2')
            {
                if (Tmepbuf[1] == 'O')
                {
                    relay2Flag = OPEN; //狀态記錄
                    CountLater2 = 0; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'C')
                {
                    relay2Flag = CLOSE; //擷取狀态
                    CountLater2 = 0;  //擷取延時時間
                }
                else if (Tmepbuf[1] == 'U')
                {
                    relay2Flag = OPEN;  //狀态記錄
                    CountLater2 = 10; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'D')
                {
                    relay2Flag = CLOSE; //狀态記錄
                    CountLater2 = 10; //擷取延時時間
                }
            }
            else if (Tmepbuf[2] == '3')
            {
                if (Tmepbuf[1] == 'O')
                {
                    relay3Flag = OPEN; //狀态記錄
                    CountLater3 = 0; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'C')
                {
                    relay3Flag = CLOSE; //擷取狀态
                    CountLater3 = 0;  //擷取延時時間
                }
                else if (Tmepbuf[1] == 'U')
                {
                    relay3Flag = OPEN;  //狀态記錄
                    CountLater3 = 10; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'D')
                {
                    relay3Flag = CLOSE; //狀态記錄
                    CountLater3 = 10; //擷取延時時間
                }
            }
            else if (Tmepbuf[2] == '4')
            {
                if (Tmepbuf[1] == 'O')
                {
                    relay4Flag = OPEN; //狀态記錄
                    CountLater4 = 0; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'C')
                {
                    relay4Flag = CLOSE; //擷取狀态
                    CountLater4 = 0;  //擷取延時時間
                }
                else if (Tmepbuf[1] == 'U')
                {
                    relay4Flag = OPEN;  //狀态記錄
                    CountLater4 = 10; //擷取延時時間
                }
                else if (Tmepbuf[1] == 'D')
                {
                    relay4Flag = CLOSE; //狀态記錄
                    CountLater4 = 10; //擷取延時時間
                }
            }
            else if (Tmepbuf[2] == 'A')
            {
                if (Tmepbuf[1] == 'O')
                {
                    relay1Flag = OPEN; //狀态記錄
                    relay2Flag = OPEN;
                    relay3Flag = OPEN;
                    relay4Flag = OPEN;
                    CountLater1 = 0; //擷取延時時間
                    CountLater2 = 0;
                    CountLater3 = 0;
                    CountLater4 = 0;
                }
                else if (Tmepbuf[1] == 'C')
                {
                    relay1Flag = CLOSE; //擷取狀态
                    relay2Flag = CLOSE;
                    relay3Flag = CLOSE;
                    relay4Flag = CLOSE;
                    CountLater1 = 0; //擷取延時時間
                    CountLater2 = 0;
                    CountLater3 = 0;
                    CountLater4 = 0;
                }
                else if (Tmepbuf[1] == 'U')
                {
                    relay1Flag = OPEN; //狀态記錄
                    relay2Flag = OPEN;
                    relay3Flag = OPEN;
                    relay4Flag = OPEN;
                    CountLater1 = 10; //擷取延時時間
                    CountLater2 = 10;
                    CountLater3 = 10;
                    CountLater4 = 10;
                }
                else if (Tmepbuf[1] == 'D')
                {
                    relay1Flag = CLOSE; //狀态記錄
                    relay2Flag = CLOSE;
                    relay3Flag = CLOSE;
                    relay4Flag = CLOSE;
                    CountLater1 = 10; //擷取延時時間
                    CountLater2 = 10;
                    CountLater3 = 10;
                    CountLater4 = 10;
                }
            }
        }
    }
//    if (TI) //如果是發送标志位,清零
//        TI = 0;
}

           

仿真示範視訊:

https://www.bilibili.com/video/BV1jP41137L7/

實物示範視訊:

https://www.bilibili.com/video/BV1jd4y1872e/

繼續閱讀