(十三)类SPI总线-DS1302

文章目录

  • SPI总线篇
  • DS1302特性
  • DS1302说明
  • 典型操作电路以及引脚说明
  • DS1302的控制字
  • 如何读写DS1302
  • DS1302常用寄存器
  • DS1302原理图
  • DS1302的应用
  • 现象展示


SPI总线篇

大家自行了解吧,这里DS1302用的3线串行总线,类似SPI总线
比赛时候提供底层驱动
驱动资料下载传送门2023年蓝桥杯第14届数据包


DS1302特性

(十三)类SPI总线-DS1302_第1张图片
最重要的是:简单的三线接口,其他的电气特性对于编程来说不重要


DS1302说明

(十三)类SPI总线-DS1302_第2张图片

说人话:

  1. 内含有一个实时时钟/日历和 31 字节静态 RAM
  2. 可通过简单的串行接口与单片机进行通信
  3. 可提供:
    —秒分时日日期月年的信息
    —每月的天数和闰年的天数可自动调整
    —可通过 AM/PM 指示决定采用 24 或 12 小时格式
    —保持数据和时钟信息时功率小于 1mW

典型操作电路以及引脚说明

(十三)类SPI总线-DS1302_第3张图片

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 提供结束单字节或多字节数据传输的方法。


DS1302的控制字

(十三)类SPI总线-DS1302_第4张图片

bit7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中
bit6(RAM/CK): 0表示存取日历时钟数据,为1表示存取RAM数据
bit5至bit1(A4~A0):指示操作单元的地址;
bit0(RD/WR):如为0,表示要进行写操作,为1表示进行读操作。

如何读写DS1302

(十三)类SPI总线-DS1302_第5张图片

(十三)类SPI总线-DS1302_第6张图片

控制字总是从最低位开始输出
在控制字指令输入后的下一个 SCLK 时钟的上升沿时,数据被入 DS1302,数据输入从最低位(0 位)开始。

同样,在紧跟8 位的控制字指令后的下一个 SCLK 脉冲的下降沿出 DS1302 的数据,读出的数据也是从最低位到最高位

说人话:就是发完8字节的控制指令,就可以写数据,或者读数据了,就那么简单

DS1302常用寄存器

(十三)类SPI总线-DS1302_第7张图片
说明 RTC寄存器的前面两列(READ,WRITE),是产品商家提供好的控制字

对 DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有:
7 个寄存器与日历、时钟相关,存放的数据位为 BCD 码形式(因此编程的时候要牵扯到Bcd与Dec的相互转化)
此外,DS1302 还有,控制寄存器(里面有wp写保护位)、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等,后面这些就不重要了。


下面对部分寄存器某些位说明一下:

(十三)类SPI总线-DS1302_第8张图片

寄存器存放的数据位为 BCD 码形式

秒寄存器中:bit7被定义为时钟停止(CH)标志。当该位被设置为逻辑1时,时钟振荡器停止

小时寄存器中:bit7,为1就是12小时模式,为0就是24小时模式,如果是12小时模式,bit5为1就是PM,为0就是AM

控制寄存器:bit7(WP)写保护位,为1禁止写,为0可以写。

这里大家不必担心,往里面写会不小心写到某些特殊的位上,进而,造成不必要的现象错误
比如:
(十三)类SPI总线-DS1302_第9张图片


DS1302原理图

(十三)类SPI总线-DS1302_第10张图片


DS1302的应用

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



----- 如有错误欢迎大家批评指正!!!

你可能感兴趣的:(蓝桥杯电子类,蓝桥杯,单片机,DS1302)