• 十、AT24C02


    AT24C02介绍

    AT24C02是一种可以实现掉电不丢失的存储器,可以保存单片机运行时想要永久保存的数据信息,是通过I2C总线,容量是256字节
    在这里插入图片描述

    I2C介绍

    有SCL和SDA两根通信线,是同步、半双工、带数据应答的,通过该总线,可以使各种设备的通信标准统一

    电路规范

    所有的I2C设备的SCL连在一起,SDA连在一起 ,设备的SCL和SDA要配置为开漏输出模式,并且要各添加一个上拉电阻,阻值一般为4.7k,这样做可以解决多机通信互相干扰的问题

    时序结构

    发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上,然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,重复8次就可以发送一个字节
    接收一个字节:SCL低电平期间,从机将数据依次放到SDA线上,然后拉高SCL,主机将在SCL高电平期间读取数据位,SCL高电平期间不允许SDA变化。主机在接收之前,需要释放SDA
    发送应答:接收完一个字节后,主机在下一个时钟发送一位数据,0表示应答,1表示非应答
    接收应答:发送完一个数据后,主机在下一个时钟接收一位数据,判断从机是否应答。主机在接收之前,需要释放SDA

    I2C总线模板

    #include 
    sbit I2C_SCL=P2^1;
    sbit I2C_SDA=P2^0;
    void I2C_Start(void)
    {
    	I2C_SDA=1;
    	I2C_SCL=1;
    	I2C_SDA=0;
    	I2C_SCL=0;
    }
    void I2C_Stop(void)
    {
    	I2C_SDA=0;
    	I2C_SCL=1;
    	I2C_SDA=1;
    }
    void I2C_SendByte(unsigned char Byte)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		I2C_SDA=Byte&(0x80>>i);
    		I2C_SCL=1;
    		I2C_SCL=0;
    	}
    }
    unsigned char I2C_ReceiveByte(void)
    {
    	unsigned char i,Byte=0x00;
    	I2C_SDA=1;
    	for(i=0;i<8;i++)
    	{
    		I2C_SCL=1;
    		if(I2C_SDA){Byte|=(0x80>>i);}
    		I2C_SCL=0;
    	}
    	return Byte;
    }
    void I2C_SendAck(unsigned char AckBit)
    {
    	I2C_SDA=AckBit;
    	I2C_SCL=1;
    	I2C_SCL=0;
    }
    unsigned char I2C_ReceiveAck(void)
    {
    	unsigned char AckBit;
    	I2C_SDA=1;
    	I2C_SCL=1;
    	AckBit=I2C_SDA;
    	I2C_SCL=0;
    	return AckBit;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    AT24C02

    #include 
    #include "I2C.h"
    #define AT24C02_ADDRESS		0xA0
    void AT24C02_WriteByte(unsigned char WordAddress,Data)
    {
    	I2C_Start();
    	I2C_SendByte(AT24C02_ADDRESS);
    	I2C_ReceiveAck();
    	I2C_SendByte(WordAddress);
    	I2C_ReceiveAck();
    	I2C_SendByte(Data);
    	I2C_ReceiveAck();
    	I2C_Stop();
    }
    unsigned char AT24C02_ReadByte(unsigned char WordAddress)
    {
    	unsigned char Data;
    	I2C_Start();
    	I2C_SendByte(AT24C02_ADDRESS);
    	I2C_ReceiveAck();
    	I2C_SendByte(WordAddress);
    	I2C_ReceiveAck();
    	I2C_Start();
    	I2C_SendByte(AT24C02_ADDRESS|0x01);
    	I2C_ReceiveAck();
    	Data=I2C_ReceiveByte();
    	I2C_SendAck(1);
    	I2C_Stop();
    	return Data;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    数据存储主函数

    #include 
    #include "LCD1602.h"
    #include "Key.h"
    #include "AT24C02.h"
    #include "Delay.h"
    
    unsigned char KeyNum;
    unsigned int Num;
    
    void main()
    {
    	LCD_Init();
    	LCD_ShowNum(1,1,Num,5);
    	while(1)
    	{
    		KeyNum=Key();
    		if(KeyNum==1)	//K1按键,Num自增
    		{
    			Num++;
    			LCD_ShowNum(1,1,Num,5);
    		}
    		if(KeyNum==2)	//K2按键,Num自减
    		{
    			Num--;
    			LCD_ShowNum(1,1,Num,5);
    		}
    		if(KeyNum==3)	//K3按键,向AT24C02写入数据
    		{
    			AT24C02_WriteByte(0,Num%256);
    			Delay(5);
    			AT24C02_WriteByte(1,Num/256);
    			Delay(5);
    			LCD_ShowString(2,1,"Write OK");
    			Delay(1000);
    			LCD_ShowString(2,1,"        ");
    		}
    		if(KeyNum==4)	//K4按键,从AT24C02读取数据
    		{
    			Num=AT24C02_ReadByte(0);
    			Num|=AT24C02_ReadByte(1)<<8;
    			LCD_ShowNum(1,1,Num,5);
    			LCD_ShowString(2,1,"Read OK ");
    			Delay(1000);
    			LCD_ShowString(2,1,"        ");
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    剑指Offer || 044.在每个树行中找最大值
    C-DS二叉树_另一棵树的子树
    Visual Studio批量删除换行
    剑指offer专项突击版第28天
    腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
    黑马JVM总结(二十二)
    低代码如何提升开发人员的开发能力
    CRUD搬砖两三年了,怎么阅读Spring源码?
    前端 JS 经典:i,i++,++i区别
    webpack类似的工具还有哪些?
  • 原文地址:https://blog.csdn.net/m0_63667883/article/details/133072149