【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数据端口。

三、软件设计及结果

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

主函数如下:

c 复制代码
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();
	}
}

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

相关推荐
电鱼智能的电小鱼1 小时前
基于 EFISH-SBC-RK3588 的无人机通信云端数据处理模块方案‌
linux·网络·人工智能·嵌入式硬件·无人机·边缘计算
Neil今天也要学习1 小时前
永磁同步电机控制算法-VF控制
单片机·嵌入式硬件
狄加山6752 小时前
STM32 I2C总线通信协议
stm32·单片机·嵌入式硬件
码小文5 小时前
Cadence学习笔记之---原理图设计基本操作
笔记·单片机·学习·硬件工程·pcb工艺
FCC9986 小时前
STM32嵌入式
stm32·单片机·嵌入式硬件
小禾苗_7 小时前
32单片机——GPIO配置步骤
单片机
少年、潜行14 小时前
【开源】STM32HAL库移植Arduino OneWire库驱动DS18B20和MAX31850
stm32·嵌入式硬件·开源·ds18b20·max31850
四夕白告木贞16 小时前
stm32week12
stm32·单片机·嵌入式硬件·学习
美好的事情总会发生16 小时前
晶振不集成到芯片内部的原因分析
嵌入式硬件·硬件工程·智能硬件
xx155802862xx17 小时前
STM32实现2小时延时的最佳方法探讨
单片机·嵌入式硬件