【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设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++知识点梳理:C++ templates

c模板包括&#xff1a;类模板、类&#xff08;非模板类和模板类&#xff09;方法模板、函数模板、别名模板、变量模板。 类模板模板参数列表说明&#xff1a; 1&#xff09;类模板定义 类名前&#xff0c;需模板参数列表声明&#xff0c;template<>行。 template后面的&l…

CUDA API学习

1. nvtxNameCudaStream 在 NVIDIA Tools Extension (NVTX) 中,nvtxNameCudaStream 函数用于为 CUDA 流(stream)设置一个用户定义的名称,以便在可视化工具中更好地理解 CUDA 流的作用。该函数允许你将一个可读的字符串关联到 CUDA 流,从而在可视化工具中标识和跟踪不同的流…

【数据结构初阶(3)】双向带头结点循环链表

文章目录 Ⅰ 概念及结构Ⅱ 基本操作实现1. 结点的定义2. 创建头节点3. 创建新结点4. 双向链表销毁5. 双向链表打印6. 双向链表尾插7. 双向链表尾删8. 双向链表头插9. 双向链表头删10. 双向链表查找11. 在指定 pos 位置前插入新结点12. 删除指定 pos 位置的结点 Ⅲ 十分钟手搓链…

CSS中常用的伪元素选择器

伪元素&#xff0c;表示页面中一些特殊的并不真实存在的元素&#xff08;元素的位置&#xff09; 1&#xff0c;::first-letter 表示第一个字母 2&#xff0c;::first-line 表示第一行 3&#xff0c;::selection 选中的内容 4&#xff0c;::before 元素的开始位置 5&#…

​vmware虚拟机ubuntu系统配置静态ip​

把虚拟机当成服务器&#xff0c;如果虚拟机的ip是一直变化的&#xff0c;每次远程连接需要都修改连接虚拟机的ip地址&#xff0c;这肯定是麻烦的。 一、设置一下本机的VMnet8的ip 配置路径&#xff1a;控制面板->所有控制面板项->网络和共享中心 二、首先设置NAT 选自…

数据结构【DS】树的性质

度为m的树 m叉树 至少有一个节点的度m 允许所有节点的度都<m 一定是非空树&#xff0c;至少有m1个节点 可以是空树 节点数 总度数 1m叉树&#xff1a; 高度为h的m叉树 节点数最少为&#xff1a;h具有n个结点的m叉树 最大高度&#xff1a;n度为m的树&#xff1a; 具有…

【营养学01】肾脏:脱发以及白头

发&#xff0c;即头发&#xff0c;又名血余。 发之营养来源于血&#xff0c;故称“发为血之余”。 但发的生机根源于肾。 因为肾藏精&#xff0c;精能化血&#xff0c;精血旺盛&#xff0c;则毛发壮而润泽&#xff0c;故又说肾“其华在发” 黑桑葚&#xff0c;黑枸杞&#xff0…

Postman的各种参数你都用对了吗?

大家好&#xff0c;我是G探险者。 Postman我们都不陌生&#xff0c;作为一个广泛使用的 HTTP 客户端&#xff0c;平时我们使用它来测试接口&#xff0c;无非就是把接口的url放进去&#xff0c;然后根据请求类型get或者post,在不同位置传一下参数&#xff0c;除了常见的 Params…

Redis(地理空间Geospatial和HyperLogLog)

Geospatial&#xff1a; Redis中的Geospatial提供了一种存储和处理地理空间数据的能力&#xff0c;这对于许多应用非常有用。以下是Redis中的Geospatial的一些作用&#xff1a; 1. 地理位置查询&#xff1a;可以存储地理位置的坐标信息&#xff0c;并且可以通过查询指定半径范…

抛美债买中债!人民币大涨645点,美联储投降,美元要撑不住了

正当各国央行纷纷权衡其外汇储备组合时&#xff0c;一则消息震动了金融市场&#xff1a;投资者正抛售美国国债&#xff0c;转而购买中国国债。此举不仅反映了市场对未来货币政策的预期&#xff0c;也昭示了全球经济力量平衡的微妙变化。 首先&#xff0c;我们不得不提的是人民…

第2关:图的深度优先遍历

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;以邻接矩阵存储图&#xff0c;要求编写程序实现图的深度优先遍历。 相关知识 图的深度优先遍历类似于树的先序遍历, 是树的先序遍历的推广&#xff0c;其基本思想如下&#xff1a; …

DITTEL控制器维修SENSITRON6-2AE

DITTEL工控产品维修包括&#xff1a;德国DITTEL平衡测试仪维修,DITTEL模块&#xff0c;过程监控模块&#xff0c;DITTEL控制器&#xff0c;平衡头&#xff0c;机电平衡头&#xff0c;显示器&#xff0c;平衡系统等产品。 DITTEL过程控制模块维修 DM6000是一个过程控制模块&…

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…

关于灰度发布的总结(一)

灰度发布是指在不影响生产环节可用性的前提下&#xff0c;将软件版本部署到生产灰度区&#xff08;小范围、小流量&#xff09;&#xff0c;对其进行持续一段时间的监控及验证&#xff0c;最后根据监控验证结果决定软件新版本是否正式发布的软件发布过程。 灰度发布可以进行以…

element表格第一个列变成最后一个处理方案

解决方案&#xff1a; 翻译过来就是这样子&#xff0c;说el-table不能嵌套el-table-column以外的元素

白盒子测试总结

白盒子测试&#xff0c;也称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试&#xff0c;是一种测试用例的设计方法。白盒测试需要全面了解被测试程序的内部逻辑结构&#xff0c;并对所有逻辑路径进行测试。其基本方法包括&#xff1a; 语句覆盖&#xff1a;设计若干个…

第3关:图的广度遍历

500 任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;以邻接表存储图&#xff0c;要求编写程序实现图的广度优先遍历。 相关知识 广度优先遍历类似于树的按层次遍历的过程。 假设从图中某顶点v出发&#xff0c;在访问了v之后依次访…

Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具

连接Foodpanda和电商平台的无代码开发 Foodpanda不仅是一家提供快速外卖服务的国际品牌&#xff0c;而且其创新的技术解决方案还能帮助电商企业优化系统运营。通过无代码开发的方法&#xff0c;即使没有专业的API开发知识&#xff0c;商家也能实现高效的电商系统和客服系统连接…

无人售货奶柜:颠覆传统零售行业的潜力黑马

无人售货奶柜&#xff1a;颠覆传统零售行业的潜力黑马 无人售货奶柜具备体积小、灵活运用空间、无需人工看守和自动结算等特点。相较于传统建店方式&#xff0c;它的成本大大降低&#xff0c;从而提高了运营效率。此外&#xff0c;无人售货奶柜独特的优势之一就是可以保持24小时…

[hive] posexplode函数

在Hive SQL中&#xff0c;posexplode是一个用于将数组&#xff08;array&#xff09;拆分为多行的函数。 它返回数组中的每个元素以及其在数组中的位置&#xff08;索引&#xff09;作为两列输出。 这是posexplode函数的语法&#xff1a; posexplode(array)其中&#xff0c;…