蓝桥杯单片机快速开发笔记——特训7 实时时钟的暂停启动与修改

一、原理分析

        DS1302实时时钟:http://t.csdnimg.cn/JnDl7

        HC573/HC138:http://t.csdnimg.cn/W0a0U

        数码管:http://t.csdnimg.cn/kfm9Y

        独立键盘:http://t.csdnimg.cn/YPInc

二、示例题目

        在CT107D单片机综合训练平台上新建工程,采用I/O模式编写代码,实现以下功能:

  1. 将DS1302的底层驱动代码文件正确移植到工程中。
  2. 配置J5为BTN模式,将S4、S5和S6设置为独立按键。
  3. 初始化DS1302的默认启动参数为:24年3月28日23时59分40秒,周四。
  4. 系统上电后,DS1302实时时钟从默认参数启动运行,并将当前的时、分、秒显示在数码管上,时分秒之间用“_”分隔。
  5. 按键S4实现“暂停/启动”功能。系统上电时,实时时钟处于启动工作状态,数码管显示实时时间。按下S4按键,数码管的实时时间显示暂停;再次按下S4按键,从当前显示时间点重新启动,继续显示实时时间;如此往复,实现循环控制。
  6. 按键S5实现“分钟减1”功能。仅在实时时间显示暂停的情况下,每按下1次,分钟减1。在00分的情况下减1,分钟恢复59,忽略时的退位。
  7. 按键S6实现“分钟加1”功能。该按键仅在实时时间显示暂停的情况下有效,每按下1次,分钟加1。在59分的情况下加1,分钟恢复0,忽略时的进位。

三、示例代码

