单片机蓝桥杯——DS1302

2023-11-15

1、原理

对 DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有:7 个寄存器与日历、时钟相关,存放的数据位为 BCD 码形式。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器
及与 RAM 相关的寄存器等。如下图所示,时钟日历包含在 7 个读/写寄存器内,读/写寄存器中的数据是BCD 码。
DS1302数据地址和传输格式
秒寄存器的 BIT7 定义为时间暂停位,当 BIT1 为 1 时,时钟振荡器停止工作,DS1302 进入低功耗模式,电源消耗小于 100 微安,当 BIT1 为 0 时,时钟振荡器启动,DS1302 正常工作。

小时寄存器的 BIT7 定义为 12 或 24 小时工作模式选择位,当 BIT7 为高时,为 12 小时工作模式,此时 BIT5 为 AM/PM 位,低电平标示 AM,高电平标示PM,在 24 小时模式下,BIT5 为第二个 10 小时位标示(20~23 时)。

写保护寄存器的 BIT7:WP 是写保护位,工作时,出 WP 外的其他位都置为0,对时钟/日历寄存器或 RAM 进行写操作之前,WP 必须为 0,当 WP 为高电平的时候,不能对任何时钟/日历寄存器或 RAM 进行写操作。

此外,DS1302还有突发模式(burst mode 或称多字节传输模式)可以指定任何的时钟/日历或者 RAM 寄存器为突发模式,此处不再赘述。

2、代码

代码功能:初始时间为2021年5月9日23时59分50秒,八位数码管从左到右依次显示“时-分-秒”。
DS1302 的初始化部分:只需要调用一次,写入一个初始值即可

#include "STC15F2K60S2.h"
#include "intrins.h"
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
uchar segCode[25]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,       //0~9的段码(不带小数点)
								 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf}; //0.~9.的段码(带小数点) 以及0xff全灭
uchar segVal[]={20,20,20,20,20,20,20,20};  //数码管初始化显示1 2 3 4 1. 2. 3. 4.

uchar DS1302r_add[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};	//DS1302读数据的地址
uchar DS1302w_add[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};	//DS1302写数据的地址
uchar Timer[] = {0x50,0x59,0x23,0x05,0x09,0x07,0x21};				//2021年,5月9日,23时59分50秒

void InitDS1302()//DS1302初始化时间
{
	uchar i;
	Write_Ds1302_Byte(0x8e,0x00);//0x8e为写保护寄存器
	for(i=0; i<7; i++)
		Write_Ds1302_Byte(DS1302w_add[i],Timer[i]);
	Write_Ds1302_Byte(0x8e,0x80);
}
void ReadDS1302()//读取DS1302时间
{
	uchar i;
	for(i=0; i<7; i++)
		  [i] = Read_Ds1302_Byte(DS1302r_add[i]);
}
void SelectHC573(uchar val) 
{
	switch(val)
	{
		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;
		default: P2 = (P2 & 0x1f); break;		
	}
}
void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
{
	SelectHC573(5);
	P0 = 0xbf;      //由于不同板子的引脚接法不同,此时的初始值也不同
	SelectHC573(4);	
	P0 = 0xff;     //LED全灭
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}
uchar segFlag = 0;//数码管显示位标志位
uint count300ms = 0;//1s定时标志位
bit timerFlag = 1;//DS1302读时间的标志位,为1时读,为0时不
void ServiceTimer0() interrupt 1
{
	uchar pushp0,pushp2;
	pushp0 = P0;
	pushp2 = P2;//入栈
//数码管
	SelectHC573(6);
	P0 = (0x01<<segFlag);
	SelectHC573(7);	
	P0 = segCode[segVal[segFlag]];
	segFlag++;
	if(segFlag == 8) segFlag = 0;
//1s定时,DS18B20读温度
	count300ms++;
	if(count300ms>300)//300ms更新一次数值
	{
		count300ms = 0;
		timerFlag = 1;
	}
	P2 = pushp2;//出栈
	P0 = pushp0;
}
uchar tem;
void main()
{
	InitSystem();
	Timer0Init();
InitDS1302();
	while(1)
	{	
		if(timerFlag==1)
		{
			ReadDS1302();
			timerFlag=0;
		}
		segVal[0] = Timer[2] / 16;
		segVal[1] = Timer[2] % 16;
		segVal[2] = 21;
		segVal[3] = Timer[1] / 16;
		segVal[4] = Timer[1] % 16;
		segVal[5] = 21;
		segVal[6] = Timer[0] / 16;
		segVal[7] = Timer[0] % 16;

	}
}

