蓝桥杯单片机之AT24C02(基于自己对AT24C02的学习和理解)

一、先用抽象法说明原理,让原理变得简单易懂:

1、向AT24C02写入数据:

有个关系户,他想安排自己的儿子进某个大厦里某个楼层的公司,那么他就要先找到这个公司的地址,然后再找到该公司是第几楼,最后把自己儿子安排进这个楼所在的公司。

说明:

(1)找到公司所在大厦:写入设备地址

(3)找到公司楼层:要写入数据的地址,也就是你想把数据存哪个数据存储单元

(4)儿子:你要写入的数据

2、向AT24C02读取数据:

儿子下班了,要老爸接他下班,但是老爸没空,打电话给司机,告诉司机公司所在的大厦地址,公司楼层,然后司机到了这个地址,问HR小姐姐找要找的人,司机准备接待,最后HR带人来了。

说明:

(1)司机需要先找到正确的大厦(写入设备地址0xA0)

(2)然后精确到具体楼层(写入存储地址Address)

(3)司机开始准备接待(写入0xA1)

(4)HR小姐姐找到了指定的人,并带来司机面前(读取数据Temp)

(5)接到后立刻离开(NACK+Stop)

二、原理图

1、设备地址:其中A2、A1、A0都是0,所以唯一要改的就是R/W

2、写入流程图:

3、读取流程图:

三、代码:

1、重点代码:(注:能看懂这里就可以了)

cpp 复制代码
/*
参数:Address:范围是0x00 到 0xFF, Data:范围是0x00到0xff(0 - 255)
功能:向某个数据存储地址Address写入数据Data
返回值:无
*/
void AT24C02_Write(unsigned char Address,unsigned char Data)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	I2CSendByte(Data);
	I2CWaitAck();
	I2CStop();
}

/*
参数:Address:范围是0x00 到 0xFF
功能:向某个数据存储地址Address读取数据
返回值:Temp
*/
unsigned char AT24C02_Read(unsigned char Address)
{
	unsigned char Temp;
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xA1);
	I2CWaitAck();
	Temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return Temp;
}

2、主要代码:(注:并非所有代码,直接复制运行必错)

cpp 复制代码
/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "sys.h"
#define DELAY_TIME	10

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

/*
参数:Address:范围是0x00 到 0xFF, Data:范围是0x00到0xff(0 - 255)
功能:向某个数据存储地址Address写入数据Data
返回值:无
*/
void AT24C02_Write(unsigned char Address,unsigned char Data)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	I2CSendByte(Data);
	I2CWaitAck();
	I2CStop();
}

/*
参数:Address:范围是0x00 到 0xFF
功能:向某个数据存储地址Address读取数据
返回值:Temp
*/
unsigned char AT24C02_Read(unsigned char Address)
{
	unsigned char Temp;
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xA1);
	I2CWaitAck();
	Temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return Temp;
}
cpp 复制代码
unsigned char temp;
void main()
{
	AT24C02_Write(0x01,122);  // 向0x01数据存储地址写入122
	while(1)
	{
		temp = AT24C02_Read(0x01);  // 从0x01数据存储地址读取数据,理论上应该是122
		SMG(1,temp / 100);       // 显示百位
		SMG(2,temp % 100 / 10);  // 显示十位
		SMG(3,temp % 10);        // 显示个位
	}
}
相关推荐
通信小呆呆6 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick6 小时前
自动对焦学习-3
人工智能·学习·计算机视觉
✎ ﹏梦醒͜ღ҉繁华落℘7 小时前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
Daisy Lee7 小时前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn867 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e8 小时前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨8 小时前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
u152109648498 小时前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd8451015008 小时前
RS485 总线详解
单片机·嵌入式硬件
cqbzcsq9 小时前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息