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

这篇具有很好参考价值的文章主要介绍了实时时钟芯片DS1307的使用及驱动代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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可以供用户自由使用。

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

  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的初学者们学习和参考。文章来源地址https://www.toymoban.com/news/detail-448061.html

到了这里,关于实时时钟芯片DS1307的使用及驱动代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DS1302实时时钟

    实时时钟就是一个可以用来计时的芯片,Y3是一个晶振,提供一个时钟基准给DS1302,让DS1302每一秒走时一次。有的实时时钟不需要外接晶振,直接在内部集成了,但蓝桥杯板载的有。 使用的是3线SPI协议,与前面的单总线和IIC协议不一样 VCC1:备用电源,可以在板子断电是依然

    2024年02月05日
    浏览(34)
  • 【Arduino30】DS1302时钟芯片模拟值实验

    DS1302芯片:1片 32.768kHz晶振:1个 面包板:1个 杜邦线:若干 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。 DS1302常用于以下场景: 电子时钟和钟表: DS1302可以通过

    2024年02月09日
    浏览(48)
  • STM32初学-外部RTC时钟芯片DS3231

             RTC(Real_Time Clock) 即实时时钟,它是电子产品中不可或缺的东西。其最直接的作用就是时钟功能。细心的朋友可以发现,当我们的电脑或者手机没联网时,仍然可以正常显示日期与时钟,这就是RTC的功劳。         RTC的运行无需网络连接,只需一个频率固定的振

    2024年02月09日
    浏览(39)
  • 【Arduino 和 DS3231 实时时钟教程】

    在本Arduino教程中,我们将学习如何使用DS3231实时时钟模块。您可以观看以下视频或阅读下面的书面教程。 这里出现的第一个问题是,当Arduino本身具有内置计时器时,为什么我们实际上需要为Arduino项目提供单独的RTC。重点是RTC模块使用电池运行,即使我们重新编程微控制器或

    2024年02月01日
    浏览(24)
  • 【单片机】13-实时时钟DS1302

    (rtc for real time clock) (1)时间点和时间段的概念区分 (2)单片机为什么需要时间点【一定的时间点干什么事情】 (3)RTC如何存在于系统中(单片机内部集成 or 单片机外部扩展【DS1302】) 1.数据手册 DS1302中文数据手册 - 豆丁网 2. SPI数字接口 访问 SPI通信协议【DS1302也使用

    2024年02月07日
    浏览(44)
  • 51单片机(十)DS1302实时时钟

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月03日
    浏览(47)
  • stm32-DS1302时钟模块驱动

    DS1302是时钟芯片 DS1302的寄存器地址定义如下:   单字节读写时序如下图,均为上升沿触发:  由于DS1302时钟芯片不是常用的SPI协议,与SPI协议很像,所以需要初始化普通GPIO口手工实现该协议通信。 设置分别连接DS1302的CE、SCLK、Data口的GPIO,PB8PB9PB10: 打开gpio.h文件,定义结

    2024年02月02日
    浏览(36)
  • 单片机第一季:零基础11——实时时钟DS1302

    目录 1,DS1302 时钟芯片介绍  2,BCD码介绍  3,涉及到的寄存器  3.1,控制寄存器 3.2,日历/时钟寄存器  3.3,DS1302 的读写时序  4,相关代码  这一章我们来学习DS1302 时钟芯片,该芯片是3 线SPI 接口,所以需要使用51单片机的3 个IO 口模拟SPI 时序与DS1302 时钟芯片通信,将时钟

    2024年02月16日
    浏览(55)
  • 基于普中A2实验板,ds18b20温度传感器与ds1302时钟芯片的冲突现象的探讨

    在普中板上进行写较综合的项目时,是否会出现温度传感器经常出错的问题,明明是严格按照时序图所编写的程序就是无法读出正确的值(全为0),或许温度底层在其他工程里能正常运行,而到了某些工程中却总是出错。这些就是我经常遇到的问题。 那么问题的根源是什么

    2024年02月11日
    浏览(38)
  • FPGA通过读写突发对DS1302时钟的配置&驱动

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 4、实时时钟模块:DS1302 要求: 使用 EP4CE6F17C8开发板驱动 实时时钟模块(DS1302 ),并将配置完后的时钟传回到上位机。我们上电后直接对实时时钟进行配置,在按键按下后,向上位机发送我们的时钟数据。 这里我们会先对

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包