#include "stc15.h"
#include "ds1302.h"#define TSMG 500
#define TKEY 200sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;code unsigned char write_rtc[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //rtc写入地址
code unsigned char read_rtc[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};		//rtc读取地址
//默认启动参数					40秒   59分  23时  28日  3月   周四  24年
code unsigned char now_rtc[7] = {0x40, 0x59, 0x23, 0x28, 0x03, 0x04, 0x24};unsigned char smg_hou;		//数码管显示时
unsigned char smg_min;		//数码管显示分
unsigned char smg_s;			//数码管显示秒
unsigned char date = 1;   //数码管显示是否从DS1302获取更新 1更新 0停止更新
unsigned char start_stop = 1;   //暂停0/启动1
unsigned char hou = 0;		//时
unsigned char min = 0;		//分
unsigned char s = 0;			//秒void delay_smg(unsigned int t)  //数码管延时函数
{while(t--);
}void delay_key(unsigned int t)	//键盘延时函数
{while(t--);
}// 共阳数码管段码表
code unsigned char Seg_Table[] = 
{0xc0, //00xf9, //10xa4, //20xb0, //30x99, //40x92, //50x82, //60xf8, //70x80, //80x90, //90x88, //A0x83, //b0xc6, //C0xa1, //d0x86, //E0x8e //F
};//控制所有数码管
void smg_all(unsigned char dat)
{hc573(6,0xff);hc573(7,dat);
}
//控制单个数码管
void smg_bit(unsigned char pos, unsigned char dat)
{hc573(6,0x01 << pos);hc573(7,dat);delay_smg(TSMG);hc573(6,0x01 << pos);hc573(7,0xff);
}//数码管显示函数
void smg_dispaly()
{if(date == 1)     //如果要从DS1302获取信息{read_rtc_ds1302();smg_hou = hou;smg_min = min;smg_s = s;}smg_bit(0, Seg_Table[smg_hou >> 4]);   //时smg_bit(1, Seg_Table[smg_hou & 0x0f]);smg_bit(2, 0xbf);smg_bit(3, Seg_Table[smg_min >> 4]);   //分smg_bit(4, Seg_Table[smg_min & 0x0f]);smg_bit(5, 0xbf);smg_bit(6, Seg_Table[(smg_s >> 4) & 0x07]);  	 //秒smg_bit(7, Seg_Table[smg_s & 0x0f]);
}//初始化时钟信息
void init_rtc_ds1302()
{unsigned char n;Write_Ds1302_Byte( 0x8e,0x00 );//解除写保护for(n = 0; n < 7; n++){Write_Ds1302_Byte( write_rtc[n],now_rtc[n] );}Write_Ds1302_Byte( 0x8e,0x80 );//使能写保护
}//读出时钟信息
void read_rtc_ds1302()
{hou = Read_Ds1302_Byte ( read_rtc[2] );min = Read_Ds1302_Byte ( read_rtc[1] );s = Read_Ds1302_Byte ( read_rtc[0] );
}//写入时钟信息
void write_rtc_ds1302()
{Write_Ds1302_Byte( 0x8e,0x00 );//解除写保护//写入时钟信息Write_Ds1302_Byte( 0x84,smg_hou );Write_Ds1302_Byte( 0x82,smg_min );Write_Ds1302_Byte( 0x80,smg_s );Write_Ds1302_Byte( 0x8e,0x80 );//使能写保护
}void scan_key()
{if(s4 == 0){delay_key(TKEY);if(s4 == 0){if(start_stop == 1)   //如果处于启动{date = 0;					//数码管显示暂停更新start_stop = 0;}else{write_rtc_ds1302();  //写入时钟信息start_stop = 1;date = 1;						 //数码管显示更新}while(s4 == 0){smg_dispaly();}}}if(s5 == 0){delay_key(TKEY);if(s5 == 0){if(start_stop == 0)   //如果处于暂停{min = (min/16)*10 + min%16;  //BCD码转十进制if(min == 0){min = 59;}elsemin--;min = (min/10)*16 + min%10;  //BCD码转十六进制smg_min = min;}while(s5 == 0){smg_dispaly();}}}if(s6 == 0){delay_key(TKEY);if(s6 == 0){if(start_stop == 0)   //如果处于暂停{min = (min/16)*10 + min%16;  //BCD码转十进制if(min == 59){min = 0;}elsemin++;min = (min/10)*16 + min%10;  //BCD码转十六进制smg_min = min;}while(s6 == 0){smg_dispaly();}}}
}void init_sys()
{hc573(5, 0x00);				//关闭蜂鸣器与继电器hc573(4, 0xff);				//关闭LEDsmg_all(0xff);				//关闭数码管init_rtc_ds1302();    //初始化DS1302
}void main()
{init_sys();while(1){smg_dispaly();     //数码管显示函数scan_key();        //键盘扫描函数}
}

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

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

相关文章

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而…

Leo赠书活动-21期 《一篇讲明白 Hadoop 生态的三大部件》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

【算法刷题】链表笔试题解析(1)

一、链表分割 题目描述&#xff1a; 链接&#xff1a;链表分割 题目分析&#xff1a; 这题直接处理并不好做&#xff0c;我们可以构建前后两个链表&#xff0c;将小于x值的结点放在链表a内&#xff0c;将其它结点放在链表b内&#xff0c;这样将原链表遍历完后&#xff0c;原链…

Day23 代码随想录(1刷) 二叉树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

PHP图床程序优化版:图片外链服务、图床API服务、图片CDN加速与破解防盗链

图片免费上传 支持本地储存、FTP储存、第三方云储存&#xff08;阿里云 OSS、腾讯云 COS、七牛云等&#xff09;。 图片外链加速 一键转换第三方网站的图片外链地址为图床可分享的图片地址&#xff08;支持CDN&#xff09;。 图片解析服务 直接将第三方外链图片地址显示为…

oracle docker安装

修改下载的Image的REPOSITORY和TAG属性 修改下载的Image的REPOSITORY和TAG属性&#xff1a;docker tag <IMAGE ID> <REPOSITORY NAME> docker tag 3fa112fd3642 aliyun/oracle_11g 参考网址 使用docker images时&#xff0c;可能会出现REPOSITORY和TAG均为none的镜…

【教程】iOS 手机抓包工具介绍及教程

&#x1f4f1; 最近又发现APP Store一款宝藏软件&#xff0c;克魔助手抓包工具&#xff0c;app刚上架&#xff0c;功能不断迭代中&#xff0c;目前18软妹币实惠价可享受终身版&#xff01;现在是下手的最好时机。 引言 移动端开发中&#xff0c;抓包工具已成为必备的工具之一…

shell脚本发布nginx vue2 项目示例

nginx、git、node.js安装略过。 使git pull或者git push不需要输入密码操作方法 非docker安装nginx&#xff01;&#xff01;&#xff01; 姊妹篇&#xff08;docker安装nginx&#xff09;&#xff1a;shell脚本发布docker-nginx vue2 项目示例 pro_build.sh 注意&#xff1…

Linux基础IO(操作系统层面理解文件)

目录 一、认识 open 函数 1.1 理解文件 1.2 open 函数 1.3 函数选项和宏 二、 open 函数的返回值 三、 fd 的本质 3.1 各部分内容及关系 3.2 如何确定进程对应文件 四、Linux 一切皆文件&#xff1f; 一、认识 open 函数 在C语言中学习文件操作时&#xff0c;我们学…

【OceanBase】V3.1.5 版本备份恢复

日志备份 启动日志归档 ALTER SYSTEM ARCHIVELOG;查看日志归档状态 SELECT * FROM CDB_OB_BACKUP_ARCHIVELOG;停止日志归档 ALTER SYSTEM NOARCHIVELOG;数据备份 发起转储 -- 发起转储 ALTER SYSTEM MAJOR FREEZE;-- 查看转储进度 SELECT * FROM oceanbase.__all_zone WH…

基于SpringBoot和Vue的课程作业管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的课程作业管理系统的设计与实现。 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&am…

element表格 加滚动,监听底部实现分页加载

表格要实现滚动很简单&#xff0c;给他加一个高度即可 height"300" 然后是监听事件 mounted() {this.lazyLoading();}, methods:{lazyLoading(){let dom document.querySelector(".el-table__body-wrapper");dom.addEventListener("scroll", (…

踩坑uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效的问题

首先看到这是uni官网提出的&#xff0c;app上建议使用高德地图。 下面就用高德地图进行配置。 步骤一&#xff1a;登陆高德地图控制台 名称和类型根据自己情况填写选择即可 步骤二&#xff1a; 添加key 步骤三&#xff1a;取到SHA1 进入uniapp开发官网 点击应用名称&#…

算法模型离线评估方案

1 引言2需求背景3特征评估 3.1特征表维护3.2样本频率分布直方图概览3.3Pearson相关系数计算3.4缺失率计算4模型评估 4.1模型离线AUC评估 4.1.1什么是AUC4.1.2AUC的优势:4.2TensorBoard可视化 4.2.1项目中集成tensorboard4.2.2启动tensorboard命令4.2.3可视化效果4.3离线实验记录…

SpringBoot SpringMVC (详解)

6. SpringBoot Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 是为了快速开发 Spring 程序开发而诞生的。 Spring Boot 的优点&#xff1a; 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c;⽤于秒级集成各种框架。内置运⾏…

钓鱼_精准定位GPS

目录 一、Seeker (一) 简介 二、实验环境 三、实验操作 (一) 下载安装 (二) 运行和使用 (三) 隧道代理 1. 登录平台 2. 下载代理客户端 3. 使用代理客户端

力扣练习 3.27

121. 买卖股票的最佳时机 贪婪思想&#xff1a;力争在最低成本买入&#xff0c;最高利润卖出。 [7,1,5,3,6,4] 可以先假设在第一天买入和卖出&#xff0c;这时最低成本是7&#xff0c;最大利润是7-70 然后假设在第二天买入和卖出&#xff0c;成本就是1&#xff0c;利润也是0 第…

前端开发避坑-form表单action和submit提交与ajax异步提交冲突引起的故障解决

前端开发避坑-form表单action和submit提交与ajax异步提交冲突引起的故障解决&#xff01; 近期在开发网站前端的时候&#xff0c;始终出现2次请求。困扰了很久。查询了网上的解决办法。发现&#xff0c;根源是因为&#xff0c;我的form表单里增加了一个action。虽然里面是空的…

JAVA WEB 能够实现整个文件夹的上传下载吗?

导入项目&#xff1a; 导入到Eclipse&#xff1a;导入项目 导入到IDEA&#xff1a;导入项目 springboot统一配置&#xff1a;springboot-配置 下载示例&#xff1a; https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/ 工程 NOSQL NOSQL示例不需要任何配置&#xff0c;可…

【面试经典150 | 】最长递增子序列

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 300. 最长递增子序列 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示以位置 i 对应整数为末尾的最长递增子序列的长度。 状态转移 我们从小到大计算 dp…