DS1302(时钟寄存器)

DS1302中文资料,带源代码.pdficon-default.png?t=N7T8https://www.yuque.com/office/yuque/0/2023/pdf/22878478/1677912011491-c4ce05ac-c444-4270-b634-d5de874d15d0.pdf?from=https%3A%2F%2Fwww.yuque.com%2Fu22435687%2Fuo7teb%2Fme647k9u3m6xvgkeDS1302中文数据手册.pdficon-default.png?t=N7T8https://www.yuque.com/office/yuque/0/2023/pdf/22878478/1677915816877-18e622fa-803b-4cd6-8625-88f732d100ec.pdf?from=https%3A%2F%2Fwww.yuque.com%2Fu22435687%2Fuo7teb%2Fme647k9u3m6xvgke


编程步骤:

  1. 配置WP位为0(0x8e=0x00)关闭写保护,允许写操作
  2. 根据寄存器的地址写入相应值(BCD码形式写入)
  3. 配置WP位为1(0x8e=0x80,不能写=1)开启写保护,不允许写操作

读地址

0x81

0x83

0x85

0x87

0x89

0x8b

0x8d

写地址

0x80

0x82

0x84

0x86

0x88

0x8a

x08c

/*自定义DS1302读与写函数*/

            /*---DS1302写入和读取时分秒的地址命令---*/
//------------------秒-----分----时---日----月----周-----年-----------//
//时钟数据读取地址{0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; 
//时钟数据写入地址{0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//函数名称:DS1302时分秒时钟设置(初始化)
//入口参数:包括时钟数据的数组
//返回值:无
//函数功能:DS1302时分秒时钟设置,小时的位7是模式位,为1时是12小时制(为0时是24小时制);小时的位5为1时是下午(为0是上午)
void Set_Rtc(unsigned char *ucRtc)
{
    unsigned char Temp;//中间局部变量,存放时间
    
    Write_Ds1302_Byte(0x8e,0x00);//允许写操作(关闭写保护),使wp位为0
    
    Temp=(((ucRtc[0]/10)<<4)|0x80)|(ucRtc[0]%10);//(12小时制,将位7置1)数据的第0个元素,存放的是小时,用BCD码的形式存储
    Write_Ds1302_Byte(0x84,Temp);//写入到小时寄存器中
    Temp=((ucRtc[1]/10)<<4)|(ucRtc[1]%10);//数据的第1个元素,存放的是分钟,用BCD码的形式存储
    Write_Ds1302_Byte(0x82,Temp);//写入到分钟寄存器中
    Temp=((ucRtc[2]/10)<<4)|(ucRtc[2]%10);//数据的第2个元素,存放的是秒,用BCD码的形式存储
    Write_Ds1302_Byte(0x80,Temp);//写入到秒钟寄存器中
    
    Write_Ds1302_Byte(0x8e,0x80);//不允许写操作(打开写保护),使wp位为1
}
//函数名称:读取DS1302时分秒时钟
//入口参数:读取的时分秒数据存放数组指针
//返回值:无
//函数功能:读取DS1302时分秒时钟,小时的位7是模式位,为1时是12小时制(为0时是24小时制);小时的位5为1时是下午(为0是上午)
void Read_Rtc(unsigned char *ucRtc)
{
    unsigned char Temp;//中间局部变量,存放地址
    
    Temp=Read_Ds1302_Byte(0x85);//读取小时BCD数值
    ucRtc[0]=(((Temp&0x1F)>>4)*10)+(Temp&0x0F);//12小时制,读取前应先把小时的高3位清零;并将小时(BCD数值)转换位十进制数值,存储到数组中第一个元素中  
    Temp=Read_Ds1302_Byte(0x83);//读取分钟BCD数值
    ucRtc[1]=((Temp>>4)*10)+(Temp&0x0F);//将读取的分钟(BCD数值)转换位十进制数值,存储到数组中第二个元素中
    Temp=Read_Ds1302_Byte(0x81);//读取秒钟BCD数值
    ucRtc[2]=((Temp>>4)*10)+(Temp&0x0F);//将读取的秒钟(BCD数值)转换位十进制数值,存储到数组中第三个元素中
    
}

注:

  1. 小时寄存器的位7是小时模式控制位(为1是12小时制,为0是24小时制(默认));(当设置为12小时制时,小时寄存器的位5是上午/下午模式控制位(为1是下午,为0是上午),且读取小时寄存器时,寄存器的高3位需清0)。
  2. 一但小时模式寄存器改变,小时数据必须被重新初始化。
  3. 秒钟寄存器的位7是时钟启动控制位(为1时时钟振荡器停止运行,为0时时钟正常启动)
  4. 时钟初始化时,初始化数据要以BCD码格式存储,因此初始化时必须先把十进制数转换为BCD码格式(读取正好相反)
  5. 读取小时寄存器时,小时寄存器的位7是时钟模式控制位,读取时因排除该位。

如有不妥之处,还请指出,如有补充,洗耳恭听。此笔记仅供参考,如若对你有所帮助,点个赞呗谢谢,最后祝愿你旗开得胜,金榜题名。如果有其他相关问题,也可与我联系,我定力所能及的帮助你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值