大家自行了解吧,这里DS1302用的3线串行总线,类似SPI总线
比赛时候提供底层驱动
驱动资料下载传送门2023年蓝桥杯第14届数据包
最重要的是:简单的三线接口,其他的电气特性对于编程来说不重要
说人话:
DS1302 与单片机的连接也仅需要 3 条线:CE 引脚、SCLK 串行时钟
引脚、I/O 串行数据引脚,Vcc2 为备用电源,外接 32.768kHz 晶振,
为芯片提供计时脉冲。
引脚定义:
X1 X2 32.768KHz 晶振管脚
GND 地
CE 复位脚
I/O 数据输入/输出引脚
SCLK 串行时钟
Vcc1,Vcc2 电源供电管脚
引脚说明:
Vcc1:主电源;
Vcc2:备份电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,
当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法。
bit7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中
bit6(RAM/CK): 0表示存取日历时钟数据,为1表示存取RAM数据
bit5至bit1(A4~A0):指示操作单元的地址;
bit0(RD/WR):如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从最低位(0 位)开始。
同样,在紧跟8 位的控制字指令后的下一个 SCLK 脉冲的下降沿,读出 DS1302 的数据,读出的数据也是从最低位到最高位。
说人话:就是发完8字节的控制指令,就可以写数据,或者读数据了,就那么简单
说明 RTC寄存器的前面两列(READ,WRITE),是产品商家提供好的控制字
对 DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有:
7 个寄存器与日历、时钟相关,存放的数据位为 BCD 码形式(因此编程的时候要牵扯到Bcd与Dec的相互转化)。
此外,DS1302 还有,控制寄存器(里面有wp写保护位)、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等,后面这些就不重要了。
下面对部分寄存器某些位说明一下:
寄存器存放的数据位为 BCD 码形式
秒寄存器中:bit7被定义为时钟停止(CH)标志。当该位被设置为逻辑1时,时钟振荡器停止
小时寄存器中:bit7,为1就是12小时模式,为0就是24小时模式,如果是12小时模式,bit5为1就是PM,为0就是AM
控制寄存器:bit7(WP)写保护位,为1禁止写,为0可以写。
这里大家不必担心,往里面写会不小心写到某些特殊的位上,进而,造成不必要的现象错误
比如:
bcd和dec相互转化:
#define DecToBcd(dec) ((dec/10)*16+(dec%10))
#define BcdToDec(bcd) ((bcd/16)*10+(bcd%16))
通过单片机向DS1302写入时间23h:59m:54s:
void SetClockTask(u8 hour,u8 min,u8 sec)
{
Write_Ds1302_Byte(0x8e,0x00);//关闭写保护
Write_Ds1302_Byte(0x84,DecToBcd(hour));//写小时寄存器
Write_Ds1302_Byte(0x82,DecToBcd(min));//写分钟寄存器
Write_Ds1302_Byte(0x80,DecToBcd(sec));//写秒寄存器
Write_Ds1302_Byte(0x8e,0x80); //打开写保护
}
读出时间:
u8 time_cnt =0 ;
u8 hour,min,sec;
void TimeTask()
{
if(time_cnt>=203){
time_cnt =0;
hour = BcdToDec(Read_Ds1302_Byte(0x85));
min = BcdToDec(Read_Ds1302_Byte(0x83));
sec = BcdToDec(Read_Ds1302_Byte(0x81));
}
}
(十三)类SPI总线-DS1302
----- 如有错误欢迎大家批评指正!!!