欢迎光临
我们一直在努力

STM32项目开源:智能万年历/智能闹钟设计(代码+原理图+仿真)

文章目录

  • 一、前言
  • 二、项目功能简介
  • 三、PCB设计
  • 四、原理图设计
  • 五、程序设计
  • 六、包含内容
  • 七、资料分享

一、前言

实物项目成品: 在这里插入图片描述

仿真项目成品: 在这里插入图片描述

哔哩哔哩开源视频链接(复制浏览器打开): https://www.bilibili.com/video/BV1Shtz6aEBZ/?vd_source=10da4d04d580bd6b34f7298120737c50

(资料分享见文末)

二、项目功能简介

【开源】STM32单片机智能万年历/智能闹钟设计(代码+原理图+仿真)-编号:CY26040 【功能介绍】 (1)实时时钟显示:DS1302时钟模块实时显示当前时间,确保时间信息清晰直观 (2)时间设置与断电保存:可灵活调整时间设置,系统具备断电记忆功能,重启后仍能保持最新时间配置 (3)闹钟设置与蜂鸣器报警:支持自定义闹钟时间(2个),到达设定时间后蜂鸣器自动鸣响提醒,并可手动关闭 (4)环境采集与显示:实时监测环境温湿度、光照数据并显示,如检测到数值异常,系统将自动触发声光报警 (5)手机APP功能:可通过手机APP同步网络时间,自动校准设备时间;支持远程设置闹钟,并可在APP端灵活开启或关闭闹钟功能

三、PCB设计

在这里插入图片描述

四、原理图设计

在这里插入图片描述

五、程序设计

代码如下:

