STC15F2K60S2(DS1302)

使用方法

使用三条线与单片机连接:时钟线(SCK)、数据线(SDA)和复位线(RST)

通过RST引脚使能后,移位寄存器单元会在SCLK同步脉冲信号的控制下从I/O上串行接收8位指令字节,然后将8位指令字节进行串并转换并送至ROM指令译码单元。由ROM指令译码单元对8位指令字节进行译码,以决定内部寄存器的地址以及读写状态。然后在接下来的SCLK同步脉冲信号的控制下将8位数据写进或者读出相应的寄存器。数据传送也可以采用多字节方式。

写操作:向 DS1302 的寄存器写入时间数据

读操作:从 DS1302 的寄存器读取时间数据

引脚说明

VCC1:备用电源引脚,用于在主电源失效时维持芯片运行。

VCC2:主电源引脚。

X1、X2:晶振输入引脚,通常连接外部32.768kHz晶振。

RST:复位/使能引脚,用于控制芯片的复位和使能状态。

CE:片选引脚,低电平有效,用于选中芯片。

I/O:数据输入输出引脚,用于传输数据。

SCLK:串行时钟输入引脚,为通信提供时钟源。

代码

#include "SMG.h"
#include <STC15F2K60S2.H>
// 初始化时间值(秒、分、时、日、月、周、年)
unsigned char shijian[7] = {5, 3, 13, 20, 3, 4, 25};
// 存储读取的时间值
unsigned char Get_Time[7];

sbit SCK = P1 ^ 7; // 时钟线
sbit SDA = P2 ^ 3; // 数据线
sbit RST = P1 ^ 3; // 复位线

// 写入单个字节到 DS1302
void Write_Ds1302(unsigned char temp)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        SCK = 0;
        SDA = temp & 0x01;
        temp >>= 1;
        SCK = 1;
    }
}

// 写入 DS1302 的特定寄存器
void Write_Ds1302_Byte(unsigned char address, unsigned char dat)
{
    RST = 0;
    SCK = 0;
    RST = 1;
    Write_Ds1302(address);
    Write_Ds1302(dat);
    RST = 0;
}

// 从 DS1302 读取单个字节
unsigned char Read_Ds1302_Byte(unsigned char address)
{
    unsigned char i, temp = 0x00;
    RST = 0;
    SCK = 0;
    RST = 1;
    Write_Ds1302(address);
    for (i = 0; i < 8; i++)
    {
        SCK = 0;
        temp >>= 1;
        if (SDA)
            temp |= 0x80;
        SCK = 1;
    }
    RST = 0;
    SCK = 0;
    SCK = 1;
    SDA = 0;
    SDA = 1;
    return (temp);
}

// 初始化 DS1302
void DS_init(void)
{
    unsigned char i, add;
    add = 0x80;                    // 时间寄存器起始地址
    Write_Ds1302_Byte(0x8E, 0x00); // 关闭写保护
    for (i = 0; i < 7; i++)
    {
        Write_Ds1302_Byte(add, (shijian[i] / 10 << 4) | (shijian[i] % 10)); // 写入时间值
        add += 2;
    }
    Write_Ds1302_Byte(0x8E, 0x80); // 开启写保护
}

// 读取 DS1302 的时间
void DS_get(void)
{
    unsigned char i, add,dat;
    unsigned char Add_Resses[7] = {
        0x81,      // 秒寄存器地址
        0x83,      // 分寄存器地址
        0x85,      // 时寄存器地址
        0x87,      // 日寄存器地址
        0x89,      // 月寄存器地址
        0x8B,      // 星期寄存器地址
        0x8D      // 年寄存器地址
    };
    for (i = 0; i < 7; i++)
    {
        add = Add_Resses[i];
        dat = Read_Ds1302_Byte(add);            // 读取时间值
        Get_Time[i] = ((dat & 0xF0) >> 4) * 10 + (dat & 0x0F); // 转换为十进制格式
    }
}
//显示
void DS1302()
{
    // 读取时间
    DS_get();
    SMG_Show_Tiam(Get_Time[2],Get_Time[1],Get_Time[0]);
}

操作视频

https://www.bilibili.com/video/BV1AkXHYuEpJ?vd_source=b10b3445cdc8080c1d316e6f9a6245a0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值