当前位置: 首页 > news >正文

【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.lryc.cn/news/238679.html

相关文章:

  • c语言回文数
  • 【学习记录】从0开始的Linux学习之旅——编译linux内核
  • uni-app - 日期 · 时间选择器
  • 使用USB转JTAG芯片CH347在Vivado下调试
  • 硬技能之上的软技巧(三)
  • mysql 查询
  • 2311rust过程宏的示例
  • 数据分析:数据预处理流程及方法
  • uniapp 防抖节流封装和使用
  • springcloud alibaba学习视频
  • 【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
  • QtC++与QColumnView详解
  • 微信小程序配置企业微信的在线客服
  • 深入理解Java AQS:从原理到源码分析
  • 【数据结构(四)】栈(1)
  • 实验(四):指令部件实验
  • 【Android11】在内置的Tvsettings的界面中显示以太网Mac地址
  • 在Oracle 11g 数据库上设置透明数据加密(TDE)
  • 互动直播 之 视频帧原始数据管理
  • 基于tcp协议及数据库sqlite3的云词典项目
  • C/C++内存管理(1):C/C++内存分布,C++内存管理方式
  • 11 redis中分布式锁的实现
  • 循环链表3
  • 如何修改百科内容?百度百科内容怎么修改?
  • mysql8.0英文OCP考试第131-140题
  • MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
  • 信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解
  • 【JavaEE】Spring的创建和使用(保姆级手把手图解)
  • MyBatis:关联查询
  • 第十二章 控制值的转换