显示结果如下:

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机蓝桥杯——DS1302 的相关文章

  • k8s之三、pod 生命周期/ 探针/ 调度策略/ 副本ReplicaSet / 控制器Deployment

    pod 生命周期官方文档 https kubernetes io zh cn docs concepts workloads pods pod lifecycle 一 容器初始化 创建当前pod容器前 先创建 依赖的其他 container
  • python打包后打开闪退问题解决方法总结

    最近写了一个python项目 今天打包后却发现没有反应 查了一些资料说在程序最后加一个input输入语句可以停留在这里 查看看到报错原因 我加了input语句之后执行下面指令进行打包 pyinstaller F hidden import
  • 整型有哪几种形式?各种形式有什么区别?

    整型有哪几种形式 C 中提供的整数类型有三种 int long short 每种类型又分为有符号和无符号两种类型 有符号整数既可以表示非负整数 又可以表示负整数 但是 无符号整数不能表示负数 只能表示非负整数 一 无符号整数 在内存中 in
  • 素数环

    昨天晚上 突然想读刘汝佳老师书中的例题 素数环 但是突然自己就有了思路 于是便自己实现了一下 但是 由于昨晚时间比较晚 程序是写完了 但是没调试出来 今天一大早就开始调试 花了半小时终于调试出来了 好开心 中心思想是 回溯 上代码 incl

