如何在51单片机实现日程提醒(生日闹钟)

51单片机制作万年历过程中的日程提醒部分,主要说明设计算法,软件特性可以在proteus上仿真。日程提醒是人机交互的一部分,因此日程提醒的实现与具体的人机交互方式息息相关,本系统采用4x4矩阵键盘作为人间交互的接口。下面直接上代码:

日程定义

日程主要由月/日与时/分确立,以及日程的状态组成。日程可逻辑抽象为数据类型schedule_t:

typedef enum {  // 日程状态SCHEDULE_OFF = 0,SCHEDULE_ON  = 1,SCHEDULE_BUTT
} schedule_state_t;
typedef struct {  // 日程u8 month;u8 day;u8 hour;u8 miunte;schedule_state_t state;
} schedule_t;static schedule_t schedule = { 0, 0, 0, 0, SCHEDULE_OFF };  // 日程配置
static u8 cur_pos = 1;  // 游标位置

对外接口

对外接口主要由日程初始化,检测日程提醒,设置日程,关闭日程提醒等操作组成。

void schedule_init(void);    // 日程初始化
void schedule_deinit(void);    // 日程去初始化
u8 schedule_check(u8 now_month, u8 now_day, u8 now_hour, u8 now_miunte);     // 日程检测
void schedule_response_key(key_t key);  // 按键响应
void schedule_display(void);  // 日程显示
void schedule_close(void);  // 关闭日程

日程提醒初始化

主要是预置日程显示格式、界面等,前两位为月/日参数显示,使用“-”连接,后两位为时/分参数显示,使用“:”连接,界面如下图所示:

/*******************************************************************************
* 函 数 名         : schedule_init
* 函数功能         : 日程初始化
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_init(void)    // 日程初始化
{lcd1602_write_cmd(LCD1602_DISPLAY_CONTROL);  // 关闭光标和闪烁lcd1602_clean();lcd1602_set_pos(0, 1);lcd1602_write_str("set schedule:");lcd1602_set_pos(0, 0);lcd1602_write_num(2, schedule.month);lcd1602_write_data('-');lcd1602_write_num(2, schedule.day);lcd1602_set_pos(6, 0);lcd1602_write_num(2, schedule.hour);lcd1602_write_data(':');lcd1602_write_num(2, schedule.miunte);lcd1602_set_pos(13, 0);if (schedule.state == SCHEDULE_ON) {lcd1602_write_str(" on");} else {lcd1602_write_str("off");}lcd1602_set_pos(0, 0);lcd1602_write_cmd(0x08 |  // 显示光标并闪烁LCD1602_DISPLAY_ENABLE |LCD1602_CURSOR_ENABLE |LCD1602_CURSOR_TWINKLE);cur_pos = SCHEDULE_CUR_POS_MAX;
}

日程提醒检测

通过对比在一定时间范围内,检测到日程有效便激活蜂鸣器,否则关闭。激活蜂鸣器部分主要思想如下:
1、日程状态必须为SCHEDULE_ON,即:打开日程提醒;
2、在月/日与时/分检测到相等的情况下,往后推迟的SCHEDULE_CONTINUE_TIME分钟时间激活蜂鸣器;
3、否则关闭蜂鸣器。

/*******************************************************************************
* 函 数 名         : schedule_check
* 函数功能         : 日程检测
* 输    入         : now_month/now_day/now_hour/now_miunte:当前月/日/时/分
* 输    出         : u8:0没有激活,other已激活
* 说    名         : none
*******************************************************************************/
u8 schedule_check(u8 now_month, u8 now_day, u8 now_hour, u8 now_miunte)     // 日程检测
{static u8 state = 0;if (schedule.state != SCHEDULE_ON) {buzzer_disable_passive();return 0;}if ((state == 0) && (schedule.month == now_month) && (schedule.day == now_day) &&(schedule.hour == now_hour) && (schedule.miunte == now_miunte)) {state = 1;}if (state != 1) {buzzer_disable_passive();return 0;}if (((now_hour * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) >= 0) &&((now_hour * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) <= SCHEDULE_CONTINUE_TIME)) {buzzer_enable_passive();return 1;} else {state = 0;}if ((schedule.hour == 23) && (now_hour == 0)) {if (((24 * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) >= 0) &&((24 * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) <= SCHEDULE_CONTINUE_TIME)) {buzzer_enable_passive();return 1;} else {state = 0;}}return 0;
}

