【蓝桥杯单片机进阶强化02】24C02存储器的基本原理与应用

【蓝桥杯单片机进阶强化02】24C02存储器的基本原理与应用

内容来自B站小蜜蜂老师

在这里插入图片描述

一、24C02基础介绍

1.1 AT24C02功能概述

在这里插入图片描述

24C02是一个2K Bit的串行EEPROM存储器,内部含有256个字节。在24C02里面有一个8字节的页写缓冲器。该设备的工作电压为1.8V到6.0V,芯片的第7引脚WP为写保护引脚,将该引脚接地允许正常的读写。

1.2 设备地址

在这里插入图片描述

同样AT24C02也是IIC通信在IIC总线上一次可以同时挂载8个该设备通过A0 A1 A2来进行设备的选择
设备地址可以分为固定地址和可编程两部分 其中固定地址为1010
可编程地址的A0 A1 A2在该平台默认接的低电平 所以进行写操作时地址为0xa0 进行读操作时地址为0xa1

1.3 读写操作中的应答信号

在写操作中,24C02每接收一个8位字节后会产生一个应答信号。在读操作中,24C02在发送一个8位数据后会释放SDA线并监视应答信号。一旦收到应答信号,将继续发送数据。如果主机没有发送应答信号,从机则停止发送数据且等待一个停止信号。

1.4 字节写操作

24C02接收完设备地址后,产生应答信号;然后接收8位内存字节地址,产生应答信号,接着接收一个8位数据,产生应答信号;最后主机发送停止信号,字节写操作结束

1.5 页写操作

24C02有一个8字节的页写缓冲器,也就是说可以一次连续写入8个字节到缓冲器,然后由缓冲器一次性写到EEPROM。页写操作初始化与字节写操作相同,只是主机不会在写完第一个数据后就发送停止信号,而是在24C02应答后,接着发送7个数据。
需要注意的是,24C02接收到每个数据后,其字节地址的低3位会自动加1,高位地址不变,维持在当前页内。当内部产生的字节地址到达该页边界时,随后的数据将写入该页的页首,先前的写入的数据将会被覆盖

1.6 当前地址读操作

24C02内部的地址寄存器会保存着上次读/写操作最后一个地址加1的值。只要芯片有电,该地址就一直保存着。如果上次读/写操作的地址为N,那么当前地址读操作就从N+1开始。当读到最后一个字节(即255处),地址会回转到0

1.7 字节读操作

主机首先发送起始信号,接着发送设备地址和它想要读取的数据内存字节地址,执行一个伪写操作。在24C02应答主机之后,主机重新发送起始信号和从设备地址,进行读操作。24C02响应并发送应答信号,然后输出所要求的一个8位字节数据。主机接收完这个8位数据后,产生一个“非应答”信号,最后发送停止条件,字节读操作结束。

1.8 连续读操作

在24C02发送完一个8位字节数据之后,主机产生一个应答信号来响应,告知24C02要求读取更多的数据,直到读完最后一个数据,主机向24C02发送一个“非应答”信号,然后发送一个停止信号,结束此操作。

二、代码部分

/********************************************
Date:2022-1-14
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************/

#include "reg52.h"
#include "iic.h"

unsigned char dat1 = 0;
unsigned char dat2 = 0; 
unsigned char dat3 = 0;

//共阳数目管段码
//0-f  0xbf代表 -
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
															   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};

//---------------------------------简单延时函数-------------------------
void Delay(unsigned int t)
{
 	while(t--);
}

//-------------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
	 	case 4:P2 = P2| 0x1f; P2 = 0x80; break;
		case 5:P2 = P2| 0x1f; P2 = 0xa0; break;
		case 6:P2 = P2| 0x1f; P2 = 0xc0; break;
		case 7:P2 = P2| 0x1f; P2 = 0xe0; break;
		case 0:P2 = P2| 0X1f; P2 = 0x00; break; //所有锁存器都不选择
	}
}

