【51单片机系列】DS1302时钟模块扩展实验之与EEPROM结合使用只进行一次初始化工作

本文是关于时钟芯片DS1302的扩展实验。


本实验实现的目的:利用AT24C02掉电不丢失的功能,存储数据用来辨别DS1302时钟是否已经初始化,如果初始化就不执行DS1302初始化函数。

一、实验分析

从实验目的分析,当系统第一次运行时,执行DS1302函数,并将一个数据写入到AT24C02的某个地址中;当系统再次运行时,首先将数据从AT24C02的地址中读出来,判断是否已经写入,如果已经写入,则不执行DS1302初始化。

这里设置AT24C02的0x00地址的数据判断是否进行初始化,如果0x00地址的数据是0xff,则初始化,如果是1,则不执行初始化。

整个系统用到的资源有:

  • DS1302时钟芯片;
  • 数码管,用来显示时间;
  • AT24C02,用来记录是否已经初始化;

二、proteus仿真原理图

proteus中仿真原理图如下。P3.4~P3.6口控制时钟模块的复位、时钟和输入/输出端口;P0口通过74HC245控制数码管的段选,P2.2 ~ P2.3通过74HC138译码器控制数码管的位选;P2.1控制EEPROM的SCL时钟端口,P2.0控制EEPROM的SDA数据端口。

DS1302时钟模块扩展实验proteus仿真原理图

三、软件设计及结果

本实验需要导入i2c模块,在主函数中,先读取AT24C02的0x00地址的数据,如果读出的数据是0,则进行初始化,并且将数据1写入到AT24C02的0x00地址;如果读出的数据是1,则不进行初始化,直接运行下面的程序。

主函数如下:

void main()
{
   
	u8 dat;
	dat=AT24C02Read(EN_INIT_ADDR);  // 先读取EEPROM中0x00地址的数据
	if(0xff==dat)  // 如果读出的数据是0xff表示DS1302还没有进行过初始化
	{
   
		AT24C02Write(EN_INIT_ADDR, 0x01);  // 将EEPROM的0x00地址写入数据0x01,然后进行初始化
		DS1302Init();
	}
	while(1)
	{
   
		DataPros();
		DigDisplay();
	}
}

仿真结果,第一次运行时按照初始化设定的时间运行;第二次运行时按照当前时间运行。

DS1302扩展实验判断是否已经初始化仿真结果

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-30 13:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-30 13:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-30 13:52:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-30 13:52:02       20 阅读

热门阅读

  1. Thinkphp 5框架学习

    2023-12-30 13:52:02       45 阅读
  2. js中的 == 比较规则

    2023-12-30 13:52:02       37 阅读
  3. 深度学习:走向智能时代的引擎

    2023-12-30 13:52:02       35 阅读
  4. C语言浮点类型、值和精度范围

    2023-12-30 13:52:02       42 阅读
  5. 油猴脚本开发,之如何添加html和css

    2023-12-30 13:52:02       42 阅读
  6. ArkTS语言基础入门学习-鸿蒙开发

    2023-12-30 13:52:02       36 阅读
  7. 安装驱动导致ubuntu开不了机

    2023-12-30 13:52:02       36 阅读
  8. Linux:多文件编辑

    2023-12-30 13:52:02       40 阅读