【Proteus仿真】【Arduino单片机】多功能数字时钟设计
文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、DS1302温度传感器、DS1302时钟、按键、蜂鸣器等。
主要功能:
系统运行后,LCD1602显示当前日期时间和温度值,当按下K3键进入日期和时间设置模式,
每按下K3键1次,则切换不同位置,通过K1和K2键调整数据;按下K4键可保存并返回主界面。
当按下K4键,进入闹钟设置模式,可通过K4键切换不同位置,通过K1和K2键调整数据;按下
K3键可保存并返回主界面。当时间到达闹钟时间,开启闹铃,可按下K1键取消闹铃。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)*///系统数据获取
void sys_data_get(void)
{while(1){//获取温度sys_ctrl.temp=ds18b20_read_temperture()*10;//获取时间ds1302_read_time();break;}
}//系统数据显示
void sys_data_show(void)
{u8 buf[5];while(1){//正常模式显示if(sys_ctrl.mode==0){//未进入闹钟设置模式if(sys_ctrl.alarm_mode==0){//日期时间显示lcd1602_show_nums(2,0,gDS1302_TIME[6],2,0x80);//年lcd1602_show_nums(5,0,gDS1302_TIME[4],2,0x80);//月lcd1602_show_nums(8,0,gDS1302_TIME[3],2,0x80);//日lcd1602_show_nums(15,0,gDS1302_TIME[5],1,0x80);//星期lcd1602_show_nums(0,1,gDS1302_TIME[2],2,0x80);//时lcd1602_show_nums(3,1,gDS1302_TIME[1],2,0x80);//分lcd1602_show_nums(6,1,gDS1302_TIME[0],2,0x80);//秒//温度显示if(sys_ctrl.temp<9999){buf[0]=sys_ctrl.temp/100+0x30;buf[1]=sys_ctrl.temp%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp%100%10+0x30;buf[4]='\0';lcd1602_show_string(11,1,buf);}}//闹钟设置显示else{//闹钟时间显示lcd1602_show_nums(6,0,sys_ctrl.alarm_time[0],2,0x80);//时lcd1602_show_nums(9,0,sys_ctrl.alarm_time[1],2,0x80);//分//闹钟开关状态显示if(sys_ctrl.alarm_onoff==0)lcd1602_show_string(4,1,"OFF");else lcd1602_show_string(4,1," ON");//对应位置闪烁switch(sys_ctrl.alarm_mode){case 1:lcd1602_show_string(6,0," ");delay(50);lcd1602_show_nums(6,0,sys_ctrl.alarm_time[0],2,0x80);//时break;case 2:lcd1602_show_string(9,0," ");delay(50);lcd1602_show_nums(9,0,sys_ctrl.alarm_time[1],2,0x80);//分break;case 3:lcd1602_show_string(4,1," ");delay(50);//闹钟开关状态显示if(sys_ctrl.alarm_onoff==0)lcd1602_show_string(4,1,"OFF");else lcd1602_show_string(4,1," ON");break;}}}//设置模式显示else {//设置时间显示lcd1602_show_nums(2,0,sys_ctrl.set_time[6],2,0x80);//年lcd1602_show_nums(5,0,sys_ctrl.set_time[4],2,0x80);//月lcd1602_show_nums(8,0,sys_ctrl.set_time[3],2,0x80);//日lcd1602_show_nums(15,0,sys_ctrl.set_time[5],1,0x80);//星期lcd1602_show_nums(0,1,sys_ctrl.set_time[2],2,0x80);//时lcd1602_show_nums(3,1,sys_ctrl.set_time[1],2,0x80);//分lcd1602_show_nums(6,1,sys_ctrl.set_time[0],2,0x80);//秒//对应位置闪烁switch(sys_ctrl.mode){case 1:lcd1602_show_string(2,0," ");delay(50);lcd1602_show_nums(2,0,sys_ctrl.set_time[6],2,0x80);//年break;case 2:lcd1602_show_string(5,0," ");delay(50);lcd1602_show_nums(5,0,sys_ctrl.set_time[4],2,0x80);//月break;case 3:lcd1602_show_string(8,0," ");delay(50);lcd1602_show_nums(8,0,sys_ctrl.set_time[3],2,0x80);//日break;case 4:lcd1602_show_string(15,0," ");delay(50);lcd1602_show_nums(15,0,sys_ctrl.set_time[5],1,0x80);//星期break;case 5:lcd1602_show_string(0,1," ");delay(50);lcd1602_show_nums(0,1,sys_ctrl.set_time[2],2,0x80);//时break;case 6:lcd1602_show_string(3,1," ");delay(50);lcd1602_show_nums(3,1,sys_ctrl.set_time[1],2,0x80);//分break;case 7:lcd1602_show_string(6,1," ");delay(50);lcd1602_show_nums(6,1,sys_ctrl.set_time[0],2,0x80);//秒break;}}break;}
}//系统数据设置
void sys_data_set(void)
{u8 key=0;static u8 oneflag=0;static u8 nzoneflag=0;u8 i=0;key=key_scan(0);if(key!=0)beep_alarm(100,1000);//提示音//设置if(key==KEY3_PRESS){//未进入闹钟设置if(sys_ctrl.alarm_mode==0){sys_ctrl.mode++;if(sys_ctrl.mode>7)sys_ctrl.mode=1;if(oneflag==0){oneflag=1;//获取当前时间记录for(i=0;i<7;i++)sys_ctrl.set_time[i]=gDS1302_TIME[i];_sys_parm_set_show();//系统参数设置界面显示 }} //进入闹钟设置else{sys_ctrl.alarm_mode=0;nzoneflag=0;sys_open_show();//系统开机界面显示}}//加else if(key==KEY1_PRESS){//时间修改if(sys_ctrl.mode!=0){switch(sys_ctrl.mode){case 1://年sys_ctrl.set_time[6]++;if(sys_ctrl.set_time[6]>99)sys_ctrl.set_time[6]=0;break;case 2://月sys_ctrl.set_time[4]++;if(sys_ctrl.set_time[4]>12)sys_ctrl.set_time[4]=1;break;case 3://日sys_ctrl.set_time[3]++;if(sys_ctrl.set_time[3]>31)sys_ctrl.set_time[3]=1;break;case 4://星期sys_ctrl.set_time[5]++;if(sys_ctrl.set_time[5]>7)sys_ctrl.set_time[5]=1;break;case 5://时sys_ctrl.set_time[2]++;if(sys_ctrl.set_time[2]>23)sys_ctrl.set_time[2]=0;break;case 6://分sys_ctrl.set_time[1]++;if(sys_ctrl.set_time[1]>59)sys_ctrl.set_time[1]=0;break;case 7://秒sys_ctrl.set_time[0]++;if(sys_ctrl.set_time[0]>59)sys_ctrl.set_time[0]=0;break;}}//闹钟设置if(sys_ctrl.alarm_mode!=0){switch(sys_ctrl.alarm_mode){case 1:sys_ctrl.alarm_time[0]++;if(sys_ctrl.alarm_time[0]>23)sys_ctrl.alarm_time[0]=0;break;case 2:sys_ctrl.alarm_time[1]++;if(sys_ctrl.alarm_time[1]>59)sys_ctrl.alarm_time[1]=0;break;case 3:sys_ctrl.alarm_onoff=!sys_ctrl.alarm_onoff;break;}}//已闹铃,取消if(sys_ctrl.naoling==1)sys_ctrl.naoling=0;}//减else if(key==KEY2_PRESS){//时间修改if(sys_ctrl.mode!=0){switch(sys_ctrl.mode){case 1://年sys_ctrl.set_time[6]--;if(sys_ctrl.set_time[6]<0)sys_ctrl.set_time[6]=99;break;case 2://月sys_ctrl.set_time[4]--;if(sys_ctrl.set_time[4]<0)sys_ctrl.set_time[4]=12;break;case 3://日sys_ctrl.set_time[3]--;if(sys_ctrl.set_time[3]<0)sys_ctrl.set_time[3]=31;break;case 4://星期sys_ctrl.set_time[5]--;if(sys_ctrl.set_time[5]<0)sys_ctrl.set_time[5]=7;break;case 5://时sys_ctrl.set_time[2]--;if(sys_ctrl.set_time[2]<0)sys_ctrl.set_time[2]=23;break;case 6://分sys_ctrl.set_time[1]--;if(sys_ctrl.set_time[1]<0)sys_ctrl.set_time[1]=59;break;case 7://秒sys_ctrl.set_time[0]--;if(sys_ctrl.set_time[0]<0)sys_ctrl.set_time[0]=59;break;}}//闹钟设置if(sys_ctrl.alarm_mode!=0){switch(sys_ctrl.alarm_mode){case 1:sys_ctrl.alarm_time[0]--;if(sys_ctrl.alarm_time[0]<0)sys_ctrl.alarm_time[0]=23;break;case 2:sys_ctrl.alarm_time[1]--;if(sys_ctrl.alarm_time[1]<0)sys_ctrl.alarm_time[1]=59;break;case 3:sys_ctrl.alarm_onoff=!sys_ctrl.alarm_onoff;break;}}}//确定else if(key==KEY4_PRESS){//时间修改if(sys_ctrl.mode!=0){sys_ctrl.mode=0;oneflag=0;ds1302_set_time(sys_ctrl.set_time[6],sys_ctrl.set_time[4],sys_ctrl.set_time[3],sys_ctrl.set_time[2],sys_ctrl.set_time[1],sys_ctrl.set_time[0]);sys_open_show();//系统开机界面显示}//闹钟设置else{sys_ctrl.alarm_mode++;if(sys_ctrl.alarm_mode>3)sys_ctrl.alarm_mode=1;if(nzoneflag==0){nzoneflag=1;_sys_alarm_set_show();//闹钟设置界面显示}}}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619



联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
相关文章:
【Proteus仿真】【Arduino单片机】多功能数字时钟设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、DS1302温度传感器、DS1302时钟、按键、蜂鸣器等。 主要功能: 系统运行后,LCD1602显示当前日期…...
c语言回文数
以下是用C语言编写的回文数代码: #include <stdio.h>int main() { int num, reversedNum 0, remainder, originalNum; printf("请输入一个正整数:"); scanf("%d", &num); originalNum num; while (num …...
【学习记录】从0开始的Linux学习之旅——编译linux内核
一、学习背景 从接触嵌入式至今,除了安装过双系统接触了一丢丢linux外,linux在我眼中向来是个传说。而如今得到了一块树莓派,于是决心把linux搞起来。 二、概念学习 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应…...
uni-app - 日期 · 时间选择器
目录 1.基本介绍 2.案例介绍 ①注意事项: ②效果展示 3.代码展示 ①view部分 ②js部分 ③css样式 1.基本介绍 从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器&a…...
使用USB转JTAG芯片CH347在Vivado下调试
简介 高速USB转接芯片CH347是一款集成480Mbps高速USB接口、JTAG接口、SPI接口、I2C接口、异步UART串口、GPIO接口等多种硬件接口的转换芯片。 通过XVC协议,将CH347应用于Vivado下,简单尝试可以成功,源码如下,希望可以一起共建&a…...
硬技能之上的软技巧(三)
在硬技能的基础上,如何运用软技巧来进一步提升个人能力和职业发展。在之前的讨论中,我们提到了硬技能和软技巧的基本概念,以及如何运用软技巧来提升个人能力和职业发展。本篇文章将进一步探讨软技巧中的一些重要方面,包括自我管理…...
mysql 查询
-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…...
2311rust过程宏的示例
原文 Rust2018中的过程宏 在Rust2018版本中,我最喜欢的功能是过程宏.在Rust中,过程宏有着悠久而传奇的历史(并继续拥有传奇的未来!) 因为2018年版极大改善了定义和使用它们的体验. 什么是过程宏 过程宏是,在编译时用一段语法,生成新语法的函数.Rust2018中的过程宏有三个风格…...
数据分析:数据预处理流程及方法
数据预处理是数据分析过程中至关重要的一步,它涉及到清洗、转换和整理原始数据,以便更好地适应分析模型或算法。以下是一些常见的数据预处理方法和规则: 数据清洗: 处理缺失值:检测并处理数据中的缺失值,可…...
uniapp 防抖节流封装和使用
防抖(debounce):定义一个时间,延迟n秒执行,n秒内再次调用,会重新计时,计时结束后才会再次执行 主要运用场景: 输入框实时搜索:在用户输入内容的过程中,使用防抖可以减少频繁的查询…...
springcloud alibaba学习视频
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台...
【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表,记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…...
QtC++与QColumnView详解
介绍 在 Qt 中,QColumnView 是用于显示多列数据的控件,它提供了一种多列列表视图的方式,类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的,通常与 QFileSystemModel 或自定义模型一起使用。 以下是关于 QC…...
微信小程序配置企业微信的在线客服
配置企业微信后台 代码实现 <button tap"openCustomerServiceChat">打开企业微信客服</button>methods: {openCustomerServiceChat(){wx.openCustomerServiceChat({extInfo: {url: 你刚才的客服地址},corpId: 企业微信的id,showMessageCard: true,});} …...
深入理解Java AQS:从原理到源码分析
目录 AQS的设计原理1、队列节点 Node 和 FIFO队列结构2、state 的作用3、公平锁与非公平锁 AQS 源码解析1、Node节点2、acquire(int)3、release(int)4、自旋(Spin)5、公平性与 FIFO 基于AQS实现的几种同步器1、ReentrantLock:可重入独占锁2、…...
【数据结构(四)】栈(1)
文章目录 1. 关于栈的一个实际应用2. 栈的介绍3. 栈的应用场景4. 栈的简单应用4.1. 思路分析4.2. 代码实现 5. 栈的进阶应用(实现综合计算器)5.1. 栈实现一位数计算(中缀表达式)5.1.1. 思路分析5.1.2. 代码实现 5.2. 栈实现多位数计算(中缀表达式)5.2.1. 解决思路5.2.2. 代码实…...
实验(四):指令部件实验
一、实验内容与目的 实验要求: 利用CP226实验仪上的小键盘将程序输入主存储器EM,通过指令的执行实现微程序控制器的程序控制。 实验目的: 1.掌握模型机的操作码测试过程; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…...
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址 了解Preference必要信息步骤:1. 在设置页面的xml文件中增加一个Preference ,这是要显示出来的设置项2. 在strings.xml文件中增加我们在第一步新设置的值3. 为新加的设置项增加一个新的XXXPref…...
在Oracle 11g 数据库上设置透明数据加密(TDE)
本文回答2个问题: 11g下简明的TDE设置过程由于11g不支持在线TDE,介绍2中11g下的加密表空间的迁移方法 设置表空间TDE之前 表空间没有加密时,很容易探测到明文数据: create tablespace unsectbs datafile unsectbs.dbf size 10…...
互动直播 之 视频帧原始数据管理
目录 一、视频帧管理 1、存储图片数据的数据结构 1.1)、图片数据首地址...
Go QML高级特性:动态QML加载与运行时组件创建
Go QML高级特性:动态QML加载与运行时组件创建 【免费下载链接】qml QML support for the Go language 项目地址: https://gitcode.com/gh_mirrors/qm/qml QML作为Go语言的UI开发框架,提供了丰富的界面设计能力。本文将深入探讨Go QML中两个强大的…...
从‘听不清’到‘看得明’:采样率Fs和点数N如何塑造你的数字世界(以音频信号为例)
从‘听不清’到‘看得明’:采样率Fs和点数N如何塑造你的数字世界(以音频信号为例) 当你用手机录制一段语音备忘录,或是用专业设备捕捉一场音乐会时,背后隐藏着两个关键参数在默默定义着声音的"清晰度"——采…...
3个微信聊天记录备份痛点与开源解决方案:WeChatExporter完全指南
3个微信聊天记录备份痛点与开源解决方案:WeChatExporter完全指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失或更换而痛失珍贵的微信聊…...
win10 设置自动打开项目目录
问题描述:项目测试过程中,需要开启多个vscode窗口分别运行不同的项目模块代码,每次都要手动找到项目所在位置并开启。由于项目目录较多,时常需要层层翻找;有时电脑自动关机或重启,还需要重新执行这个简单而…...
流媒体订阅自动取消?原来是同步与异步的竞态条件在作祟!
自动取消的订阅2026 年 4 月 1 日,这篇文章是 [四月趣事俱乐部] 的一部分,是一项在愚人节发布关于意外话题的真实文章的活动。几个月前的一个周五晚上,作者和家人打算在常用的流媒体平台上放松看节目,该订阅服务是一张信用卡的福利…...
Python 爬虫进阶技巧:XPath 精准解析复杂 HTML 页面实战
前言 在 Python 爬虫开发领域,面对结构复杂、层级嵌套深、标签冗余的 HTML 页面时,基础的字符串匹配、正则表达式已无法满足高效、精准的数据提取需求,XPath 作为 W3C 标准的 XML/HTML 文档查询语言,凭借其简洁的语法、强大的节点…...
GPT Image 2 本地部署完全指南:2026年从API接入到自建服务的实测教程
目前国内用户想快速体验GPT Image 2的图片生成能力,最省心的方式是通过聚合平台KULAAI(https://ly.877ai.cn)直接调用,无需配置API Key和服务器环境。但如果你需要将GPT Image 2集成到自己的产品中,本地部署和API接入仍…...
小红书上的“论文初稿一键生成”是智商税吗?
不知道你有没有过这种时刻?对着空白文档发呆两小时,文献堆了几十篇,下笔第一句就卡壳;大纲改了五六版,逻辑还是乱,降重改到崩溃,重复率死活降不下来;答辩 PPT 熬到凌晨,格…...
MyBatis 高频八股文:从 Mapper 到缓存,一篇搞懂常见面试题
前言MyBatis 是 Java 后端开发中非常常用的持久层框架,主要负责 Java 程序和数据库之间的数据交互。在 Spring Boot 项目中,我们经常会用 MyBatis 或 MyBatis-Plus 来操作 MySQL。面试中,MyBatis 常见问题包括:MyBatis 是什么&…...
AI原生项目管理工具Roadmap Skill:基于MCP协议实现本地化任务协同
1. 项目概述:一个为AI Agent设计的本地化项目管理工具如果你和我一样,每天都在和Claude、Cursor这类AI助手打交道,一边写代码一边规划项目,那你肯定也遇到过这样的困境:脑子里蹦出一个绝妙的想法,或者AI助手…...
