实时时钟芯片DS1307的使用及驱动代码

news/2025/2/21 13:53:42/

DS1307实时时钟芯片的介绍及驱动代码

目录

一、DS1307是什么?

二、DS1307的功能

三、DS1307的寄存器

四、代码

1.读出数据

2.写入数据

3.时间初始化设置

4.获取当前时间

五、注意事项

总结


一、DS1307是什么?

DS1307是一款基于IIC总线接口的实时时钟芯片,可以独立于MCU工作,芯片具有备用电源自动切换功能,可以在主电源掉电或其他一些恶劣环境下保证系统时钟的准确。

二、DS1307的功能

  1. DS1307具有产生时、分、秒、日、月、年等功能,闰年可自动调整,日历和时钟数据以BCD码的方式存放在片内的寄存器上。
  2. 片内集成了56字节的具有掉电后电池保持的RAM数据存储器,可以用来保存一些关键数据,
  3. 芯片具有掉电检测和自动切换电池供电功能,当DS1307靠后备电池维持工作时,拒绝CPU对其的读出和写入操作。

三、DS1307的寄存器

DS1307片内有多个时间保存寄存器,单片机就是通过读取这些寄存器得到时间和日期相关的数据的,其中有8个寄存器专门用来存储时间信息,另外56个字节的RAM可以供用户自由使用。

  1. 时间和日历信息在时间保存寄存器上的存放是以BCD码的形式存放的,以分钟寄存器为例,分的十位存放寄存器的高四位,分的个位存放在寄存器的低四位。
  2. 日期和星期寄存器的值会在每天的午夜递增,我们需要在程序中指定星期与星期寄存器的对应关系,也就是说把星期寄存器值为1时定义为星期一,那么当读取的值为1时就应当是星期日。
  3. 寄存器0(地址00h)的第7位是时钟停止位CH。当这一位置1时,时间振荡器会被禁止,该位清零时,振荡器会使能。
  4. 芯片在第一次上电时,时间和日期会被复位成:01月01日00年、星期01、00时00分00秒,秒寄存器的CH位会被设定为1。我们在对时间值进行设定时,需将CH位清零以使能振荡器。
  5. DS1307可以运行在12小时模式或24小时模式。小时寄存器的bit6是定义12小时或24小时模式选择位。当该位置1时,时钟被定义为12小时模式,清零时为24小时模式。
  6. DS1307可以设定为12小时模式下,小时寄存器的bit5是AM/PM位,其值为0时表示AM,为1时表示PM;在24小时模式下bit5是20小时位(20-23)。

四、代码

1.读出数据

/*
*********************************************************************************************************
*	函 数 名: uint8_t DS1307_Read(uint8_t address)
*	功能说明: 向DS1307寄存器读取数据
*	形    参:寄存器地址
*	返 回 值: 读出的数据
*********************************************************************************************************
*/
uint8_t DS1307_Read(uint8_t address)
{uint8_t dat;	i2c_Start();i2c_SendByte(0xD0);//发送设备地址,写指令i2c_WaitAck();i2c_SendByte(address);//发送寄存器地址i2c_WaitAck();i2c_Stop();i2c_Start();//重新启动IIC总线i2c_SendByte(0xD1);	//发送设备地址,读指令i2c_WaitAck();dat=i2c_ReadByte(); //读一个字节数据i2c_NAck();	i2c_Stop();return dat;
}

2.写入数据

/*
*********************************************************************************************************
*	函 数 名: DS1307_Wirte(uint8_t address , uint8_t dat)
*	功能说明: 向DS1307寄存器写数据
*	形    参:address:寄存器地址,dat:要写入的数据
*	返 回 值: 无
*********************************************************************************************************
*/
void DS1307_Wirte(uint8_t address , uint8_t dat)
{ i2c_Start();i2c_SendByte(0xD0);//发送设备地址,写指令i2c_WaitAck();i2c_SendByte(address);//发送寄存器地址i2c_WaitAck();i2c_SendByte(dat);//写一个字节数据i2c_WaitAck();i2c_Stop();	
}

3.时间初始化设置

