【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,则不进行初始化,直接运行下面的程序。
主函数如下:
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();
}
}
仿真结果,第一次运行时按照初始化设定的时间运行;第二次运行时按照当前时间运行。