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

归档51单片机制作电子万年历,以及proteus仿真电路图,本设计涵盖蜂鸣器、uart、timer、矩阵扫描、lcd1602显示、基本万年历(年/月/日/时/分/秒)、闹钟、日程、修改时间和小游戏等各项功能,基本上覆盖使用了51单片机内部所有资源。

仿真结果展示

基本万年历运行结果:

设定闹钟运行结果:

设定日程运行结果:

修改时间运行结果:

小游戏运行结果:

仿真电路图

仿真平台使用proteus7.10。

代码目录结构

|—source # 电子万年历源码
|—|---include.h # 公共定义
|—|---main.c # 主函数
|—|---main.h
|—±–base # 基本万年历
|—|-------clock.c
|—|-------clock.h
|—±–drv # 电子万年历驱动
|—|---±–buzzer # 蜂鸣器
|—|---|-------buzzer.c
|—|---|-------buzzer.h
|—|---±–keyboard # 矩阵键盘
|—|---|-------keyboard.c
|—|---|-------keyboard.h
|—|---±–lcd1602 # lcd1602
|—|---|-------lcd1602.c
|—|---|-------lcd1602.h
|—|---±–timer # 定时器
|—|---|-------timer.c
|—|---|-------timer.h
|—|---|—uart # 串口
|—|-----------uart.c
|—|-----------uart.h
|—|---ext # 电子万年历扩展功能
|-------±–alarm
|-------|-------alarm.c # 闹钟
|-------|-------alarm.h
|-------|-------schedule.c # 日程
|-------|-------schedule.h
|-------±–game # 小游戏
|-------|-------catch_rabbit.c
|-------|-------catch_rabbit.h
|-------|—set # 修改时间
|---------------change_time.c
|---------------change_time.h

51单片机 - 电子万年历(项目 + 仿真)

包含工程和仿真电路,工程结构清晰。
下载链接://download.csdn.net/download/weixin_44413515/12178845

51单片机 - 电子万年历(全部代码)

所有代码放到了同一文件,有少量增删,功能一致,代码结构不清晰。
下载链接://download.csdn.net/download/weixin_44413515/12178806

51单片机 - 电子万年历(proteus仿真电路)

下载链接://download.csdn.net/download/weixin_44413515/12178811

电子万年历子模块软件介绍

访问链接:

  • 矩阵键盘:https://blog.csdn.net/weixin_44413515/article/details/105153093
  • uart驱动:https://blog.csdn.net/weixin_44413515/article/details/105153103
  • lcd1602驱动:https://blog.csdn.net/weixin_44413515/article/details/105153125
  • timer:https://blog.csdn.net/weixin_44413515/article/details/105153140
  • 蜂鸣器驱动:https://blog.csdn.net/weixin_44413515/article/details/105152961
  • 基本功能:https://blog.csdn.net/weixin_44413515/article/details/105152885
  • 闹钟:https://blog.csdn.net/weixin_44413515/article/details/105152872
  • 日程提醒:https://blog.csdn.net/weixin_44413515/article/details/105152842
  • 修改时间:https://blog.csdn.net/weixin_44413515/article/details/105152829

电子万年历功能枚举

罗列万年历各项功能,如:基本万年历(FUN_CLOCK ),闹钟(FUN_ALARM),日程(FUN_SCHEDULE),修改时间(FUN_CHANGE_TIME)和小游戏(FUN_CATCH_RABBIT)。抽象数据类型fun_t。

typedef enum {  // 功能判断FUN_CLOCK = 0,FUN_ALARM,FUN_SCHEDULE,FUN_CHANGE_TIME,FUN_CATCH_RABBIT,FUN_BUTT
} fun_t;

功能切换

功能切换通过按键KEY_FUN完成,检测到KEY_FUN按键按下,切换到下一工作模式。

