单片机基础模块学习——AT24C02芯片

devtools/2025/2/6 9:27:01/

一、EEPROM芯片

ROMRAM
断电后数据保留断电后数据消失

因此,如果在断电后希望数据继续保留的话,就需要存储在EEPROM芯片中。

二、EEPROM芯片原理图

  • A0~A2与芯片地址相关连接到GND,为0
  • GND 接地,VCC 正电源 
  • WP——write protect写保护,连接到地,意味着可以被自由写入(连接到高电平无法被写入
  •  scl,sda说明采用iic协议进行通信

前七位固定不变,最后一位是0或1,write是0,read是1

所以写入地址是:0xA0  读取地址是:0xA1

因为地址不同,所以都采用iic协议也不会有冲突。

三、写入读取方式

1.写入方式

  1. start  开始信号
  2. DEVICE ADDRESS 地址
  3. R/W 低电平是写,高电平是读
  4. ACK 应答位
  5. WORD ADDRESS 写入的位置
  6. ACK 应答位
  7. DATA写入相关数据
  8. ACK 应答位
  9. STOP 终止

2.读取方式

  1.  start  开始信号
  2. DEVICE ADDRESS 设备地址
  3. R/W 低电平是写,高电平是读
  4. ACK 应答位
  5. WORD ADDRESS 读取的位置
  6. ACK 应答位
  7.  start  再次发送开始信号
  8. DEVICE ADDRESS 设备地址
  9. READ 进入读模式
  10. ACK 应答位
  11. DATA将指定地址上的数据返回回来
  12. NO ACK没有应答
  13. STOP 终止

四、开发板位置

五、模块代码

#include "iic.h"
#define DELAY_TIME	5//
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);
}unsigned char PCF8591_ADC(void)
{unsigned char temp;/**********************写入**********************/I2CStart();//开始I2CSendByte(0x90);//发送写地址I2CWaitAck();//等待应答I2CSendByte(0x43);//发送光敏电阻控制位I2CWaitAck();//等待应答/**********************读取**********************/I2CStart();//开始I2CSendByte(0x91);//发送读地址I2CWaitAck();//等待应答temp=I2CReceiveByte();//接收I2CSendAck(1);//发送应答I2CStop();//终止通信return temp;
}void PCF8591_DAC(unsigned char dat)
{I2CStart();//开始I2CSendByte(0x90);//发送写地址I2CWaitAck();//等待应答I2CSendByte(0x41);//发送光敏电阻控制位I2CWaitAck();//等待应答I2CSendByte(dat);//发送光敏电阻控制位I2CWaitAck();//等待应答I2CStop();}void EEPROM_Read(unsigned char *pucRuf,unsigned char addr,unsigned char num)
{I2CStart();I2CSendByte(0xA0);//发送设备地址I2CWaitAck();//等待应答I2CSendByte(addr);//发送写入位置I2CWaitAck();I2CStart();I2CSendByte(0xA1);//发送读取地址I2CWaitAck();while(num--){*pucRuf++= I2CReceiveByte();if(num)I2CSendAck(0);elseI2CSendAck(1);}I2CStop();//终止通信	
}void EEPROM_Write(unsigned char *pucRuf,unsigned char addr,unsigned char num)
{I2CStart();I2CSendByte(0xA0);//发送设备地址I2CWaitAck();//等待应答I2CSendByte(addr);//发送读取位置I2CWaitAck();while(num--){I2CSendByte(*pucRuf++);I2CWaitAck();I2C_Delay(200);//加入延时,不至于导致总线过于繁忙,有助于总线稳定性}I2CStop();//终止通信	
}


http://www.ppmy.cn/devtools/156504.html

相关文章

2. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务概述与演变

在软件架构不断演进的今天&#xff0c;微服务架构已成为许多企业构建现代化应用的首选方案。本文将深入探讨微服务的基本概念、演变历程及其出现的背景和推动因素&#xff0c;同时分析当前微服务在业界的应用现状和未来趋势&#xff0c;为读者提供一个全面的视角&#xff0c;理…

【大模型LLM面试合集】大语言模型架构_Transformer架构细节

Transformer架构细节 1.Transformer各个模块的作用 &#xff08;1&#xff09;Encoder模块 经典的Transformer架构中的Encoder模块包含6个Encoder Block. 每个Encoder Block包含两个⼦模块, 分别是多头⾃注意⼒层, 和前馈全连接层. 多头⾃注意⼒层采⽤的是⼀种Scaled Dot-Pr…

从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)

摘要 离散傅里叶变换&#xff08;DFT&#xff09;是数字信号处理领域中分析信号频域特性的重要工具&#xff0c;但直接计算DFT的复杂度较高&#xff0c;限制了其在大规模数据处理中的应用。快速傅里叶变换&#xff08;FFT&#xff09;的出现显著降低了计算复杂度&#xff0c;极…

前端学习:Axios Http请求库入门与实战应用

什么是Promise&#xff1f; Promise 是一个表示异步操作最终完成或失败的对象。它允许你更优雅地处理异步操作&#xff0c;避免回调地狱&#xff08;Callback Hell&#xff09;。 特点&#xff1a; 异步性&#xff1a;Promise 代表一个异步操作的最终完成或失败。 不可更改&…

udp和tcp的区别

目录 UDP 和 TCP 的区别 1. 连接性 2. 可靠性 3. 数据传输顺序 4. 流量控制和拥塞控制 5. 效率 6. 应用场景 UDP 和 TCP 的 C/C 代码实现区别 1. TCP 服务器端和客户端 TCP 服务器端&#xff08;Server&#xff09; TCP 客户端&#xff08;Client&#xff09; 2. U…

Vue.js 异步、延迟组件加载

Vue.js 异步、延迟组件加载 今天我们来聊聊 Vue 3 中的一个非常实用的优化技巧&#xff1a;异步/延迟组件加载。我们将通过 Vue 3 的一些语法糖来提升性能&#xff0c;特别是在渲染大量组件时&#xff0c;异步加载将大大减少页面的初次加载时间。 什么是异步组件加载&#xf…

Kafka分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中&#xff0c;合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略&#xff08;默认&#xff09; 轮询策略是 Kafka 默认的分区策略&#xff08;当消息没有指定键时&…

怎么获得小学、初中高中教材的pdf版【转载】

教材pdf下载步骤&#xff1a; 步骤操作概述示例图步骤一&#xff1a;进入官网进入 国家智慧教育公共服务平台&#xff1a;https://www.smartedu.cn/&#xff0c;进行登录或注册步骤二&#xff1a;选择教材点击中小学智慧教育&#xff0c;点击教材&#xff0c;选择自己喜欢的教…