//----------------------------------系统初始化---------------------------
void InitSystem(void)
{
 	 Init_74HC138(5);
	 P0 = 0x00;			 //关闭继电器与蜂鸣器
	 Init_74HC138(4);
	 P0 = 0xff;   //关闭led
}



//---------------------------------数码管安位显示--------------------------
void SMG_DisplayBit(unsigned char pos ,unsigned char dat)
{
 		Init_74HC138(6);
		P0 = 0x01 << pos ;//位选
		Init_74HC138(7);
		P0 = dat;        //段码
}

//-------------------------------关闭所有数码管---------------------------
void SMG_CLOSEALL(unsigned char dat)
{
	 Init_74HC138(6);
	 P0 = 0xff; //选中所有数码管
	 Init_74HC138(7);
	 P0 = dat; //关闭
}

//----------------------------时间显示函数----------------------------
void Time_Display(void)
{
	 SMG_DisplayBit(0,SMG_Duan[dat1/10]);
	 Delay(100);
	 SMG_DisplayBit(1,SMG_Duan[dat1%10]);
	 Delay(100);
	 
	 SMG_DisplayBit(2,SMG_Duan[16]);
	 Delay(100);
	 SMG_DisplayBit(3,SMG_Duan[dat2/10]);
	 Delay(100);
	 SMG_DisplayBit(4,SMG_Duan[dat2%10]);
	 Delay(100);
	 SMG_DisplayBit(5,SMG_Duan[16]);
	 Delay(100);
	 SMG_DisplayBit(6,SMG_Duan[dat3/10]);
	 Delay(100);
	 SMG_DisplayBit(7,SMG_Duan[dat3%10]);
	 Delay(100);
	 SMG_CLOSEALL(0xff);
	 Delay(100);	 
}


//---------------------------------24C02写操作-----------------------------
void Write_24C02(unsigned char addr,unsigned char dat)
{
	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa0); 	//24C02的写设备地址
	IIC_WaitAck();		//等待从机应答	
	IIC_SendByte(addr); 	//内存字节字节
	IIC_WaitAck(); 		//等待从机应答	
	IIC_SendByte(dat); 	//写入目标数据
	IIC_WaitAck();		//等待从机应答	
	IIC_Stop();		//IIC总线停止信号	
}


//---------------------------------24C02读操作-----------------------------
unsigned char Read_24C02(unsigned char addr)
{
	unsigned char temp; //存储读取数据
	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa0); 	//24C02的写设备地址
	IIC_WaitAck();		//等待从机应答	
	IIC_SendByte(addr); 	//内存字节字节
	IIC_WaitAck(); 		//等待从机应答	
	

	IIC_Start();		//IIC总线起始信号					
	IIC_SendByte(0xa1); 	//24C02的读设备地址
	IIC_WaitAck();		//等待从机应答	
	temp = IIC_RecByte();	 //读取数据
	IIC_SendAck(1); //非应答信号
	IIC_Stop();		//IIC总线停止信号		
	return temp;
}


//--------------------------------24C02读写操作--------------------------
void Read_Write_24C02(void)
{
		dat1 =  Read_24C02(0x01);
		dat2 =  Read_24C02(0x03);
		dat3 =  Read_24C02(0x05);

		dat1 += 1;
		dat2 += 1;
		dat3 += 1;
		
		if(dat1 > 10)
		{
		 	dat1 = 0;
		}
		if(dat2 > 20)
		{
		 	dat2 = 0;
		}
		if(dat3 > 30)
		{
		 	dat3 = 0;
		}

	 Write_24C02(0x01,dat1);
	 Delay(200);
	 Write_24C02(0x03,dat2);
	 Delay(200);
	 Write_24C02(0x05,dat3);
	 Delay(200);
}

void main(void)
{
	InitSystem();
	Read_Write_24C02();
 	while(1)
	{
		Time_Display();
	}
}
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值