NO12 蓝桥杯单片机实践之DS1302

1 回顾

DS1302使用电子时钟模式时,使用方法为:

(1)将读写寄存器的地址写成数组

(2)时间参数写成数组

(3)调用函数来进行读取实时时间(底层代码.c文件)

2 实践

2.1 任务

2.2 思路

首先读任务分为两部分,一是使用DS1302电子时钟功能,二是将电子时钟的时分秒显示在数码管上。(DS1302电子时钟功能就按照使用步骤来写,第二部分任务就用到数码管的动态显示,之前多次练习就不再赘述。)

其次由于要用到底层代码ds1302.c,官方没有给对应.h文件,因此要自己写。

2.3 完整代码

2.3.1 .h 文件编写

首先是底层文件.h的编写,按照之前讲的.h文件编写有对应的结构,其应包括对函数的声明,有需要的话还要有相关引脚的定义(定义引脚时有时会用到一些函数库)。

(1)结构先写好:

(2)翻看.c 文件:

有三个函数,因此复制到.h文件中。

.h文件变为:

(3)编译一下,发现缺少引脚定义

则回去看硬件原理图:

根据对应引脚进行定义(可放.c文件也可放.h文件),定义引脚时还要使用对应的库:

最后.h文件就写完啦!!!!!!

2.3.2 任务完整代码

完整代码如下,这里要注意的是main函数中,ds1302读写函数都要涉及,写函数放在while循环外(写一次即可),读函数就要循环读,可理解为电子时钟每时每刻的时间都在更新,因此需要循环读。

其次,还有读写函数的编写时,写函数是直接调用底层代码的写入函数,对相应地址进行相应的写入即可,而读函数在调用了底层代码的读取函数后,还要赋给一个数组Timer_dat,这是因为数码管显示时,内容用的是Timer_dat里的元素来计算的,如果不把每时每刻读到的时间重新赋值给Timer_dat,那么Timer_dat就恒定为最初设计的初始时间,变成了个常数而不会改变了。

完整代码如下:

#include  "stc15f2k60s2.h"
#include  "ds1302.h"void selectHC138(unsigned int n)
{switch(n){case 0:P2 = (P2 & 0x1f) | 0x00;  break;case 1:P2 = (P2 & 0x1f) | 0x20;  break;case 2:P2 = (P2 & 0x1f) | 0x40;  break;case 3:P2 = (P2 & 0x1f) | 0x60;  break;case 4:P2 = (P2 & 0x1f) | 0x80;  break;case 5:P2 = (P2 & 0x1f) | 0xa0;  break;case 6:P2 = (P2 & 0x1f) | 0xc0;  break;case 7:P2 = (P2 & 0x1f) | 0xe0;  break;}
}//==============================================================================
unsigned char code Read_add_ds1302[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char code Write_add_ds1302[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//18nian.2.17  23h,50min,46s  Sat.
unsigned char Time_dat[7]={0x46,0x59,0x23,0x17,0x02,0x06,0x18};unsigned int i;
void  Write_DS1302()
{Write_Ds1302_Byte(0x8e,0x00);for(i=0;i<7;i++){Write_Ds1302_Byte(Write_add_ds1302[i],Time_dat[i]);}Write_Ds1302_Byte(0x8E,0x80);
}void  Read_DS1302()
{Read_Ds1302_Byte(0x8f);for(i=0;i<7;i++){Time_dat[i] = Read_Ds1302_Byte(Read_add_ds1302[i]);}
}
//====================================================================================//========================
void Delay(unsigned char t)
{while(t--);
}code unsigned char SMG_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e,  //F
0xbf  //-
};void SMG(unsigned int position, unsigned char content)
{selectHC138(6);P0 = 0x01 << position;selectHC138(7);P0 = content;
}void SMG_CLOSEALL(unsigned char dat)
{selectHC138(6);P0 = 0xff;selectHC138(7);P0 = dat;
}void SMG_Display()
{SMG_CLOSEALL(0xff);Delay(100);SMG(0,SMG_Table[ Time_dat[2] /16]);Delay(100);SMG(1,SMG_Table[ Time_dat[2] %16]);Delay(100);SMG(2,SMG_Table[16]);Delay(100);SMG(3,SMG_Table[ Time_dat[1] /16]);Delay(100);SMG(4,SMG_Table[Time_dat[1] %16]);Delay(100);SMG(5,SMG_Table[16]);Delay(100);SMG(6,SMG_Table[ Time_dat[0] /16] );Delay(100);SMG(7,SMG_Table[ Time_dat[0] %16] );Delay(100);SMG_CLOSEALL(0xff);Delay(100);
}void close()
{selectHC138(5);P0 = 0x00;selectHC138(4);P0 = 0xff;
}void main()
{Write_DS1302();close();while(1){Read_DS1302();SMG_Display();}
}

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

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

相关文章

一文读懂Unity性能分析工具:MemoryProfiler,教你轻松分析项目性能瓶颈

轻松掌握MemoryProfiler MemoryProfiler的基本概念如何获取MemoryProfileMemoryProfiler内存分析实践正常GC,合理释放对象的引用无法正常GC&#xff0c;对象引用没有合理释放。 总结 MemoryProfiler的基本概念 Unity 性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性…

C语言结构体详解

前言&#xff1a; 何为结构体&#xff0c;结构体又是什么呢&#xff0c;相信有很多小伙伴对结构体还没有一个清楚的概念&#xff0c;今天咱也一起来探讨一下何为结构体&#xff0c;在C语言当中有着许多的数据类型&#xff0c;如char&#xff0c;int&#xff0c;long&#xff0c…

成都欣丰洪泰文化传媒有限公司电商服务的行业先锋

在当今电商行业风起云涌的时代&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其深厚的行业积淀和敏锐的市场洞察力&#xff0c;已经崭露头角&#xff0c;成为众多电商企业争相合作的对象。欣丰洪泰不仅专注于电商服务&#xff0c;更是以其专业的服务理念和创新的营销策略&#…

软考102-上午题-【信息安全】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a;

【JavaEE】Thread类中run和start的区别

文章目录 先说结论Run方法Start方法 先说结论 当你想要创建一个新的线程并执行某些任务时&#xff0c;你应该重写run方法以提供任务的具体实现&#xff0c;并通过调用start方法来启动新线程 run方法包含了线程应该执行的代码&#xff0c;但直接调用它并不会启动新的线程。 s…

yolov5目标检测可视化界面pyside6源码(无登录版)

这个是yolov5pyside6实现目标检测可视化的代码&#xff0c;本套项目没有用户登录的功能&#xff0c;如需用户登录版&#xff0c;看另一篇文章&#xff1a;yolov5pyside6登录用户管理目标检测可视化源码_yolov5用户登入功能-CSDN博客

java入门学习Day02

本文介绍的内容主要有&#xff1a;java的注释&#xff08;样式&#xff09;、关键字、字面量。 一、java中的注释 1、基本语法 ① 单行注释 //注释信息 ② 多行注释 /* 注释信息1 注释信息2&#xff0c; */ ③ 文档注释 /** 注释信息1 注释信息2&#xff0c; */ public class…

vue3封装Element分页

配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…

C#预处理器指令(巨细版)

文章目录 一、预处理器指令的基本概念二、预处理器指令的基本规则三、C# 预处理器指令详解3.1 #define 和 #undef3.2 #if、#else、#elif 和 #endif3.3 #line3.4 #error 和 #warning3.5 #region 和 #endregion 四、高级应用&#xff1a;预处理器指令的最佳实践4.1 条件编译的最佳…

量化交易软件开发定制的步骤

量化交易软件的定制开发是一个复杂而精细的过程&#xff0c;需要经过一系列步骤来确保最终交付的软件符合客户的需求并具有高度的可靠性和效率。以下是量化交易软件开发定制的主要步骤&#xff1a; 1. 需求分析与规划 在开始开发之前&#xff0c;首先需要与客户深入沟通&…

k8s安装traefik作为ingress

一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的&#xff0c;通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务&#xff0c;以下详细说一下 Ingress&#xff0c;毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …

AI新工具 小模型也有大智慧Qwen1.5-MoE;大模型动态排行榜;马斯克更新Grok-1.5

✨ 1: Qwen1.5-MoE 阿里巴巴一款小型 MoE 模型&#xff0c;只有 27 亿个激活参数&#xff0c;但性能与最先进的 7B 模型&#xff08;如 Mistral 7B 和 Qwen1.5-7B&#xff09;相匹配。 Qwen1.5-MoE是一个使用混合专家模型&#xff08;Mixture-of-Experts&#xff0c;MoE&…