目录
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片。

DS1302电路图如下:

其内部结构框图如下:

| 引脚名 | 作用 |
|---|---|
| VCC2 | 主电源 |
| VCC1 | 备用电池 |
| GND | 电源接地 |
| X1,X2 | 32.768kHz晶振 |
| CE | 芯片使能 |
| IO | 数据输入/输出 |
| SCLK | 串行时钟 |
相关寄存器如下:

其中,第一行的CH表示时钟暂停控制位,置1表示时钟暂停,置0表示时钟静止;倒数第二行的WP表示write protect(写保护),置1表示写入操作无效;最后一行的TCS用于控制涓流充电,一般不进行设置,其他部分放在第四章进行介绍。
命令字如下:

举个例子,对时钟操作、秒地址操作、读:
10000001(0x81)
对时钟操作、秒地址操作、写:
10000000(0x80)
这与上方第三章寄存器中的读地址和写地址是对应的。
时序图:

三个引脚:CE(使能端)、SCLK(时钟)和I/O(数据)。
规定:在时钟的上升沿,I/O口的数据将会被写入,在时钟的下降沿,时钟芯片的数据将会被读出。
Step1:将CE置1;
Step2:命令字(I/O)发两个字节:第一个字节是命令字(先发最低位R/W),第二个字节是数据;【一位一位依次发送】
Step3:SCLK给上升沿,将命令字最低位写入单片机;
Step4:将SCLK置回0;
Step5:SCLK给上升沿,将命令字次低位写入单片机;
Step6:将SCLK置回0;
…(依次循环8次)
Step7:SCLK给上升沿,将数据最低位写入单片机;
Step8:将SCLK置回0;
Step9:SCLK给上升沿,将数据次低位写入单片机;
Step10:将SCLK置回0;
…(依次循环8次)
Step11:将CE置0;
(每个上升沿写入数据)
代码示例:
//单字节写,Command为命令字(地址),Data为要写入的数据
void DS1302_WriteByte(unsigned char Command,Data){
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++){
DS1302_IO=Command&(0x01<<i);//0000 0001 左移
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++){
DS1302_IO=Data&(0x01<<i);//0000 0001 左移
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
Step1:将CE置1;
Step2:命令字(I/O)发两个字节:第一个字节是命令字(先发最低位R/W),第二个字节是数据;【一位一位依次发送】
Step3:SCLK给上升沿,将命令字最低位写入单片机;
Step4:将SCLK置回0;
Step5:SCLK给上升沿,将命令字次低位写入单片机;
Step6:将SCLK置回0;
…(依次循环8次)
Step7:SCLK给下降沿,将数据最低位读出;
Step8:将SCLK置回0;
Step9:SCLK给下降沿,将数据次低位读出;
Step10:将SCLK置回0;
…(依次循环8次)
Step11:将CE置0;
Step12:将I/O置0;
(每个下降沿读出数据)
【注意】:需要注意的是,从上述时序图中可以看出,单字节写(Write)有16个脉冲,而单字节读(Read)只有15个脉冲,因为当最后一个命令字的上升沿之后的下降沿数据马上就读出来了,如下图所示。

因此这里编写代码时需要调整顺序,对DS1302_SCLK先给0再给1,正好进行切分:

代码示例:
//DS1302读一个字节,Command为命令字(地址),Data为读出的数据
unsigned char DS1302_ReadByte(unsigned char Command){
unsigned char i,Data=0x00;
DS1302_CE=1;
for(i=0;i<8;i++){
DS1302_IO=Command&(0x01<<i);//0000 0001 左移
// DS1302_SCLK=1;
// DS1302_SCLK=0;
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++){
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){Data=Data|(0x01<<i);}
}
DS1302_CE=0;
DS1302_IO=0;//清零
return Data;
}
Question:在利用DS1302进行操作时,假设我们对秒(0x80)写入初始值1(Data=0x01),每隔一秒它会进行+1,但是当它加到9之后,马上变成16了,这是什么原因呢?
(1——>2——>…——>8——>9——>16——>17——>…)
这里要引入BCD码的概念。
DS1302寄存器数据不是以二进制进行存储的,而是以BCD码进行存储的。
BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数。
例:0001 0011表示13,1000 0101表示85,0001 1010不合法(因为1010无法表示十进制数)
在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
现象的原因:在BCD码中,0000 1001表示数字9,而0001 0000表示数字10,而0001 0000转为十进制数字为16,因此才会在这里造成突变。
再回过头来看一下寄存器,0-3位存的是秒,4-6位存的是10秒。

DS1302写数据时需要将十进制数据转为BCD码的形式,读数据时需要将BCD码转为十进制数据形式。
BCD码转十进制:DEC=BCD/16*10+BCD%16; (2位BCD)
十进制转BCD码:BCD=DEC/10*16+DEC%10; (2位BCD)
解释:BCD/16表示将数据的高四位取出(作为十位),BCD%16表示将低四位取出(作为个位)。
参考:以上相关图片和资源均参考自DS1302时钟芯片的数据手册,关于中英文相关数据手册可以参考资源:https://download.csdn.net/download/didi_ya/85170337
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
电脑上可以截取图片吗?如果可以,该如何操作呢?相信很多小伙伴都只知道一两种截图的方式,知道的并不全面。其实,电脑上有多种方式截图的,而且非常方便。电脑怎么截图?今天我们就来教大家如何使用电脑截取图片的8种常用方式!操作环境:演示机型:Delloptiplex7050系统版本:Windows10方法一:系统自带截图具体操作:同时按下电脑的自带截图键【Windows+shift+S】,可以选择其中一种方式来截取图片:截屏有矩形截屏、任意形状截屏、窗口截屏和全屏截图。 方法二:QQ截图具体操作:在电脑登录QQ,然后同时按下【Ctrl+Alt+A】,可以任意截图你需要的界面,可以把截图的页面直接下载,
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
1.Scenes游戏场景文件夹用于放置unity的场景文件 2.Plugins插件文件夹用于放置unity的依赖文件,例如dll 3.Scripts脚本文件夹用于放置unity的c#脚本文件 4.Resources游戏资源文件夹用于放置unity的各种游戏资源,比如images,prefabs,同时只有放到Resources文件夹的游戏资源才能使用Resource.load(资源路径不加后缀)加载到游戏内存中进行使用 5.EditorUnity编辑器扩展脚本文件夹usingUnityEditor;这个名称空间就是Unity编辑器的名称空间这个名称空间提供了扩展Unity编辑器的各种类 【你所有
FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺
目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 编辑 74HC595串行转并行点亮LED灯 程序实现 Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO 主机输入/从机输出MOSI 主机输出/从机输入SCLK 串行时钟CS或