功能:
0.本系统采用STM32F103RCT6作为单片机
1.LCD1602液晶实时显示当前时间/窗帘状态/光照强度
2.支持手动按键/定时/光强检测三种模式控制窗帘
3.'设置’键进入设置界面
4.默认状态下’确定’键可切换模式
5.设置界面’确定’为确定
6.支持掉电保存
7.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#include "reg52.h"
#include "LCD1602.h"
#include "DS1302.h"
#include "28BYJ48.h"
#include "eeprom52.h"
#include "tlc0832.h"
#include "infrared.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
sbit KEY_MODE = P3^3;
sbit KEY_ADD = P3^4;
sbit KEY_SUB = P3^6;
sbit KEY_ENTER = P3^5;
sbit BUZZER = P2^0;
sbit SW1 = P1^3;
uchar light_up = 80;
uchar light_down = 30;
uchar set_f = 0;
unsigned char dis[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
uchar num;
uchar ds[4] = {8, 30, 16, 20};
uchar mode = 0;
uchar light;
uint moto_num = 0;
uchar motor_state = 0;
bit moto_f = 0;
uchar code display_mode[3][3] = {"SD\0", "DS\0", "GK\0"};
void WriteData(void)
{
SectorErase(0x2000);
WriteByte(0x2000, ds[0]);
WriteByte(0x2001, ds[1]);
WriteByte(0x2002, ds[2]);
WriteByte(0x2003, ds[3]);
WriteByte(0x2004, light_up);
WriteByte(0x2005, light_down);
WriteByte(0x2006, mode);
}
void ReadData(void)
{
ds[0] = ReadByte(0x2000);
ds[1] = ReadByte(0x2001);
ds[2] = ReadByte(0x2002);
ds[3] = ReadByte(0x2003);
light_up = ReadByte(0x2004);
light_down = ReadByte(0x2005);
mode = ReadByte(0x2006);
}
void display(void)
{
uint t[3];
LCD_DispOneChar(0, 1, dis[time[2] / 10]);
LCD_DispOneChar(1, 1, dis[time[2] % 10]);
LCD_DispOneChar(2, 1, ':');
LCD_DispOneChar(3, 1, dis[time[1] / 10]);
LCD_DispOneChar(4, 1, dis[time[1] % 10]);
LCD_DispOneChar(5, 1, ':');
LCD_DispOneChar(6, 1, dis[time[0] / 10]);
LCD_DispOneChar(7, 1, dis[time[0] % 10]);
LCD_DispOneChar(0, 0, dis[time[6] / 10]);
LCD_DispOneChar(1, 0, dis[time[6] % 10]);
LCD_DispOneChar(2, 0, '/');
LCD_DispOneChar(3, 0, dis[time[4] / 10]);
LCD_DispOneChar(4, 0, dis[time[4] % 10]);
LCD_DispOneChar(5, 0, '/');
LCD_DispOneChar(6, 0, dis[time[3] / 10]);
LCD_DispOneChar(7, 0, dis[time[3] % 10]);
LCD_DispStr(9, 0, display_mode[mode]);
if (light > 99)
LCD_DispOneChar(12, 0, dis[light / 100]);
else
LCD_DispOneChar(12, 0, ' ');
LCD_DispOneChar(13, 0, dis[light % 100 / 10]);
LCD_DispOneChar(14, 0, dis[light % 10]);
LCD_DispOneChar(15, 0, '%');
if (mode == 2)
{
if ((light >= light_up || light < light_down))
{
moto_f = 0;
motor_state = 1;
}
else if ((light < light_up && light >= light_down))
{
moto_f = 1;
motor_state = 1;
}
}
else if (mode == 1)
{
t[0] = time[2] * 60 + time[1];
t[1] = ds[0] * 60 + ds[1];
t[2] = ds[2] * 60 + ds[3];
if (t[1] < t[2])
{
if (t[0] >= t[1] && t[0] <= t[2])
moto_f = 1;
else
moto_f = 0;
}
else
{
if (t[0] >= t[1] || t[0] <= t[2])
moto_f = 1;
else
moto_f = 0;
}
motor_state = 1;
}
if (moto_f == 0 && motor_state != 0 && SW1 != 0)
{
if (moto_num == 0)
{
BYJ48 = BYJ48 & 0xf0;
motor_state = 0;
LCD_DispStr(10, 1, "ZT:OFF");
}
else
{
motor_z();
moto_num--;
LCD_DispStr(10, 1, "-->OFF");
}
}
else if (moto_f == 1 && motor_state != 2 && SW1 != 0)
{
if (moto_num >= 192)
{
BYJ48 = BYJ48 & 0xf0;
motor_state = 2;
LCD_DispStr(10, 1, "ZT:ON ");
}
else
{
motor_f();
moto_num++;
LCD_DispStr(10, 1, "-->ON ");
}
}
else
{
BYJ48 = BYJ48 & 0xf0;
if (motor_state == 0)
LCD_DispStr(10, 1, "ZT:OFF");
else if (motor_state == 2)
LCD_DispStr(10, 1, "ZT:ON ");
}
}
void display2()
{
num++;
LCD_DispStr(1, 0, "Date:");
LCD_DispStr(1, 1, "Time:");
if (num % 2 == 0)
{
LCD_DispOneChar(6, 0, dis[time[6] / 10]);
LCD_DispOneChar(7, 0, dis[time[6] % 10]);
LCD_DispOneChar(8, 0, '/');
LCD_DispOneChar(9, 0, dis[time[4] / 10]);
LCD_DispOneChar(10, 0, dis[time[4] % 10]);
LCD_DispOneChar(11, 0, '/');
LCD_DispOneChar(12, 0, dis[time[3] / 10]);
LCD_DispOneChar(13, 0, dis[time[3] % 10]);
LCD_DispOneChar(6, 1, dis[time[2] / 10]);
LCD_DispOneChar(7, 1, dis[time[2] % 10]);
LCD_DispOneChar(8, 1, ':');
LCD_DispOneChar(9, 1, dis[time[1] / 10]);
LCD_DispOneChar(10, 1, dis[time[1] % 10]);
LCD_DispOneChar(11, 1, ':');
LCD_DispOneChar(12, 1, dis[time[0] / 10]);
LCD_DispOneChar(13, 1, dis[time[0] % 10]);
}
else
{
switch (set_f)
{
case 1:
LCD_DispStr(6, 0, " ");
break;
case 2:
LCD_DispStr(9, 0, " ");
break;
case 3:
LCD_DispStr(12, 0, " ");
break;
case 4:
LCD_DispStr(6, 1, " ");
break;
case 5:
LCD_DispStr(9, 1, " ");
break;
case 6:
LCD_DispStr(12, 1, " ");
break;
default:
break;
}
}
}
void display3()
{
num++;
LCD_DispStr(0, 0, "Sets timer time:");
LCD_DispStr(7, 1, "--");
if (num % 2 == 0)
{
LCD_DispOneChar(1, 1, dis[ds[0] / 10]);
LCD_DispOneChar(2, 1, dis[ds[0] % 10]);
LCD_DispOneChar(3, 1, ':');
LCD_DispOneChar(4, 1, dis[ds[1] / 10]);
LCD_DispOneChar(5, 1, dis[ds[1] % 10]);
LCD_DispOneChar(10, 1, dis[ds[2] / 10]);
LCD_DispOneChar(11, 1, dis[ds[2] % 10]);
LCD_DispOneChar(12, 1, ':');
LCD_DispOneChar(13, 1, dis[ds[3] / 10]);
LCD_DispOneChar(14, 1, dis[ds[3] % 10]);
}
else
{
switch (set_f)
{
case 7:
LCD_DispStr(1, 1, " ");
break;
case 8:
LCD_DispStr(4, 1, " ");
break;
case 9:
LCD_DispStr(10, 1, " ");
break;
case 10:
LCD_DispStr(13, 1, " ");
break;
default:
break;
}
}
}
void display4(void)
{
num++;
LCD_DispStr(0, 0, "Light_Up :");
LCD_DispStr(0, 1, "Light_Down:");
LCD_DispOneChar(15, 0, '%');
LCD_DispOneChar(15, 1, '%');
if (num % 2 == 0)
{
LCD_DispOneChar(12, 0, dis[light_up / 100]);
LCD_DispOneChar(13, 0, dis[light_up % 100 / 10]);
LCD_DispOneChar(14, 0, dis[light_up % 10]);
LCD_DispOneChar(12, 1, dis[light_down / 100]);
LCD_DispOneChar(13, 1, dis[light_down % 100 / 10]);
LCD_DispOneChar(14, 1, dis[light_down % 10]);
}
else
{
switch (set_f)
{
case 11:
LCD_DispStr(12, 0, " ");
break;
case 12:
LCD_DispStr(12, 1, " ");
break;
default:
break;
}
}
}
void KeyScan(void)
{
if (hw_data == 'B' || KEY_MODE == 0)
{
DelayMs(50);
if (hw_data == 'B' || KEY_MODE == 0)
{
BUZZER = 0;
DelayMs(130);
BUZZER = 1;
BYJ48 = BYJ48 & 0xf0;
if (set_f == 6)
{
LCD_Clear();
DelayMs(4);;
set_f = 13;
}
else if (set_f == 0)
{
Write_DS1302(WRITE_PROTECT, 0X00);
LCD_Clear();
DelayMs(4);;
switch (mode)
{
case 0:
set_f = 1;
break;
case 1:
set_f = 7;
break;
case 2:
set_f = 11;
break;
default:
break;
}
}
else if (set_f == 10 || set_f == 12)
{
LCD_Clear();
DelayMs(4);;
set_f = 1;
}
else
set_f++;
if (set_f > 12)
{
set_f = 0;
Write_DS1302(WRITE_MINUTE, (time[1] / 10) * 16 + time[1] % 10);
Write_DS1302(WRITE_SECOND, (time[0] / 10) * 16 + time[0] % 10);
WriteData();
LCD_Clear();
DelayMs(4);;
}
}
while (!KEY_MODE)
;
}
if (hw_data == '|' || KEY_ENTER == 0)
{
DelayMs(50);
if ((hw_data == '|' || KEY_ENTER == 0) && set_f != 0)
{
BUZZER = 0;
DelayMs(130);
BUZZER = 1;
if (set_f < 7)
{
Write_DS1302(WRITE_MINUTE, (time[1] / 10) * 16 + time[1] % 10);
Write_DS1302(WRITE_SECOND, (time[0] / 10) * 16 + time[0] % 10);
}
set_f = 0;
WriteData();
LCD_Clear();
DelayMs(4);;
}
else if (KEY_ENTER == 0 && set_f == 0)
{
mode++;
if (mode >= 3)
mode = 0;
if (motor_state == 1)
{
if (moto_f == 0)
motor_state = 0;
else
motor_state = 2;
}
WriteData();
}
while (!KEY_ENTER)
;
} 作者:极寒钛科技 https:
实物演示视频:
https://www.bilibili.com/video/BV1PV4y1L7nH/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)