随机推荐

  • sqli-labs布尔盲注和时间盲注相结合的脚本实现

    import time import requests 定义一个变量 用于存放cookie值 HEADER cookie Idea 69a0360c 059291e0 9967 4fe4 bb5e 2524cdcf69d4 security
  • 多元共进|探索社区故事,助力开发者成长

    技术社区中的多元交流 带来丰富的灵感思维 为开发者的发展成长注入不竭的动力 谷歌凭借多种开发者生态项目和社区活动 辅助开发者在学习和成长的道路上稳步前行 中国的开发市场目前正处于全球视野中的重要位置 与各地的开发者交流互动也成为了中国开发者
  • 利用leapmotion实现抓取一个立方体

    1 基础设置 2 拖进来LeapHandController 显示为蓝色 其中 Edit Time Pose选择的是不同的模式 是桌面模式还是VR模式 3 拖进来HandModels 此部分为手势模型 为新建空物体 然后加上Hand Mod
  • 关于visual studio中的$(ConfigurationName)疑问

    关于visual studio中的 ConfigurationName 疑问 2012 12 02 16 09 15 转载 标签 it 分类 程序员之路 关于vs中的各种路径的值de查看方法 来源 http social msdn micr
  • Python---三大流程控制

    三大流程控制语句 1 顺序 按顺序去执行步骤 是最基本的代码执行规则 不做过多的解释 2 分支 单分支 if 条件 满足条件做什么 双分支 if 条件 满足条件做什么 else 不满足条件做什么 三元运算符 双份支的简化版 result 满
  • 关于scanf和printf的一些问题&&EOF和~的问题

    1 scanf和printf的返回值 在C语言中 scanf和printf这两个函数是标准输入输出库中的函数 它们在使用时不返回具体的值 而是通过输入输出参数来完成相应的功能 scanf函数 scanf函数用于从标准输入读取数据并根据提供的
  • KNN 原理及参数总结

    文章目录 前言 1 KNN 原理 2 KNN 优缺点 3 KNN 算法三要素 4 KNN 算法实现 5 sklearn实现KNN算法 前言 针对一个完整的机器学习框架目前还没有总结出来 所以目前只能总结每一个单独的算法 由于现在研究的重点是
  • 详解虚短、虚断以及在运算放大器中的应用

    详解虚短 虚断以及在运算放大器中的应用 一 运算放大器 运算放大器 后续简称运放 是一种集成电路 内部有很多三极管类晶体管的组合 外围接很少的电子元器件就能够实现放大信号的作用 并且信号干净 漂亮 1 1 开环 闭环 运算放大器电路 开环电
  • 2021年新版-编程基础训练32题-附提示和答案

    2021年新版 编程基础训练32题 附提示和答案 1 用级数法求圆周率 题目 圆周率十分重要 不仅仅是在数学理论上 即便在千年前的古代 工程上的需求 也迫切需要我们知道圆周率的尽量精确的数值 求圆周率 有很多种方法 级数法就是简便易行的方法
  • 牛客网Python篇入门编程习题

    目 录 一 输入输出 二 类型转换 三 字符类型 四 列表类型 五 运算符号 六 条件语句 七 循环语句 八 元组类型 九 字典类型 十 内置函数 十一 面向对象 十二 正则表达 本文题库非常适合刚刚接触Python编程的同学 有兴趣的同学
  • STlink V2 烧录器使用教学 【STM32篇】

    STlink V2 是一款支持STM32 STM8 烧录的常规工具 本帖主要讲解STM32 的烧录过程 STM32有2种烧录接口 分别为古老的Jtag接口和目前最常规的SWD接口 由于SWD只需要4条线就能烧录 目前STM32硬件工程师用S
  • Unity使用C#实现简单Scoket连接及服务端与客户端通讯

    简介 网络编程是个很有意思的事情 偶然翻出来很久之前刚开始看Socket的时候写的一个实例 贴出来吧 Unity中实现简单的Socket连接 c 中提供了丰富的API 直接上代码 服务端代码 Thread connectThread 当前服
  • idea 编码扫描插件_4款好用的IDEA插件

    刚开始安装使用的IDEA是没有灵魂的 所以我们要通过插件来给 它注入灵魂 Codota 这是一款代码提示工具 根据你敲击的代码进行提示 这样再敲一些长代码时会方便很多 安装方法 点击file gt settings 选择plugins 搜索
  • 悟空CRM9从零开始搭建详细步骤——肯定成功

    悟空CRM9从零开始搭建详细步骤 欢迎留言 欢迎各位一起加入开源 愿意共享分享学习经验 特别感谢打赏点赞的朋友 我们一起努力分享更多学习经验吧 可参考其他论坛 码云https gitee com wukongcrm 72crm java 悟
  • 用户态--fork函数创建进程

    我们一般使用Shell命令行来启动一个程序 其中首先是创建一个子进程 但是由于Shell命令行程序比较复杂 为了便于理解 我们简化了Shell命令行程序 用如下一小段代码来看怎样在用户态创建一个子进程 include
  • 网上经常看到的冒泡排序的动图如何制作

    今天博主想要和大家分享如何实现动态图 经常在其他博主的文章中可以看到各式各样的动图 搜索一下 网上冒泡排序的动图怎么制作出来 可以看到 很迷 全是告诉冒泡排序的原理 以及动图解析 并没有告知动图是如何制作的 结合博主目前正在学习的前端技术
  • Linux Ubuntu16.04 安装lmdb问题

    LMDB的全称是Lightning Memory Mapped Database 快如闪电的内存映射数据库 它的文件结构简单 包含一个数据文件和一个锁文件 LMDB文件可以同时由多个进程打开 具有极高的数据存取速度 访问简单 不需要运行单独
  • ubuntu下新建txt文档的快捷方式

    进入模板文件夹 Templates 右键打开终端 输入如下命令 sudo gedit txt文档 txt 点击右上角保存 退出 即可通过右键新建txt模板
  • Spring Cache缓存注解

    目录 Spring Cache缓存注解 Cacheable 键生成器 CachePut CacheEvict Caching CacheConfig Spring Cache缓存注解 本篇文章代码示例在Spring Cache简单实现上的代
  • 单片机蓝桥杯——DS1302

    1 原理 对 DS1302的操作就是对其内部寄存器的操作 DS1302内部共有12个寄存器 其中有 7 个寄存器与日历 时钟相关 存放的数据位为 BCD 码形式 此外 DS1302 还有年份寄存器 控制寄存器 充电寄存器 时钟突发寄存器 及