DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能
可以把该芯片看成一个小型的单片机,其内部的寄存器不能控制,通过协议与51进行通信
RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片
引脚名 | 作用 | 引脚名 | 作用 |
---|---|---|---|
VCC2 | 主电源 | CE | 芯片使能 |
VCC1 | 备用电源 | IO | 数据输入、输出 |
GND | 电源地 | SCLK | 串行时钟 |
X1、X2 | 32.768kHz晶振 |
在哪 写入 写入什么 -> 单片机
在哪 读取 读取什么 -> 时钟芯片
该寄存器显示了时钟的地址信息,操作时往对应的地址写入值就行,也就是说如果想写入秒,往对应的寄存器写入0x80;表示小时的地址的第7位可选为12小时制还是24小时制,WP是写保护位
时钟暂停标志(CH):
秒寄存器的位7被定义为时钟暂停标志,当此位置1时,时钟振荡器暂停,DS1302进入漏电流小于100nA的低功耗备用模式;当此为置0时时钟开始,初始加电状态未定义
写保护位(WP):
控制寄存器的位7是写保护位,前7位(位0至位6被强制为0且读取时总是读0,在任何对时钟或RAM的写操作以前,位7必须为0;当为高时,写保护位禁止任何寄存器的写操作,初始加电状态未定义;因此,在试图写器件之前应该清除WP位.
该图显示的是命令字,命令字启动每一次数据传输时需要配置,第7位固定为1,如果是0则禁止对DS1302的写入,第6位写1则是读取或写入RAM区,写0则读取或写入时钟,第1~5位是地址,即要操作的地址,秒的地址是从0开始;第0位置1是read,对地址进行读取,置0是write,对地址进行写入
例如要读取月信息,则往命令字寄存器写0x89,如要写入月信息,则往命令字寄存器写0x88,对应了RTC左边的地址
SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口
SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。
SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:
要点:在时钟的上升沿,单片机往时钟芯片写入数据;在时钟的下降沿,时钟芯片往单片机输出数据
在时序图中,只有红色方框框住的是时钟芯片控制的,其余绿色圆形圈住的都是单片机控制的
详细解释:
以写入操作为例:
单片机首先要将CE置高电平,IO口的第一位是命令字的最低位,就是规定本次操作是读还是写,然后SCLK给个上升沿,第一位就被发送出去了,SCLK变回低电平,接着就是下一位A0,同样是上升沿就发送出去,待第一个字节(8位)全部发送出去后,此时便确定了要操作的地址以及操作的模式,是读还是写;
第二个字节便是数据,低地址在前,同样上升沿发送,发送完后,将CE置为低电平,整个写入时序完成
BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数
例:0001 0011表示13,1000 0101表示85,0001 1010不合法
在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
BCD码转十进制:DEC=BCD/16 * 10+BCD%16; (2位BCD)
十进制转BCD码:BCD=DEC/10 * 16+DEC%10; (2位BCD)
因为时钟芯片内存放的是BCD码,所以直接读取出来的话会不准确,要转为十进制来显示
while(1)
{
key = key_down();
if(key == 1) //key1按下,进行模式选择
{ //主要是Mode模式的选择,初始值为0,当key1按下时置1,再一次按下时再置0,便可实现一个按键无论按多少次都是两个状态
if(Mode == 0){Mode = 1; TimeSetSelect = 0;}
else if(Mode == 1){Mode = 0;DS1302_SetTime();}
}
switch(Mode)
{ //对模式进行判断,如果是0则执行TimeShow函数,如果是1则执行TimeSet函数,这样便可一个按键跳到不同的函数中实现不同的功 能
case 0:TimeShow();break;
case 1:TimeSet();break;
}
}