/*
*********************************************************************************************************
*	函 数 名: void DS1307_Init_Time(void)
*	功能说明: 第一次上电时,需要初始化时间,初始化一次后就不必重复初始化
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void DS1307_Init_Time(void)
{if(DS1307_Read(FLAG_ADDR)!=FLAG_VAL)//如果未初始化,执行初始化时间{DS1307_Set_Time(2023,2,16,19,02,00,4);//2023年2月16日 17:50:00 星期四printf("时间初始化完成,flag=%d\r\n",DS1307_Read(FLAG_ADDR));}	else{printf("时间已初始化过,flag=%d\r\n",DS1307_Read(FLAG_ADDR));}
}
//时间初始化设置
void DS1307_Set_Time(uint16_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec,uint8_t week)
{year-=2000;//年默认2000年开始if(year > 100) year = 0;//十进制转为BCD码year = ((year /10) << 4) + year %10;mon  = ((mon  /10) << 4) + mon  %10;day  = ((day  /10) << 4) + day  %10;week = ((week /10) << 4) + week  %10;hour = ((hour /10) << 4) + hour %10;min  = ((min  /10) << 4) + min  %10;sec  = ((sec  /10) << 4) + sec  %10;//写入寄存器,同时标记一个地址DS1307_Wirte(FLAG_ADDR,FLAG_VAL);   //写入已经设置时间标志		DS1307_Wirte(0x00,sec);    //设置秒DS1307_Wirte(0x01,min);    //设置分DS1307_Wirte(0x02,hour);   //设置时DS1307_Wirte(0x03,week);   //设置周DS1307_Wirte(0x04,day);    //设置日DS1307_Wirte(0x05,mon);    //设置月	DS1307_Wirte(0x06,year);   //设置年		
}

4.获取当前时间

//获取当前时间
void Get_Now_Time(void)
{uint8_t sec,min,hour,week,day,mon,year;uint8_t i;sec  = DS1307_Read(0x00);min  = DS1307_Read(0x01);hour = DS1307_Read(0x02);week = DS1307_Read(0x03);	day  = DS1307_Read(0x04);mon  = DS1307_Read(0x05);year = DS1307_Read(0x06);//BCD码转十进制date_time.sec  = (sec/16)*10 + sec%16;date_time.min  = (min/16)*10 + min%16;date_time.hour = (hour/16)*10 + hour%16;date_time.day  = (day/16)*10  + day%16;date_time.mon  = (mon/16)*10  + mon%16;date_time.year = (year/16)*10 + year%16 + 2000;date_time.week = (week/16)*10 + week%16;   			
}

五、注意事项

  1. DS1307的工作电压为4.5V-5.5V供电。
  2. I2C总线控制DS1307,用GPIO模拟I2C时序即可。
  3. 时间配置:直接把时间值写入0x00~0x06的时间寄存器。
  4. 时间读取:直接读取0x00~0x06的时间寄存器即可。
  5. 读取时间时发现未走时可能是00h 地址的寄存器第7 位为1,此位为1则芯片未开始工作,即时钟未走时,记得首次上电时把该位清零。
  6. 首次上电设置时间后不必每次上电都再次初始化一下时间,停电后有备用电池,此时不必重写时间单元。

总结

本文简单介绍了DS1307实时时钟芯片的使用,提供了DS1307的驱动程序代码,方便首次使用DS1307的初学者们学习和参考。


http://www.ppmy.cn/news/338092.html

相关文章

虚拟机体验NAS私人云(第四篇):虚拟机安装群晖DSM7.01系统(附赠新版DS918+和DS3615xs启动映像)

文章目录 一、引导文件、系统文件及虚拟机软件选用二、虚拟机网卡设置及数据硬盘选用三、启动项的选择四、登录群晖账户的处理 本系列前三篇博客已经上线有两年时间&#xff0c;在此期间群晖系统发布了重大更新&#xff1a;DSM7.0 版本&#xff0c;是时候我们一起在虚拟机上安装…

Dell r710安装esxi 黑群晖DS3615xs 解决无法分配ip、系统重复还原、端口无法更改的问题

安装黑群晖 使用黑群晖版本为DS3615xs_7.0_41222 1.Esxi虚拟机设置 由于服务器是使用博通网卡 群晖多数版本无数识别&#xff0c;在Esxi虚拟机设置中需把网卡设置成E1000e,否则DHCP很难识别分配IP地址。 2.在安装过程中出现重复还原。 需拔掉外网或使用网口直联安装&#xf…

黑群晖6.1.4-DS3615xs_65217安装使用教程、含下载资源、亲测有效

安装所需硬件条件 黑群晖号称无硬件要求&#xff0c;就像java号称一次编译到处执行一样&#xff0c;打广告骗新手而已&#xff0c;别太当真。 首先&#xff0c;正版的群晖&#xff0c;你肯定就得用他们自己的硬件&#xff0c;该硬件有绝对合适的硬件环境&#xff0c;还有产品识…

GlyphControl: Glyph Conditional Control for Visual Text Generation

GlyphControl: Glyph Conditional Control for Visual Text Generation (Paper reading) Yukang Yang, Microsoft Research Asia, arXiv2023, Cited: 0, Code, Paper 1. 前言 最近&#xff0c;人们对开发基于扩散的文本到图像生成模型的兴趣日益增长&#xff0c;这些模型能够…

【证明】平移和旋转的先后关系

此处的旋转指的是坐标系的旋转。 虽然这个东西土想都是不一样的&#xff0c;但是还是简单证明一下&#xff01;&#xff01; 在一个二维坐标系XOY上存在一点P&#xff08;1,1&#xff09;&#xff0c;先后执行以下两个操作&#xff1a; &#xff08;1&#xff09;沿着x轴平移9…

快手公布于香港联交所主板上市计划详情;木莲庄酒管全线开放加盟合作 | 美通企业日报...

今日看点&#xff1a;快手公布于香港联交所主板上市计划详情&#xff0c;拟融资394.77亿港元。LG Innotek开发业内最高位置识别准确度“数字车钥匙模块”。木莲庄酒店管理集团正式全线开放加盟合作。凤悦酒店及度假村与博思堂达成战略合作。Klook客路旅行获2亿美元E轮融资。博安…

【MySQL】SQL的高阶用法

文章目录 函数聚合函数Count()Max()Min()Sum()Avg() 其他常用函数时间函数字符串函数数学函数 条件查询使用关系运算符查询使用IN关键字查询使用BETWEEN AND关键字查询使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询(模糊查询)使用LIMIT限制查询结果的数量使…

单E1光端机,V.35光端机,以太网光端机介绍及技术指标详解

光猫也称为单端口光端机&#xff0c;是针对特殊用户环境而设计的产品&#xff0c;它利用一对光纤进行单E1或单V.35或单10BaseT点到点式的光传输终端设备。光猫有E1光猫&#xff0c;以太网光猫&#xff0c;V35光端机等&#xff0c;那么&#xff0c;什么是单E1光端机&#xff0c;…