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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DevOps】Git 图文详解(六):Git 利器 - 分支

Git 利器 - 分支 1.分支 Branch2.分支指令 &#x1f525;3.分支的切换 checkout4.合并 merge & 冲突4.1 &#x1f538; 快速合并&#xff08;Fast forward&#xff09;4.2 &#x1f538; 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…

【C++进阶之路】第十一篇:C++的IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4.stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。prin…

【鸿蒙应用ArkTS开发系列】- 灌水区,鸿蒙ArkTs开发有问题可以在该帖中反馈

大家好, 这是一篇水贴&#xff0c;给大家提供一个交流沟通鸿蒙开发遇到问题的地方。 新增新增这个文章呢&#xff0c;大家在开发使用ArkTS开发鸿蒙应用或者鸿蒙服务的时候&#xff0c;有遇到疑问或者问题&#xff0c;可以在本文章评论区提问&#xff0c;我看到了如果知道怎么…

【内网穿透】在Ubuntu搭建Web小游戏网站,并将其发布到公网访问

目录 前言 1. 本地环境服务搭建 2. 局域网测试访问 3. 内网穿透 3.1 ubuntu本地安装cpolar 3.2 创建隧道 3.3 测试公网访问 4. 配置固定二级子域名 4.1 保留一个二级子域名 4.2 配置二级子域名 4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互…

Ubuntu文件系统损坏:The root filesystem on /dev/sda5 requires a manual fsck

前言 Ubuntu在启动过程中&#xff0c;经常会遇到一些开故障&#xff0c;导致设备无法正常开机&#xff0c;例如文件系统损坏等。 故障描述 Ubuntu系统启动过程中&#xff0c;出现以下文件系统损坏错误&#xff1a; 产生原因 该故障是由磁盘检测不能通过导致&#xff0c;可能是因…

竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

基于C#实现AC自动机算法

我要检查一篇文章中是否有某些敏感词&#xff0c;这其实就是多模式匹配的问题。当然你也可以用 KMP 算法求出&#xff0c;那么它的时间复杂度为 O(c*(mn))&#xff0c;c&#xff1a;为模式串的个数。m&#xff1a;为模式串的长度,n:为正文的长度&#xff0c;那么这个复杂度就不…

Macs Fan Control Pro:掌握您的Mac风扇,提升散热效率

在Mac的世界里&#xff0c;每一个细节都显得格外重要。而其中&#xff0c;风扇的控制与调节则显得尤为重要。然而&#xff0c;原生的Mac系统并不提供直观的风扇控制工具&#xff0c;这使得许多Mac用户在处理高负荷任务时&#xff0c;风扇无法有效地进行散热&#xff0c;导致机器…

TensorFlow实战教程(十八)-Keras搭建卷积神经网络及CNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras实现分类学习,以MNIST数字图片为例进行讲解。本篇文章详细讲解了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。基础性文章,希望对您有所帮助! 一…

体感互动游戏VR游戏AR体感游戏软件开发

随着科技的不断发展&#xff0c;体感互动游戏正逐渐成为游戏行业的一个重要趋势。这类游戏通过利用传感器、摄像头和运动控制器等技术&#xff0c;使玩家能够通过身体动作与游戏进行实时互动&#xff0c;极大地提升了娱乐体验。 1. 游戏设计与互动元素 体感互动游戏的核心在于…

使用kafka_exporter监控Kafka

prometheus 监控 kafka 常见的有两种开源方案,一种是传统的部署 exporter 的方式,一种是通过 jmx 配置监控, 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporterjmx_exporter:https://github.com/prometheus/jmx_exporter本文将采用kafka_exporter方…

使用Navicat将SQL server数据库导入mysql数据库

使用Navicat将SQL server数据库导入mysql数据库 1、使用Navicat Premium打开MySql数据库&#xff0c;然后新建一个数据库名&#xff08;该数据库名称为需要从SqlServer数据库导过来的名称&#xff0c;mysql只有小写&#xff0c;不影响&#xff09; 比如需要将SqlServer数据库…

NGINX缓存详解之服务端缓存

服务端缓存 proxy cache属于服务端缓存,主要实现 nginx 服务器对客户端数据请求的快速响应。 nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。 当客户端再次访问相同的数据时,nginx…

谈谈你对mvc和mvvm的理解

MVC和MVVM是软件开发中两种常见的架构模式&#xff0c;各自有不同的优缺点。 MVC&#xff08;Model-View-Controller&#xff09;是一种经典的架构模式&#xff0c;将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和…

中国城镇化时空分异及影响因素数据集(2010-2020)

基于《中国统计年鉴》、各省份统计年鉴及EPS全球统计数据库等相关统计数据&#xff0c;从人居生活、人文环境、人城关系等维度界定了城镇化内涵框架与指标体系&#xff0c;利用改进的熵值法计算综合评价指数&#xff0c;并运用泰尔指数、方差分解及地理探测器等方法&#xff0c…

ventoy安装操作系统

下载ventoy https://github.com/ventoy/Ventoy/releases/download/v1.0.96/ventoy-1.0.96-windows.zip 解压后执行 Ventoy2Disk 2、安装后将ISO放入U盘大的分区&#xff0c;通过U盘启动就可以识别到ISO镜像开始装系统

2021秋招-总目录

2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function&#xff1…

【Java】异常处理及其语法、抛出异常、自定义异常(完结)

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;道阻且长&#xff0c;行则将至 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 一.&#x1f510;异…

centos7卸载mongodb数据重新安装时无法安装的问题

如果卸载不干净直接用 sudo find / -name mongo 查询所有关于mongo的文件&#xff0c;然后一个个去删除。 当然最好的办法还是去看日志信息。 直接去查看日志信息 sudo cat /var/log/mongodb/mongod.log 根据提示信息说这个没有权限操作 直接删除即可&#xff0c;都是之前…

【Web】Ctfshow XSS刷题记录

目录 反射型XSS ①web316 ②web317-319 ③web320-322 ④web323-326 存储型XSS ①web327 ②web328 ③web329 ④web330 ⑤web331 ⑥web332-333 反射型XSS ①web316 直接输入<script>alert(1)</script>,能弹窗。xss题目一般会有个bot&#xff0c;可以触…