矩阵键盘

键盘如下图所示:

设置日程

用户通过4x4矩阵键盘设定日程,事实上是日程某函数响应按键的过程,从日程抽象类型schedule_t分析,日程设定主要是修改月份、日期、小时和分钟,以及日程状态,如下表所示:

日程状态
1-12 1-31 0-23 0-59 on/off

其中月份、日期、小时和分钟可进一步细分为十位和个位2项修改项,总计有9项修改项,如下表所示:

月份十位 月份个位 日期十位 日期个位 小时十位 小时个位 分钟十位 分钟个位 日程状态
取值0-1 月份十位<1,取值1-9;月份十位=1,取值0-2 取值0-3 日期十位<3,取值1-9;日期十位=3,取值0-1 取值0-2 小时十位<2,取值0-9;小时十位=2,取值0-3 取值0-5 取值0-9 on/off

设定日程其实是在描述一个分段函数,根据光标当前所在位置,按键0-9直接修改日程的月份/日期/小时/分钟值,add/sub将月份/日期/小时/分钟值加一/减一,trans用于切换日程状态,enter键用于循环移动光标位置。日程按键响应代码如下:

/*******************************************************************************
* 函 数 名         : schedule_response_key
* 函数功能         : 按键响应
* 输    入         : key:按键值
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_response_key(key_t key)  // 按键响应
{switch (key) {case KEY_0:case KEY_1:case KEY_2:case KEY_3:case KEY_4:case KEY_5:case KEY_6:case KEY_7:case KEY_8:case KEY_9: {if ((cur_pos == 1) && (key <= KEY_1)) {  // 月十位不能超过1schedule.month = 10 * key + schedule.month % 10;} else if (cur_pos == 2) {  // 月个位取值0-9,3-9有限制if (key <= KEY_2) {schedule.month = key + schedule.month / 10 * 10;} else if ((key > KEY_2) && (schedule.month / 10 < 1)) {schedule.month = key + schedule.month / 10 * 10;}} else if ((cur_pos == 3) && (key <= KEY_3)) {  // 天十位不能超过3schedule.day = 10 * key + schedule.day % 10;} else if (cur_pos == 4) {  // 天个位取值0-9,2-9有限制if (key <= KEY_1) {schedule.day = key + schedule.day / 10 * 10;} else if ((key > KEY_1) && (schedule.day / 10 < 3)) {schedule.day = key + schedule.day / 10 * 10;}} else if ((cur_pos == 5) && (key <= KEY_2)) {  // 时十位取值0-2schedule.hour = 10 * key + schedule.hour % 10;} else if (cur_pos == 6) {  // 时个位取值0-9,4-9有限制if (key <= KEY_3) {schedule.hour = key + schedule.hour / 10 * 10;} else if ((key > KEY_3) && (schedule.hour / 10 < 2)) {schedule.hour = key + schedule.hour / 10 * 10;}} else if ((cur_pos == 7) && (key <= KEY_5)) {  // 分十位取值0-5schedule.miunte = 10 * key + schedule.miunte % 10;} else if (cur_pos == 8) {  // 分个位取值0-9schedule.miunte = key + schedule.miunte / 10 * 10;}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_ADD: {  // 加1if ((cur_pos == 1) || (cur_pos == 2)) {if (schedule.month < 12) {schedule.month++;}} else if ((cur_pos == 3) || (cur_pos == 4)) {if (schedule.day < 31) {schedule.day++;}} else if ((cur_pos == 5) || (cur_pos == 6)) {if (schedule.hour < 23) {schedule.hour++;}} else if ((cur_pos == 7) || (cur_pos == 8)) {if (schedule.miunte < 59) {schedule.miunte++;}}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_SUB: {  // 减1if ((cur_pos == 1) || (cur_pos == 2)) {if (schedule.month > 0) {schedule.month--;}} else if ((cur_pos == 3) || (cur_pos == 4)) {if (schedule.day > 0) {schedule.day--;}} else if ((cur_pos == 5) || (cur_pos == 6)) {if (schedule.hour > 0) {schedule.hour--;}} else if ((cur_pos == 7) || (cur_pos == 8)) {if (schedule.miunte > 0) {schedule.miunte--;}}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_ENTER: {  // 移动游标cur_pos++; if (cur_pos > SCHEDULE_CUR_POS_MAX) {cur_pos = 1;}break;}case KEY_TRANS: {  // 切换日程状态if (cur_pos == 9) {if (schedule.state == SCHEDULE_OFF) {schedule.state = SCHEDULE_ON;} else {schedule.state = SCHEDULE_OFF;}}break;}case KEY_FUN:case KEY_BACK: schedule_deinit(); break;  // 退出日程设置default: break;}
}

日程显示

用于更新月份、日期、小时和分钟,以及日程状态。

/*******************************************************************************
* 函 数 名         : schedule_display
* 函数功能         : 日程显示
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_display(void)  // 日程显示
{lcd1602_write_cmd(LCD1602_DISPLAY_CONTROL);  // 关闭光标和闪烁lcd1602_set_pos(0, 0);lcd1602_write_num(2, schedule.month);lcd1602_set_pos(3, 0);lcd1602_write_num(2, schedule.day);lcd1602_set_pos(6, 0);lcd1602_write_num(2, schedule.hour);lcd1602_set_pos(9, 0);lcd1602_write_num(2, schedule.miunte);lcd1602_set_pos(13, 0);if (schedule.state == SCHEDULE_ON) {lcd1602_write_str(" on");} else {lcd1602_write_str("off");}if (cur_pos == 1) {  // 指定光标位置lcd1602_set_pos(0, 0);} else if (cur_pos == 2) {lcd1602_set_pos(1, 0);} else if (cur_pos == 3) {lcd1602_set_pos(3, 0);} else if (cur_pos == 4) {lcd1602_set_pos(4, 0);} else if (cur_pos == 5) {lcd1602_set_pos(6, 0);} else if (cur_pos == 6) {lcd1602_set_pos(7, 0);} else if (cur_pos == 7) {lcd1602_set_pos(9, 0);} else if (cur_pos == 8) {lcd1602_set_pos(10, 0);} else if (cur_pos == 9) {if (schedule.state == SCHEDULE_ON) {lcd1602_set_pos(14, 0);} else {lcd1602_set_pos(13, 0);}}lcd1602_write_cmd(0x08 |  // 显示光标并闪烁LCD1602_DISPLAY_ENABLE |LCD1602_CURSOR_ENABLE |LCD1602_CURSOR_TWINKLE);
}

附录 - 日程提醒(schedule.h)

#ifndef __SCHEDULE_H__
#define __SCHEDULE_H__#include "include.h"
#include "keyboard.h"#define SCHEDULE_CONTINUE_TIME 30  // 响铃时间,分钟计时,1-60
#define SCHEDULE_CUR_POS_MAX    9  // 游标最大位置typedef enum {  // 日程状态SCHEDULE_OFF = 0,SCHEDULE_ON  = 1,SCHEDULE_BUTT
} schedule_state_t;
typedef struct {  // 日程u8 month;u8 day;u8 hour;u8 miunte;schedule_state_t state;
} schedule_t;void schedule_init(void);    // 日程初始化
void schedule_deinit(void);    // 日程去初始化
u8 schedule_check(u8 now_month, u8 now_day, u8 now_hour, u8 now_miunte);     // 日程检测
void schedule_response_key(key_t key);  // 按键响应
void schedule_display(void);  // 日程显示
void schedule_close(void);  // 关闭日程#endif

附录 - 日程提醒(schedule.c)

#include "schedule.h"
#include "lcd1602.h"
#include "buzzer.h"static schedule_t schedule = { 0, 0, 0, 0, SCHEDULE_OFF };  // 日程配置
static u8 cur_pos = 1;  // 游标位置/*******************************************************************************
* 函 数 名         : schedule_init
* 函数功能         : 日程初始化
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_init(void)    // 日程初始化
{lcd1602_write_cmd(LCD1602_DISPLAY_CONTROL);  // 关闭光标和闪烁lcd1602_clean();lcd1602_set_pos(0, 1);lcd1602_write_str("set schedule:");lcd1602_set_pos(0, 0);lcd1602_write_num(2, schedule.month);lcd1602_write_data('-');lcd1602_write_num(2, schedule.day);lcd1602_set_pos(6, 0);lcd1602_write_num(2, schedule.hour);lcd1602_write_data(':');lcd1602_write_num(2, schedule.miunte);lcd1602_set_pos(13, 0);if (schedule.state == SCHEDULE_ON) {lcd1602_write_str(" on");} else {lcd1602_write_str("off");}lcd1602_set_pos(0, 0);lcd1602_write_cmd(0x08 |  // 显示光标并闪烁LCD1602_DISPLAY_ENABLE |LCD1602_CURSOR_ENABLE |LCD1602_CURSOR_TWINKLE);cur_pos = SCHEDULE_CUR_POS_MAX;
}/*******************************************************************************
* 函 数 名         : schedule_deinit
* 函数功能         : 日程去初始化
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_deinit(void)     // 日程去初始化
{lcd1602_write_cmd(LCD1602_DISPLAY_CONTROL);lcd1602_clean();
}/*******************************************************************************
* 函 数 名         : schedule_check
* 函数功能         : 日程检测
* 输    入         : now_month/now_day/now_hour/now_miunte:当前月/日/时/分
* 输    出         : u8:0没有激活,other已激活
* 说    名         : none
*******************************************************************************/
u8 schedule_check(u8 now_month, u8 now_day, u8 now_hour, u8 now_miunte)     // 日程检测
{static u8 state = 0;if (schedule.state != SCHEDULE_ON) {buzzer_disable_passive();return 0;}if ((state == 0) && (schedule.month == now_month) && (schedule.day == now_day) &&(schedule.hour == now_hour) && (schedule.miunte == now_miunte)) {state = 1;}if (state != 1) {buzzer_disable_passive();return 0;}if (((now_hour * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) >= 0) &&((now_hour * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) <= SCHEDULE_CONTINUE_TIME)) {buzzer_enable_passive();return 1;} else {state = 0;}if ((schedule.hour == 23) && (now_hour == 0)) {if (((24 * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) >= 0) &&((24 * 60 + now_miunte) - (schedule.hour * 60 + schedule.miunte) <= SCHEDULE_CONTINUE_TIME)) {buzzer_enable_passive();return 1;} else {state = 0;}}return 0;
}/*******************************************************************************
* 函 数 名         : schedule_response_key
* 函数功能         : 按键响应
* 输    入         : key:按键值
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_response_key(key_t key)  // 按键响应
{switch (key) {case KEY_0:case KEY_1:case KEY_2:case KEY_3:case KEY_4:case KEY_5:case KEY_6:case KEY_7:case KEY_8:case KEY_9: {if ((cur_pos == 1) && (key <= KEY_1)) {  // 月十位不能超过1schedule.month = 10 * key + schedule.month % 10;} else if (cur_pos == 2) {  // 月个位取值0-9,3-9有限制if (key <= KEY_2) {schedule.month = key + schedule.month / 10 * 10;} else if ((key > KEY_2) && (schedule.month / 10 < 1)) {schedule.month = key + schedule.month / 10 * 10;}} else if ((cur_pos == 3) && (key <= KEY_3)) {  // 天十位不能超过3schedule.day = 10 * key + schedule.day % 10;} else if (cur_pos == 4) {  // 天个位取值0-9,2-9有限制if (key <= KEY_1) {schedule.day = key + schedule.day / 10 * 10;} else if ((key > KEY_1) && (schedule.day / 10 < 3)) {schedule.day = key + schedule.day / 10 * 10;}} else if ((cur_pos == 5) && (key <= KEY_2)) {  // 时十位取值0-2schedule.hour = 10 * key + schedule.hour % 10;} else if (cur_pos == 6) {  // 时个位取值0-9,4-9有限制if (key <= KEY_3) {schedule.hour = key + schedule.hour / 10 * 10;} else if ((key > KEY_3) && (schedule.hour / 10 < 2)) {schedule.hour = key + schedule.hour / 10 * 10;}} else if ((cur_pos == 7) && (key <= KEY_5)) {  // 分十位取值0-5schedule.miunte = 10 * key + schedule.miunte % 10;} else if (cur_pos == 8) {  // 分个位取值0-9schedule.miunte = key + schedule.miunte / 10 * 10;}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_ADD: {  // 加1if ((cur_pos == 1) || (cur_pos == 2)) {if (schedule.month < 12) {schedule.month++;}} else if ((cur_pos == 3) || (cur_pos == 4)) {if (schedule.day < 31) {schedule.day++;}} else if ((cur_pos == 5) || (cur_pos == 6)) {if (schedule.hour < 23) {schedule.hour++;}} else if ((cur_pos == 7) || (cur_pos == 8)) {if (schedule.miunte < 59) {schedule.miunte++;}}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_SUB: {  // 减1if ((cur_pos == 1) || (cur_pos == 2)) {if (schedule.month > 0) {schedule.month--;}} else if ((cur_pos == 3) || (cur_pos == 4)) {if (schedule.day > 0) {schedule.day--;}} else if ((cur_pos == 5) || (cur_pos == 6)) {if (schedule.hour > 0) {schedule.hour--;}} else if ((cur_pos == 7) || (cur_pos == 8)) {if (schedule.miunte > 0) {schedule.miunte--;}}if ((schedule.day > 30) && ((schedule.month == 4) ||  // 各个月份天数修正(schedule.month == 6) ||(schedule.month == 9) ||(schedule.month == 11))) {schedule.day = 30;} else if ((schedule.day > 29) && (schedule.month == 2)) {schedule.day = 29;}break;}case KEY_ENTER: {  // 移动游标cur_pos++; if (cur_pos > SCHEDULE_CUR_POS_MAX) {cur_pos = 1;}break;}case KEY_TRANS: {  // 切换日程状态if (cur_pos == 9) {if (schedule.state == SCHEDULE_OFF) {schedule.state = SCHEDULE_ON;} else {schedule.state = SCHEDULE_OFF;}}break;}case KEY_FUN:case KEY_BACK: schedule_deinit(); break;  // 退出日程设置default: break;}
}/*******************************************************************************
* 函 数 名         : schedule_display
* 函数功能         : 日程显示
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_display(void)  // 日程显示
{lcd1602_write_cmd(LCD1602_DISPLAY_CONTROL);  // 关闭光标和闪烁lcd1602_set_pos(0, 0);lcd1602_write_num(2, schedule.month);lcd1602_set_pos(3, 0);lcd1602_write_num(2, schedule.day);lcd1602_set_pos(6, 0);lcd1602_write_num(2, schedule.hour);lcd1602_set_pos(9, 0);lcd1602_write_num(2, schedule.miunte);lcd1602_set_pos(13, 0);if (schedule.state == SCHEDULE_ON) {lcd1602_write_str(" on");} else {lcd1602_write_str("off");}if (cur_pos == 1) {  // 指定光标位置lcd1602_set_pos(0, 0);} else if (cur_pos == 2) {lcd1602_set_pos(1, 0);} else if (cur_pos == 3) {lcd1602_set_pos(3, 0);} else if (cur_pos == 4) {lcd1602_set_pos(4, 0);} else if (cur_pos == 5) {lcd1602_set_pos(6, 0);} else if (cur_pos == 6) {lcd1602_set_pos(7, 0);} else if (cur_pos == 7) {lcd1602_set_pos(9, 0);} else if (cur_pos == 8) {lcd1602_set_pos(10, 0);} else if (cur_pos == 9) {if (schedule.state == SCHEDULE_ON) {lcd1602_set_pos(14, 0);} else {lcd1602_set_pos(13, 0);}}lcd1602_write_cmd(0x08 |  // 显示光标并闪烁LCD1602_DISPLAY_ENABLE |LCD1602_CURSOR_ENABLE |LCD1602_CURSOR_TWINKLE);
}/*******************************************************************************
* 函 数 名         : schedule_close
* 函数功能         : 关闭日程
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void schedule_close(void)  // 关闭日程
{schedule.state = SCHEDULE_OFF;
}

如何在51单片机实现日程提醒(生日闹钟)相关推荐

  1. 如何在51单片机实现电子万年历

    如何在51单片机实现电子万年历 51单片机制作万年历的基本功能部分,软件特性可以在proteus上仿真,使用51单片机定时器T0做万年历计时信号源,电子万年历计时系统在timer模块,本模块主要是将年 ...

  2. 如何在51单片机实现闹钟功能

    如何在51单片机实现闹钟功能 51单片机制作万年历过程中的闹钟部分,主要说明设计算法,软件特性可以在proteus上仿真.闹钟是人机交互的一部分,因此闹钟的实现与具体的人机交互方式息息相关,本系统采用 ...

  3. 基于51单片机的可调时钟闹钟全套设计资料

    编号:0003 仿真软件:Proteus8.9程序编译软件:keil5编写语言:C语言 功能介绍 时钟设置显示功能 1.这个仿真提供年份日期星期24小时格式时间显示,初始化后可以设置时间,选择模式一后 ...

  4. 基于51单片机实现时间显示及闹钟设置

    文章目录 一.介绍 二.原理 三.步骤 四.结果 五.结果分析 六.总结 一.介绍 本次为大学中的一次创新实验,当时老师叫我自己拿个单片机去玩,为了赶时间就做了个简单的时间显示和闹钟设置,因为比较简单 ...

  5. 基于51单片机的万年历(包含闹钟,秒表)实现

    开头唠一唠: 趁着寒假的时间,也趁着课程设计正好是做一个万年历.就打算好好从头到尾来一遍.涨涨知识.首先说的是本人也是小白一颗,大神们能帮忙指正错误的话,不胜感激.写博客只是为了总结经验,要是帮到一部 ...

  6. 51单片机 时钟显示、设置闹钟功能的实现 (附详细算法思路、proteus电路图)

    功能要求: 1.利用定时器中断实现时钟功能,格式:时-分-秒. 2.实现时钟显示和闹钟设置两个功能的切换. 3.闹钟设置,且限定字符格式(如时针不得超过24等). 4.时钟到达预设值时,闹铃正常响起, ...

  7. 基于51单片机的数字电子钟万年历闰年判断闹钟设计

    基于51单片机的数字电子钟万年历闰年判断闹钟设计 视频 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 8 资料清单下载链 ...

  8. 使用51单片机自制电子万年历(包含驱动、基本万年历、闹钟、日程、修改时间等)

    使用51单片机自制电子万年历(包含驱动.基本万年历.闹钟.日程.修改时间等) 归档51单片机制作电子万年历,以及proteus仿真电路图,本设计涵盖蜂鸣器.uart.timer.矩阵扫描.lcd160 ...

  9. 基于51单片机和红外漫反射传感器的久坐提醒神器(番茄钟)的设计

    一.背景介绍 我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题. 我刚开 ...

  10. 45、基于51单片机智能台灯红外坐姿定时提醒人体检测光照系统设计

    摘要 社会在不断进步,人类在不断追求,市场在不断变化,高科技应用含量决定着产品发展的新趋势和前景,智能化技术在电子产品领域的应用意义深远.随着电子产品的快速发展,家用电器也越来越偏向智能化,已经应用于 ...

最新文章

  1. SpringBoot上传文件大小限制
  2. Object-C代码练习【自定义对象的归档】
  3. linux内核网络协议栈--linux bridge(十九)
  4. 禁止用户复制网页的内容
  5. CSP认证201412-2 Z字形扫描[C++题解]:模拟
  6. 图解+笔记-python语言-第5章:数字/5.3 内置数字工具/5.3.2 内置数学函数
  7. java inputstream字节流_Java输入输出流ByteArrayInputStream和ByteArrayOutPutStream
  8. 如何向K8s,Docker-Compose注入镜像Tag
  9. Linq在路上(序)
  10. 一般服务器显示闪存多少合适,现在服务器一般内存多大合适
  11. Angular JS(二) 指令部分
  12. android --多线程下载
  13. scm 软件配置管理
  14. 网络时代课堂教学模式整合的探索
  15. 用java做一个简易的五子棋
  16. 边缘检测——Roberts算子
  17. 一种pluntUML实时渲染图片的方法
  18. 标题中冒号的用法_如果论文题目中出现冒号,冒号前后两部分内容通常是?
  19. 在Debian中网卡的设置
  20. 事件查看器mysql_Windows 事件查看器(Event Viewer) 检查日志的方法

热门文章

  1. 东方财富股吧评论爬虫和情绪分析
  2. StrokeIt:让鼠标手势无处不在
  3. cdn/github_cdn加速配置
  4. 文明与征服李世民最强阵容推荐
  5. 华滋先生:互联网创业,加入社群是有用的吗?
  6. vue 动态插入子路由
  7. 心形一行python_《心》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  8. Logstash 中type 和 tags
  9. linux的htb队列,Linux流量控制中的HTB队列创建与过滤(2)
  10. MTK FAQ最新资料,MTK_on_line_FAQ_SW_ALPS_Framework+-+Battery