『51单片机』 DS1302时钟_带ds1302时钟芯片的单片机

DS1302 ③个部分

首先这个芯片它有八个引脚大致分为③个部分如下↓

第一部分

如上图所示⇢就是我们电源部分的引脚。

其中电源部分的引脚第一个就是(Vcc2)是主电源和我们单片机连接到一起的,然后还有一个电源是(Vcc1)是备用电源。

🍈注⇢它的这个引脚命名也是比较奇特的,一般的人都会觉得Vcc1才是主电源。然后(Vcc2)是备用电源。实际上在这个电路当中它们两是相反的。GND(地)就不用多说了和主电源连接在一起的,给芯片供电。

  • Vcc2就和我们单片机的电源连接在了一起。
  • Vcc1就和我们这个备用电池连接在了一起。

在Vcc1中上面是正极。正极接到了Vcc1,负极接地。

那么有了这个主电源和这个备用电源就可以保证了我们这个时钟芯片的这个电源是非常的充分了。在上电的时候Vcc2当做电源,一旦掉电就切换到备用电池,保证它还能够正常工作。


开发板DS1302原理图

🍏注⇢在上述的原理图当中我们可以看到开发板手册这里的Vcc1(备用电源)是并没有接的,那么在我们开发板上的这个是没有接这个备用电池的。所以,我们这里掉电继续走时的现象是看不到了的。所以说我们这个代码断电之后它的这个时钟也会停止。当然这个并不是程序的问题是我们硬件并没有接上备用电池。


第二部分

x1和x2固定的接的就是我们的一个晶振(频率32.768KHZ),那么为什么是这个数呢?就是因为在我们通用有关的使用情况之下这个实时时钟都是这个32.768KHZ的晶振。

因为这个对于这个实时时钟来说是方便且精度比较高的,就像是我们单片机的串口一样为什么要使用11.0592KHZ一样比较合适保证精度。晶振这个东西就是给我们实时时钟的系统提供了一个稳定的实时脉冲系统提供1HZ的标准频率,因为我们需要计时的。那么有了这两部分的话我们芯片就可以自己进行独立工作了,把里面的这些时钟呢就可以运行了。

第三部分

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于51单片机DS1302时钟模块使用代码示例: ```c #include <REG52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RST = P3^4; sbit DAT = P3^5; sbit CLK = P3^6; // 延时函数 void Delay(uint i) { while(i--); } // 向DS1302写入一个字节 void DS1302_WriteByte(uchar dat) { uchar i; for (i = 0; i < 8; i++) { DAT = dat & 0x01; CLK = 0; CLK = 1; dat >>= 1; } } // 从DS1302读取一个字节 uchar DS1302_ReadByte() { uchar i, dat = 0; for (i = 0; i < 8; i++) { dat >>= 1; if (DAT) dat |= 0x80; CLK = 0; CLK = 1; } return dat; } // 启动DS1302时钟 void DS1302_Start() { RST = 1; CLK = 1; _nop_(); _nop_(); _nop_(); RST = 0; DS1302_WriteByte(0x8e); DS1302_WriteByte(0x00); RST = 1; } // 停止DS1302时钟 void DS1302_Stop() { RST = 0; CLK = 0; _nop_(); _nop_(); _nop_(); RST = 1; DS1302_WriteByte(0x8e); DS1302_WriteByte(0x80); RST = 1; } // 写入DS1302时间 void DS1302_WriteTime(uchar year, uchar month, uchar day, uchar hour, uchar minute, uchar second) { DS1302_Start(); DS1302_WriteByte(0xbe); DS1302_WriteByte(second); DS1302_WriteByte(minute); DS1302_WriteByte(hour); DS1302_WriteByte(day); DS1302_WriteByte(month); DS1302_WriteByte(year); DS1302_Stop(); } // 读取DS1302时间 void DS1302_ReadTime(uchar *year, uchar *month, uchar *day, uchar *hour, uchar *minute, uchar *second) { DS1302_Start(); DS1302_WriteByte(0xbf); *second = DS1302_ReadByte(); *minute = DS1302_ReadByte(); *hour = DS1302_ReadByte(); *day = DS1302_ReadByte(); *month = DS1302_ReadByte(); *year = DS1302_ReadByte(); DS1302_Stop(); } void main() { uchar year, month, day, hour, minute, second; DS1302_WriteTime(0x21, 0x10, 0x13, 0x10, 0x30, 0x00); while (1) { DS1302_ReadTime(&year, &month, &day, &hour, &minute, &second); printf("20%d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second); Delay(1000); } } ``` 在上述代码中,定义了DS1302的RST、DAT、CLK引脚,以及自定义了延时函数`Delay`。然后定义了向DS1302写入一个字节的函数`DS1302_WriteByte`,从DS1302读取一个字节的函数`DS1302_ReadByte`,启动DS1302时钟的函数`DS1302_Start`,停止DS1302时钟的函数`DS1302_Stop`,写入DS1302时间的函数`DS1302_WriteTime`,以及读取DS1302时间的函数`DS1302_ReadTime`。 在`main`函数中,首先调用`DS1302_WriteTime`函数设置初始时间,然后通过`DS1302_ReadTime`函数读取当前时间,并通过串输出。最后通过`Delay`函数延迟1秒,实现时钟的运行。需要注意的是,DS1302时钟模块的时间格式为BCD码,需要进行转换才能得到实际的时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值