蓝桥杯单片机之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);        // 显示个位
	}
}
相关推荐
得单片机的运4 小时前
STM32的蓝牙通讯(HAL库)
stm32·单片机·嵌入式硬件·蓝牙
遇见尚硅谷5 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
国科安芯5 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
艾莉丝努力练剑5 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
jz_ddk5 小时前
[HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
物联网·学习·华为·harmonyos
试着6 小时前
零基础学习性能测试第五章:Tomcat的性能分析与调优-Tomcat原理,核心配置项,性能瓶颈分析,调优
学习·零基础·tomcat·性能测试
weixin_452600696 小时前
GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制
stm32·单片机·嵌入式硬件·智能家居·音响·电动工具
老虎06276 小时前
JavaWeb(苍穹外卖)--学习笔记13(微信小程序开发,缓存菜品,Spring Cache)
笔记·学习·微信小程序
@蓝莓果粒茶8 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
无名工程师8 小时前
AI 学习过程中各阶段的学习重点、时间规划以及不同方向的选择与建议等内容
人工智能·学习