/*******************************************************************************
* 函 数 名         : response_key
* 函数功能         : 按键响应
* 输    入         : key:按键值
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void 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:case KEY_ADD:case KEY_SUB:case KEY_ENTER:case KEY_TRANS: break;case KEY_FUN: {  // 加1fun++;fun_change = 1;if (fun >= FUN_BUTT) {fun = FUN_CLOCK;}break;}case KEY_BACK: {fun_change = 1;fun = FUN_CLOCK;break;}default: break;}
}

功能选择

通过当前fun值,抉择出当前选择执行的功能,并进行执行和显示。首次调用某功能都会进行一次初始化,在退出某功能时,可能调用去初始化接口完成退出的清理工作。

/*******************************************************************************
* 函 数 名         : fun_select
* 函数功能         : 功能选择
* 输    入         : fun:功能号
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void fun_select(fun_t fun)  // 功能选择
{switch (fun) {case FUN_CLOCK: {if (fun_change) {fun_change = 0;timer_set_update_level(1);clock_init();}clock_display_update();break;}case FUN_ALARM: {if (fun_change) {fun_change = 0;alarm_init();}alarm_response_key(key);alarm_display();break;}case FUN_SCHEDULE: {if (fun_change) {fun_change = 0;schedule_init();}schedule_response_key(key);schedule_display();break;}case FUN_CHANGE_TIME: {if (fun_change) {fun_change = 0;change_time_init();}change_time_response_key(key);change_time_display();break;}case FUN_CATCH_RABBIT: {if (fun_change) {fun_change = 0;catch_rabbit_init();}catch_rabbit_response_key(key);break;}default: break;}
}

主函数

负责初始化各个硬件模块,初始化51单片机内部系统,而后循环扫描矩阵键盘并将按键值映射到按键功能,做闹钟、日程提醒的检测,完成功能的切换。

/*
################################################################万年历################################################################
*/
void main(void)
{u8 state = 0;buzzer_enable_passive();lcd1602_init();timer_init();uart_init();while (1) {key = keyboard_map_to_key(keyboard_scan());fun_select(fun);state = alarm_check(time.hour, time.miunte);if (state && (key == KEY_TRANS) && (fun != FUN_ALARM) && (fun != FUN_SCHEDULE)) {alarm_close();}state = schedule_check(time.month, time.day, time.hour, time.miunte);if (state && (key == KEY_TRANS) && (fun != FUN_ALARM) && (fun != FUN_SCHEDULE)) {schedule_close();}response_key(key);#if 0uart_send_time();
#endif}
}

附录 - 电子万年历(main.h)

#ifndef __MAIN_H__
#define __MAIN_H__#include "include.h"
#include "keyboard.h"typedef enum {  // 功能判断FUN_CLOCK = 0,FUN_ALARM,FUN_SCHEDULE,FUN_CHANGE_TIME,FUN_CATCH_RABBIT,FUN_BUTT
} fun_t;void response_key(key_t key);  // 按键响应
void fun_select(fun_t fun);  // 功能选择#endif

附录 - 电子万年历(main.c)

