【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();
	}
}

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

相关推荐
芯联智造4 小时前
【stm32简单外设篇】- WS2812单线地址式 RGB 灯带
c语言·stm32·单片机·嵌入式硬件
7yewh7 小时前
jetson_yolo_deployment 02_linux_dev_skills
linux·python·嵌入式硬件·yolo·嵌入式
香水5只用六神11 小时前
【DMA】存储器到外设模式实验2
c语言·git·stm32·单片机·嵌入式硬件·github·visual studio
forAllforMe12 小时前
用STM32+LAN9252实现etherCAT 从站IO控制
stm32·单片机·嵌入式硬件
AnalogElectronic12 小时前
RP2040学习4,LED点亮,OLED显示,DHT11温湿度传感器数据读取
单片机·嵌入式硬件·学习
LCG元12 小时前
系统冗余设计:STM32F7双看门狗+电源监控,提高可靠性
stm32·单片机·嵌入式硬件
豆豆饿啦13 小时前
【瑞萨AI挑战赛】#01 快速开始
嵌入式硬件·mcu·物联网·iot
豆豆饿啦13 小时前
【瑞萨AI挑战赛】#02 DL任务说明及训练
人工智能·嵌入式硬件·mcu·物联网·iot
国科安芯14 小时前
抗辐照加固CAN FD芯片的商业航天与车规级应用解析
科技·嵌入式硬件·安全·fpga开发·安全威胁分析
GodKK老神灭15 小时前
CMSIS-DAP协议关键命令完整数据包示例详解
单片机·keil