int main(void)
{
delay_init(); // 延时函数 系统初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级

LED_GPIO_Config(); // 初始化GPIO接口

KEY_Init(); // 按键初始化

BEEP_Init(); // 蜂鸣器初始化

GENERAL4_TIM_Init(); // 10ms 通用定时器3初始化 10ms

NVIC_Configuration(); // 中断优先级设置

ds1302_gpio_init(); // 初始化ds1302端口
//ds1302_write_time(); //修改时间,写入
delay_ms(5);

ds1032_read_realTime(); // 读取此时时刻

OLED_Init(); // 初始化OLED
OLED_Clear(); // 清屏
delay_ms(1000);
OLED_ShowString(8, 2," loading… ", 16);//显示加载中
DHT11_Init(); // 传感器初始化
delay_ms(1000);
OLED_Clear(); // 清屏
OLED_DrawBMP(0, 0, 128, 8, BMP19); // 欢迎使用开机页面

delay_ms(1000);

OLED_Clear(); // 清屏

RealTime_Display_Init(); // 上电初始化显示实时时间

while (1)
{

delay_ms(200); // 添加延时,保证检测的稳定性
if(Timeflag!=1)
ds1032_read_realTime(); // 读取此时时刻

RealTime_Display(); // 实时时间日期实时刷新显示
if (DHT11_Data_Read_flag) // 6秒读取一次温湿度数据
{
DHT11_Read_Data(&temperature, &humidity); // 读取温湿度值
DHT11_Data_Read_flag = 0; // 复位读取DHT11数据标志
}

//************************闹钟报警程序段***********************************************//
if (Alarm_Clock==1 && !Alarm_Manual_Stop_flag)
{
if ((TimeData.hour == Alarm_Hour) && (TimeData.minute == Alarm_Minute))
{
Alarm_Clock_flag = 1; // 闹钟报警标志位
}

else
{
Alarm_Clock_flag = 0; // 闹钟报警标志位
}
}
else
{
Alarm_Clock_flag = 0; // 闹钟报警标志位
}

if(!KEY_DEC) // 闹钟报警过程中停止按键 减少键
{
delay_ms(10);
if (KEY_DEC == 0)
{
while (!KEY_DEC)
;

Alarm_Manual_Stop_flag = 1;
BEEP_UNABLE;
}
}

if (TimeData.minute != Alarm_Minute) // 一旦设定值与当前时间不一致则手动终端报警复位
{
Alarm_Manual_Stop_flag = 0;
}
//**************************按键修改时间和日期程序段***************************************//
if (!KEY_ADJ)
{
delay_ms(10);

if (KEY_ADJ == 0)
{
while (!KEY_ADJ)
;

OLED_Clear(); // 清屏

OLED_ShowChinese(0, 0, 21); // 年
OLED_ShowChinese(68, 0, 22); // 月
OLED_ShowChinese(0, 3, 23); // 日
OLED_ShowChinese(68, 3, 24); // 时
OLED_ShowChinese(0, 6, 25); // 分
OLED_ShowChinese(68, 6, 26); // 周

Show_Modify_Data(num); // 显示默认的时间日期设定参数

while (1)
{
OLED_ShowNum(20, 0, y, 2, 16);
OLED_ShowNum(88, 0, m, 2, 16);
OLED_ShowNum(20, 3, d, 2, 16);
OLED_ShowNum(88, 3, h, 2, 16);
OLED_ShowNum(20, 6, mi, 2, 16);
OLED_ShowNum(88, 6, w, 2, 16);

if (!KEY_ALM)
{
delay_ms(10);
if (KEY_ALM == 0)
{
while (!KEY_ALM)
;
num++;
if (num > 5)
num = 0;
Show_Modify_Data(num);
}
}

if (!KEY_ADD)
{
delay_ms(10);
if (KEY_ADD == 0)
{
while (!KEY_ADD)
;

switch (num)
{
case 0:
y++;
break;
case 1:
m++;
break;
case 2:
d++;
break;
case 3:
h++;
break;
case 4:
mi++;
break;
case 5:
w++;
break;
}
if (y > 59)
y = 59;
if (m > 12)
m = 12;
if (d > 31)
d = 31;
if (h > 23)
h = 23;
if (mi > 59)
mi = 59;
if (w > 7)
w = 7;
}
}

if (!KEY_DEC)
{
delay_ms(10);
if (KEY_DEC == 0)
{
while (!KEY_DEC)
;
switch (num)
{
case 0:
y;
break;
case 1:
m;
break;
case 2:
d;
break;
case 3:
h;
break;
case 4:
mi;
break;
case 5:
w;
break;
}
if (y <= 1)
y = 1;
if (m < 1)
m = 1;
if (d < 1)
d = 1;
if (h < 1)
h = 1;
if (mi < 1)
mi = 1;
if (w < 1)
w = 1;
}
}

if (!KEY_ADJ)
{
delay_ms(10);
if (KEY_ADJ == 0)
{
while (!KEY_ADJ)
;

switch (y) // 设置年
{
case 0:
time_buf[1] = 0x00;
break;
case 1:
time_buf[1] = 0x01;
break;
case 2:
time_buf[1] = 0x02;
break;
case 3:
time_buf[1] = 0x03;
break;
case 4:
time_buf[1] = 0x04;
break;
case 5:
time_buf[1] = 0x05;
break;
case 6:
time_buf[1] = 0x06;
break;
case 7:
time_buf[1] = 0x07;
break;
case 8:
time_buf[1] = 0x08;
break;
case 9:
time_buf[1] = 0x09;
break;
case 10:
time_buf[1] = 0x10;
break;
case 11:
time_buf[1] = 0x11;
break;
case 12:
time_buf[1] = 0x12;
break;
case 13:
time_buf[1] = 0x13;
break;
case 14:
time_buf[1] = 0x14;
break;
case 15:
time_buf[1] = 0x15;
break;
case 16:
time_buf[1] = 0x16;
break;
case 17:
time_buf[1] = 0x17;
break;
case 18:
time_buf[1] = 0x18;
break;
case 19:
time_buf[1] = 0x19;
break;
case 20:
time_buf[1] = 0x20;
break;
case 21:
time_buf[1] = 0x21;
break;
case 22:
time_buf[1] = 0x22;
break;
case 23:
time_buf[1] = 0x23;
break;
case 24:
time_buf[1] = 0x24;
break;
case 25:
time_buf[1] = 0x25;
break;
case 26:
time_buf[1] = 0x26;
break;
case 27:
time_buf[1] = 0x27;
break;
case 28:
time_buf[1] = 0x28;
break;
case 29:
time_buf[1] = 0x29;
break;
case 30:
time_buf[1] = 0x30;
break;
case 31:
time_buf[1] = 0x31;
break;

case 32:
time_buf[1] = 0x32;
break;
case 33:
time_buf[1] = 0x33;
break;
case 34:
time_buf[1] = 0x34;
break;
case 35:
time_buf[1] = 0x35;
break;
case 36:
time_buf[1] = 0x36;
break;
case 37:
time_buf[1] = 0x37;
break;
case 38:
time_buf[1] = 0x38;
break;
case 39:
time_buf[1] = 0x39;
break;
case 40:
time_buf[1] = 0x40;
break;
case 41:
time_buf[1] = 0x41;
break;
case 42:
time_buf[1] = 0x42;
break;
case 43:
time_buf[1] = 0x43;
break;
case 44:
time_buf[1] = 0x44;
break;
case 45:
time_buf[1] = 0x45;
break;
case 46:
time_buf[1] = 0x46;
break;
case 47:
time_buf[1] = 0x47;
break;
case 48:
time_buf[1] = 0x48;
break;
case 49:
time_buf[1] = 0x49;
break;
case 50:
time_buf[1] = 0x50;
break;
case 51:
time_buf[1] = 0x51;
break;
case 52:
time_buf[1] = 0x52;
break;
case 53:
time_buf[1] = 0x53;
break;
case 54:
time_buf[1] = 0x54;
break;
case 55:
time_buf[1] = 0x55;
break;
case 56:
time_buf[1] = 0x56;
break;
case 57:
time_buf[1] = 0x57;
break;
case 58:
time_buf[1] = 0x58;
break;
case 59:
time_buf[1] = 0x59;
break;

default:
time_buf[5] = 0x01;
}

switch (m) // 设置月
{

case 1:
time_buf[2] = 0x01;
break;
case 2:
time_buf[2] = 0x02;
break;
case 3:
time_buf[2] = 0x03;
break;
case 4:
time_buf[2] = 0x04;
break;
case 5:
time_buf[2] = 0x05;
break;
case 6:
time_buf[2] = 0x06;
break;
case 7:
time_buf[2] = 0x07;
break;
case 8:
time_buf[2] = 0x08;
break;
case 9:
time_buf[2] = 0x09;
break;
case 10:
time_buf[2] = 0x10;
break;
case 11:
time_buf[2] = 0x11;
break;
case 12:
time_buf[2] = 0x12;
break;
default:
time_buf[2] = 0x01;
}
switch (d) // 设置日
{

case 1:
time_buf[3] = 0x01;
break;
case 2:
time_buf[3] = 0x02;
break;
case 3:
time_buf[3] = 0x03;
break;
case 4:
time_buf[3] = 0x04;
break;
case 5:
time_buf[3] = 0x05;
break;
case 6:
time_buf[3] = 0x06;
break;
case 7:
time_buf[3] = 0x07;
break;
case 8:
time_buf[3] = 0x08;
break;
case 9:
time_buf[3] = 0x09;
break;
case 10:
time_buf[3] = 0x10;
break;
case 11:
time_buf[3] = 0x11;
break;
case 12:
time_buf[3] = 0x12;
break;
case 13:
time_buf[3] = 0x13;
break;
case 14:
time_buf[3] = 0x14;
break;
case 15:
time_buf[3] = 0x15;
break;
case 16:
time_buf[3] = 0x16;
break;
case 17:
time_buf[3] = 0x17;
break;
case 18:
time_buf[3] = 0x18;
break;
case 19:
time_buf[3] = 0x19;
break;
case 20:
time_buf[3] = 0x20;
break;
case 21:
time_buf[3] = 0x21;
break;
case 22:
time_buf[3] = 0x22;
break;
case 23:
time_buf[3] = 0x23;
break;
case 24:
time_buf[3] = 0x24;
break;
case 25:
time_buf[3] = 0x25;
break;
case 26:
time_buf[3] = 0x26;
break;
case 27:
time_buf[3] = 0x27;
break;
case 28:
time_buf[3] = 0x28;
break;
case 29:
time_buf[3] = 0x29;
break;
case 30:
time_buf[3] = 0x30;
break;
case 31:
time_buf[3] = 0x31;
break;
default:
time_buf[3] = 0x01;
}

switch (h) // 设置时
{
case 0:
time_buf[4] = 0x00;
break;
case 1:
time_buf[4] = 0x01;
break;
case 2:
time_buf[4] = 0x02;
break;
case 3:
time_buf[4] = 0x03;
break;
case 4:
time_buf[4] = 0x04;
break;
case 5:
time_buf[4] = 0x05;
break;
case 6:
time_buf[4] = 0x06;
break;
case 7:
time_buf[4] = 0x07;
break;
case 8:
time_buf[4] = 0x08;
break;
case 9:
time_buf[4] = 0x09;
break;
case 10:
time_buf[4] = 0x10;
break;
case 11:
time_buf[4] = 0x11;
break;
case 12:
time_buf[4] = 0x12;
break;
case 13:
time_buf[4] = 0x13;
break;
case 14:
time_buf[4] = 0x14;
break;
case 15:
time_buf[4] = 0x15;
break;
case 16:
time_buf[4] = 0x16;
break;
case 17:
time_buf[4] = 0x17;
break;
case 18:
time_buf[4] = 0x18;
break;
case 19:
time_buf[4] = 0x19;
break;
case 20:
time_buf[4] = 0x20;
break;
case 21:
time_buf[4] = 0x21;
break;
case 22:
time_buf[4] = 0x22;
break;
case 23:
time_buf[4] = 0x23;
break;

default:
time_buf[4] = 0x01;
}
switch (mi) // 设置分
{
case 0:
time_buf[5] = 0x00;
break;
case 1:
time_buf[5] = 0x01;
break;
case 2:
time_buf[5] = 0x02;
break;
case 3:
time_buf[5] = 0x03;
break;
case 4:
time_buf[5] = 0x04;
break;
case 5:
time_buf[5] = 0x05;
break;
case 6:
time_buf[5] = 0x06;
break;
case 7:
time_buf[5] = 0x07;
break;
case 8:
time_buf[5] = 0x08;
break;
case 9:
time_buf[5] = 0x09;
break;
case 10:
time_buf[5] = 0x10;
break;
case 11:
time_buf[5] = 0x11;
break;
case 12:
time_buf[5] = 0x12;
break;
case 13:
time_buf[5] = 0x13;
break;
case 14:
time_buf[5] = 0x14;
break;
case 15:
time_buf[5] = 0x15;
break;
case 16:
time_buf[5] = 0x16;
break;
case 17:
time_buf[5] = 0x17;
break;
case 18:
time_buf[5] = 0x18;
break;
case 19:
time_buf[5] = 0x19;
break;
case 20:
time_buf[5] = 0x20;
break;
case 21:
time_buf[5] = 0x21;
break;
case 22:
time_buf[5] = 0x22;
break;
case 23:
time_buf[5] = 0x23;
break;
case 24:
time_buf[5] = 0x24;
break;
case 25:
time_buf[5] = 0x25;
break;
case 26:
time_buf[5] = 0x26;
break;
case 27:
time_buf[5] = 0x27;
break;
case 28:
time_buf[5] = 0x28;
break;
case 29:
time_buf[5] = 0x29;
break;
case 30:
time_buf[5] = 0x30;
break;
case 31:
time_buf[5] = 0x31;
break;

case 32:
time_buf[5] = 0x32;
break;
case 33:
time_buf[5] = 0x33;
break;
case 34:
time_buf[5] = 0x34;
break;
case 35:
time_buf[5] = 0x35;
break;
case 36:
time_buf[5] = 0x36;
break;
case 37:
time_buf[5] = 0x37;
break;
case 38:
time_buf[5] = 0x38;
break;
case 39:
time_buf[5] = 0x39;
break;
case 40:
time_buf[5] = 0x40;
break;
case 41:
time_buf[5] = 0x41;
break;
case 42:
time_buf[5] = 0x42;
break;
case 43:
time_buf[5] = 0x43;
break;
case 44:
time_buf[5] = 0x44;
break;
case 45:
time_buf[5] = 0x45;
break;
case 46:
time_buf[5] = 0x46;
break;
case 47:
time_buf[5] = 0x47;
break;
case 48:
time_buf[5] = 0x48;
break;
case 49:
time_buf[5] = 0x49;
break;
case 50:
time_buf[5] = 0x50;
break;
case 51:
time_buf[5] = 0x51;
break;
case 52:
time_buf[5] = 0x52;
break;
case 53:
time_buf[5] = 0x53;
break;
case 54:
time_buf[5] = 0x54;
break;
case 55:
time_buf[5] = 0x55;
break;
case 56:
time_buf[5] = 0x56;
break;
case 57:
time_buf[5] = 0x57;
break;
case 58:
time_buf[5] = 0x58;
break;
case 59:
time_buf[5] = 0x59;
break;

default:
time_buf[5] = 0x01;
}
switch (w) // 设置星期
{
case 1:
time_buf[6] = 0x01;
break;
case 2:
time_buf[6] = 0x02;
break;
case 3:
time_buf[6] = 0x03;
break;
case 4:
time_buf[6] = 0x04;
break;
case 5:
time_buf[6] = 0x05;
break;
case 6:
time_buf[6] = 0x06;
break;
case 7:
time_buf[6] = 0x07;
break;

default:
time_buf[6] = 0x01;
}

ds1302_write_time(); // 修改时间,写入

OLED_Clear(); // 清屏

ds1032_read_realTime(); // 读取此时时刻

Modify_RealTime_Display(); // 修改后时间日期刷新一次显示

break;
}
}
}
}
}

//******************************修改闹钟时间和闹钟设定程序段*******************************//

if (!KEY_ALM)
{
delay_ms(10);
if (KEY_ALM == 0)
{
while (!KEY_ALM)
;

OLED_Clear(); // 清屏

OLED_ShowChinese(32, 0, 27); // 闹钟设定
OLED_ShowChinese(48, 0, 28);
OLED_ShowChinese(64, 0, 29);
OLED_ShowChinese(80, 0, 30);

OLED_ShowChar(60, 3, ':', 16);

Show_Modify_Alarm(num2); // 显示修改闹钟信息

while (1)
{

OLED_ShowNum(44, 3, Alarm_Hour, 2, 16);

OLED_ShowNum(68, 3, Alarm_Minute, 2, 16);

if (Alarm_Clock==1) // 闹钟开关显示
{
OLED_ShowChinese(104, 3, 31);
}
else
{
OLED_ShowChinese(104, 3, 32);
}

if (Alarm_Minute < 10) // 防止显示1位数,不整齐
{
OLED_ShowChar(68, 3, '0', 16); // 0位补偿
}
if (!KEY_ADJ)
{
delay_ms(10);
if (KEY_ADJ == 0)
{
while (!KEY_ADJ)
;
num2++;
if (num2 > 2)
num2 = 0;
Show_Modify_Alarm(num2);
}
}

if (!KEY_ADD)
{
delay_ms(10);
if (KEY_ADD == 0)
{
while (!KEY_ADD)
;

switch (num2)
{
case 0:
Alarm_Hour++;
break;
case 1:
Alarm_Minute++;
break;
case 2:
Alarm_Clock=1;

break;
}
if (Alarm_Hour > 23)
Alarm_Hour = 23;
if (Alarm_Minute > 59)
Alarm_Minute = 59;
if (Alarm_Clock >= 1)
Alarm_Clock = 1;
}
}

if (!KEY_DEC)
{
delay_ms(10);
if (KEY_DEC == 0)
{
while (!KEY_DEC)
;
switch (num2)
{
case 0:
Alarm_Hour;
break;
case 1:
Alarm_Minute;
break;
case 2:
Alarm_Clock=0;
break;
}
if (Alarm_Hour <= 0)
Alarm_Hour = 0;
if (Alarm_Minute <= 0)
Alarm_Minute = 0;
if (Alarm_Clock <= 0)
Alarm_Clock = 0;
}
}

if (!KEY_ALM)
{
delay_ms(10);
if (KEY_ALM == 0)
{
while (!KEY_ALM)
;

OLED_Clear();

ds1032_read_realTime(); // 读取此时时刻

Modify_RealTime_Display(); // 修改后时间日期刷新一次显示

break;
}
}
}
}
}
}
}

六、包含内容

在这里插入图片描述

七、资料分享

资料获取:请查看主页介绍搜索或观看开源视频获取

赞(0)
未经允许不得转载:171主机测评 » STM32项目开源:智能万年历/智能闹钟设计(代码+原理图+仿真)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址