/* 晶振fosc = 12MHZ */
#include "main.h"
#include "lcd1602.h"
#include "keyboard.h"
#include "timer.h"
#include "buzzer.h"
#include "uart.h"
#include "clock.h"
#include "alarm.h"
#include "schedule.h"
#include "change_time.h"
#include "catch_rabbit.h"key_t key = KEY_BUTT;  // 按键值
fun_t fun = FUN_CLOCK;  // 功能判断
u8 fun_change = 1;  // 功能改变,0无效,other有效/*
################################################################万年历################################################################
*/
void main(void)
{u8 state = 0;buzzer_enable_passive();lcd1602_init();timer_init();uart_init();while (1) {key = keyboard_map_to_key(keyboard_scan());fun_select(fun);state = alarm_check(time.hour, time.miunte);if (state && (key == KEY_TRANS) && (fun != FUN_ALARM) && (fun != FUN_SCHEDULE)) {alarm_close();}state = schedule_check(time.month, time.day, time.hour, time.miunte);if (state && (key == KEY_TRANS) && (fun != FUN_ALARM) && (fun != FUN_SCHEDULE)) {schedule_close();}response_key(key);
#if 0uart_send_time();
#endif}
}/*******************************************************************************
* 函 数 名         : response_key
* 函数功能         : 按键响应
* 输    入         : key:按键值
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void 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:case KEY_ADD:case KEY_SUB:case KEY_ENTER:case KEY_TRANS: break;case KEY_FUN: {  // 加1fun++;fun_change = 1;if (fun >= FUN_BUTT) {fun = FUN_CLOCK;}break;}case KEY_BACK: {fun_change = 1;fun = FUN_CLOCK;break;}default: break;}
}/*******************************************************************************
* 函 数 名         : fun_select
* 函数功能         : 功能选择
* 输    入         : fun:功能号
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void fun_select(fun_t fun)  // 功能选择
{switch (fun) {case FUN_CLOCK: {if (fun_change) {fun_change = 0;timer_set_update_level(1);clock_init();}clock_display_update();break;}case FUN_ALARM: {if (fun_change) {fun_change = 0;alarm_init();}alarm_response_key(key);alarm_display();break;}case FUN_SCHEDULE: {if (fun_change) {fun_change = 0;schedule_init();}schedule_response_key(key);schedule_display();break;}case FUN_CHANGE_TIME: {if (fun_change) {fun_change = 0;change_time_init();}change_time_response_key(key);change_time_display();break;}case FUN_CATCH_RABBIT: {if (fun_change) {fun_change = 0;catch_rabbit_init();}catch_rabbit_response_key(key);break;}default: break;}
}

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

  1. 基于51单片机的电子万年历设计

    基于51单片机的电子万年历 1)LCD1602显示时间.日期.星期.温度 2)按键可调整时间日期星期 3)整点报时 4)DS1302时钟芯片 5)DS18B20温度传感器 6)闹钟功能 7)判断闰年 ...

  2. 万年历设计单片机c语言,基于51单片机的电子万年历的设计

    基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...

  3. 基于51单片机的电子万年历的设计

    (24条消息) 基于51单片机的电子万年历的设计说明书(完整word版本说明书+原理图+代码)资源-CSDN文库 摘 要 电子万年历是单片机系统的一个应用,由硬件和软件相配合使用.硬件由主控器.时钟电 ...

  4. 基于51单片机的电子万年历的设计-源代码

    电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...

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

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

  6. 【002】基于51单片机的电子万年历proteus仿真设计

    一.资料内容(私信获取) (1).基于51单片机的电子万年历proteus仿真设计一份: (2).基于51单片机的电子万年历proteus仿真设计keli源代码一份: (3).基于51单片机的电子万年 ...

  7. 【制作】基于金沙滩51单片机的电子密码锁程序

    基于金沙滩51单片机的电子密码锁程序 很久之前做的一个课设,在B站发了效果视频,发现忘记分享代码了,现在整理分享一下. 零.设计报告 1.设计要求 这部分是讲的整个系统实现了什么功能. 1.1.密码的 ...

  8. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  9. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

最新文章

  1. python中打开文件提示编码当时错误_Python:文件编码错误
  2. YbtOJ-相似子串【SA,RMQ,二分】
  3. Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML
  4. android平台的计时功能,Android实现简单计时器功能
  5. (17)python_字典
  6. 苹果开场铃声 android,推荐几款免费安卓、苹果手机铃声剪辑软件?
  7. SOTA级发丝抠图模型PP-Matting开源,支持多场景精细化分割
  8. 【大话设计模式】模式二 :工厂模式
  9. 拆机专用磁力桌垫:保证一颗螺丝也不漏网
  10. vue使用Echarts绘制自己股票K线图,包含数据接口
  11. Windows Server 2008搭建FTP服务
  12. vue 使用箭头函数会报错
  13. AliCloud Duplicity
  14. Lingo 语言程序设计基础
  15. ccks2020中文短文本实体链接任务测评论文--小米团队--第一名
  16. Linux配置文档 Samba
  17. 如何设置软件开机自启
  18. 类的设计和实现II---销售数据统计
  19. 来说说Mac活动监控器打不开/耗电快/发热严重等问题的解决过程
  20. saltstack 问题记录

热门文章

  1. 论文解读:Improving Machine Reading Comprehension with Contextualized Commonsense Knowledge
  2. datax 模板_datax实战
  3. apache hawq
  4. [计算机网络]应用层协议,HTTP,SMTP,DNS
  5. 烽火运维-20180830day
  6. MFC 托盘 vs2017 tray
  7. android 屏幕触摸事件及处理机制解读
  8. layui时间控件 laydate 重置失效
  9. PPT中这8个隐藏技巧-掌握了马上让你幸福感满满
  10. 【POJ - 3669】Meteor Shower(bfs)