功能:
0.本系統采用STC89C52作為單片機
1.手機通過wifi控制4路繼電器的開和關以及定時:
手機發送OA,繼電器全部打開,
手機發送CA,繼電器全部關閉,
手機發送O14,繼電器14打開,
手機發送C14,繼電器14閉合,
就是手機發送U14,繼電器14,10s後打開,
就是手機發送D14,繼電器14,10s後關閉。
2.系統具備四路繼電器可以控制四種家電
3.采用DC002作為電源接口可直接輸入5V給整個系統供電
原理圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0czNhljM2U2M1ImNxkjMhVDOwQTMhVGN0EDN3QmM3E2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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/