如何在51单片机实现日程提醒(生日闹钟)
如何在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单片机实现日程提醒(生日闹钟)相关推荐
- 如何在51单片机实现电子万年历
如何在51单片机实现电子万年历 51单片机制作万年历的基本功能部分,软件特性可以在proteus上仿真,使用51单片机定时器T0做万年历计时信号源,电子万年历计时系统在timer模块,本模块主要是将年 ...
- 如何在51单片机实现闹钟功能
如何在51单片机实现闹钟功能 51单片机制作万年历过程中的闹钟部分,主要说明设计算法,软件特性可以在proteus上仿真.闹钟是人机交互的一部分,因此闹钟的实现与具体的人机交互方式息息相关,本系统采用 ...
- 基于51单片机的可调时钟闹钟全套设计资料
编号:0003 仿真软件:Proteus8.9程序编译软件:keil5编写语言:C语言 功能介绍 时钟设置显示功能 1.这个仿真提供年份日期星期24小时格式时间显示,初始化后可以设置时间,选择模式一后 ...
- 基于51单片机实现时间显示及闹钟设置
文章目录 一.介绍 二.原理 三.步骤 四.结果 五.结果分析 六.总结 一.介绍 本次为大学中的一次创新实验,当时老师叫我自己拿个单片机去玩,为了赶时间就做了个简单的时间显示和闹钟设置,因为比较简单 ...
- 基于51单片机的万年历(包含闹钟,秒表)实现
开头唠一唠: 趁着寒假的时间,也趁着课程设计正好是做一个万年历.就打算好好从头到尾来一遍.涨涨知识.首先说的是本人也是小白一颗,大神们能帮忙指正错误的话,不胜感激.写博客只是为了总结经验,要是帮到一部 ...
- 51单片机 时钟显示、设置闹钟功能的实现 (附详细算法思路、proteus电路图)
功能要求: 1.利用定时器中断实现时钟功能,格式:时-分-秒. 2.实现时钟显示和闹钟设置两个功能的切换. 3.闹钟设置,且限定字符格式(如时针不得超过24等). 4.时钟到达预设值时,闹铃正常响起, ...
- 基于51单片机的数字电子钟万年历闰年判断闹钟设计
基于51单片机的数字电子钟万年历闰年判断闹钟设计 视频 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 8 资料清单下载链 ...
- 使用51单片机自制电子万年历(包含驱动、基本万年历、闹钟、日程、修改时间等)
使用51单片机自制电子万年历(包含驱动.基本万年历.闹钟.日程.修改时间等) 归档51单片机制作电子万年历,以及proteus仿真电路图,本设计涵盖蜂鸣器.uart.timer.矩阵扫描.lcd160 ...
- 基于51单片机和红外漫反射传感器的久坐提醒神器(番茄钟)的设计
一.背景介绍 我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题. 我刚开 ...
- 45、基于51单片机智能台灯红外坐姿定时提醒人体检测光照系统设计
摘要 社会在不断进步,人类在不断追求,市场在不断变化,高科技应用含量决定着产品发展的新趋势和前景,智能化技术在电子产品领域的应用意义深远.随着电子产品的快速发展,家用电器也越来越偏向智能化,已经应用于 ...
最新文章
- SpringBoot上传文件大小限制
- Object-C代码练习【自定义对象的归档】
- linux内核网络协议栈--linux bridge(十九)
- 禁止用户复制网页的内容
- CSP认证201412-2	Z字形扫描[C++题解]:模拟
- 图解+笔记-python语言-第5章:数字/5.3 内置数字工具/5.3.2 内置数学函数
- java inputstream字节流_Java输入输出流ByteArrayInputStream和ByteArrayOutPutStream
- 如何向K8s,Docker-Compose注入镜像Tag
- Linq在路上(序)
- 一般服务器显示闪存多少合适,现在服务器一般内存多大合适
- Angular JS(二) 指令部分
- android --多线程下载
- scm 软件配置管理
- 网络时代课堂教学模式整合的探索
- 用java做一个简易的五子棋
- 边缘检测——Roberts算子
- 一种pluntUML实时渲染图片的方法
- 标题中冒号的用法_如果论文题目中出现冒号,冒号前后两部分内容通常是?
- 在Debian中网卡的设置
- 事件查看器mysql_Windows 事件查看器(Event Viewer) 检查日志的方法
热门文章
- 东方财富股吧评论爬虫和情绪分析
- StrokeIt:让鼠标手势无处不在
- cdn/github_cdn加速配置
- 文明与征服李世民最强阵容推荐
- 华滋先生:互联网创业,加入社群是有用的吗?
- vue 动态插入子路由
- 心形一行python_《心》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
- Logstash 中type 和 tags
- linux的htb队列,Linux流量控制中的HTB队列创建与过滤(2)
- MTK FAQ最新资料,MTK_on_line_FAQ_SW_ALPS_Framework+-+Battery