个人flash网站南宁网站建设科技公司
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:12
当前位置: 首页 > news >正文
个人flash网站,南宁网站建设科技公司,莱州信息网电话,重庆微信网站开发公1.EEPROM概念 1.EEPROM 1.1 一些概念 #xff08;1#xff09;一些概念#xff1a;ROM【只读存储器—硬盘】#xff0c;RAM【随机访问存储器–内存】#xff0c;PROM【可编程的ROM】#xff0c;EPROM【可擦除ROM】#xff0c;EEPROM【电可擦除ROM】 1.2 为什么需要EE… 1.EEPROM概念 1.EEPROM 1.1 一些概念 1一些概念ROM【只读存储器—硬盘】RAM【随机访问存储器–内存】PROM【可编程的ROM】EPROM【可擦除ROM】EEPROM【电可擦除ROM】 1.2 为什么需要EEPROM 单片机内部的ROM只能在程序下载时进行擦除和改写但是程序运行本身是不能改写的。 单片机内部的RAM中的数据程序运行时可以改但是掉电就丢失了。 有时候我们需要有一些数据存在系统中要求掉电不丢失而且程序还要能改。所以内部ROM和RAM都不行。【这时候系统需要一块EEPROM】 1.3 EEPROM和flash的区别与联系 单片机解密中Flash和EEPROM的区别-电子工程世界 1.4 EEPROM存在系统中的2种形式 1内置在单片机内部 2外部扩展 2.EEPROM如何编程 1.I2C接口底层时序 底层CPU和I2C的接口 2.器件定义的寄存器读写时序 上层器件时序 2.AT24C02原理图和数据手册 1.接线确定 查看SCL和SDA无其他接线影响 SCL对应P2.1 SDA对应P2.0 2.数据手册理论 立创商城_一站式电子元器件采购自营商城_现货元器件交易网-嘉立创电子商城 24c02中文官方资料手册pdf - 百度文库 1.芯片的基本信息 类似于一个主持人叫A说话其他人就不可以说话但是其他人可以听到主持人和A说话但是不可以回应。 –广播式 主设备51单片机—发送器 从设备24Cxxx—接收器 2.I2C从地址确定 每一个I2C都有从地址 3.I2C底层时序 起始信号 发送字节一般第一个是从设备的地址【因为我们在通话之前要先发送要进行通话的地址设备都与自己的地址是否相同如果相同则响应如果不同则丢弃】 读取字节 停止信号 3.I2C总结 1主CPU和其附属芯片之间最常用的接口尤其是各种传感器因此在物联网时代非常重要 2三根线SCLSDAGND串行电平式 3总线式结构可以一对多总线上可以挂上百个器件【一个主设备多个从设备】用【从地址】来区分–主设备不需要地址 4主从式由主设备来发起通信及总线仲裁从设备被动响应 5通信速率一般kbps级别不合适语音视频等信息类型 4.I2C总线协议定义 起始信号 终止信号 应答信号 从设备回复主设备判断从设备是否得到数据。 可以设置是否要进行”应答信号“【可有可无】 3.I2C低层时序图和程序 1.起始信号和结束信号 SCL和SDA交互进行判断 1起始信号SCL保持高时SDA有一个从高到低下降沿2结束信号SCL保持高时SDA有一个从低到高上升沿 起始信号 /*******************************************************************************
- 函 数 名 : iic_start
- 函数功能 : 产生IIC起始信号
- 输 入 : 无
- 输 出 : 无 ****************************************************************************/ void iic_start(void) {IIC_SDA1;//如果把该条语句放在SCL后面第二次读写会出现问题delay_10us(1);IIC_SCL1;delay_10us(1);IIC_SDA0; //当SCL为高电平时SDA由高变为低表示起始信号delay_10us(1);IIC_SCL0;//钳住I2C总线准备发送或接收数据delay_10us(1); } 终止信号 /****************************************************************************
- 函 数 名 : iic_stop
- 函数功能 : 产生IIC停止信号
- 输 入 : 无
- 输 出 : 无 ****************************************************************************/ void iic_stop(void) { IIC_SDA0;//如果把该条语句放在SCL后面第二次读写会出现问题delay_10us(1);IIC_SCL1;delay_10us(1);IIC_SDA1; //当SCL为高电平时SDA由低变为高表示结束信号delay_10us(1); } 2.I2C发送一个字节 传输”0“或应答位A 传输”1“或应答位/A /****************************************************************************
- 函 数 名 : iic_write_byte
- 函数功能 : IIC发送一个字节
- 输 入 : dat发送一个字节
- 输 出 : 无 ****************************************************************************/ void iic_write_byte(u8 dat) { u8 i0; //为了保证时序正确这里要加上 //当SDA将数据放好才可以将SCL置为高电平IIC_SCL0; for(i0;i8;i) //循环8次将一个字节传出先传高再传低位{ if((dat0x80)0) IIC_SDA1;elseIIC_SDA0;dat1; //将次高位移动到最高位 delay_10us(1); IIC_SCL1; //产生一个上升沿delay_10us(1); IIC_SCL0; //产生一个下降沿 delay_10us(1);} }1I2C发送和接收字节时都是从高位开始的 3.应答位处理 在接收完8位bit后在第9个时间周期 应答处理SDA变低【AT2402拉低】。 如果我们去检测如果此时SDA为低电平则表示已经被拉低则表示已经响应到如果SDA为高电平则表示未能响应到。 产生ACK应答 /****************************************************************************
- 函 数 名 : iic_ack
- 函数功能 : 产生ACK应答
- 输 入 : 无
- 输 出 : 无 ****************************************************************************/ void iic_ack(void) {IIC_SCL0;IIC_SDA0; //SDA为低电平delay_10us(1);IIC_SCL1; //将SCL拉高delay_10us(1);IIC_SCL0; //在将SCL拉低 } 产生NACK非应答 /****************************************************************************
- 函 数 名 : iic_nack
- 函数功能 : 产生NACK非应答
- 输 入 : 无
- 输 出 : 无 ****************************************************************************/ void iic_nack(void) {IIC_SCL0;IIC_SDA1; //SDA为高电平delay_10us(1);IIC_SCL1;delay_10us(1);IIC_SCL0; } 等待应答信号到来 /****************************************************************************
- 函 数 名 : iic_wait_ack
- 函数功能 : 等待应答信号到来
- 输 入 : 无
- 输 出 : 1接收应答失败0接收应答成功 ****************************************************************************/ u8 iic_wait_ack(void) {u8 time_temp0;IIC_SCL1;delay_10us(1);while(IIC_SDA) //等待SDA为低电平{time_temp;if(time_temp100)//超时则强制结束IIC通信{ iic_stop();return 1; } }IIC_SCL0;return 0; } 4.I2C接收一个字节 释放总线 在51单片机中SDA1就是释放总线【相当于主持人把话筒给嘉宾】在其他更高级的单片机比如STM32这里的处理还会不一样。【因为拉高则可以拉低接地但是拉低了但是无法拉高】 为什么SDA1就是释放总线是因为当51单片机把引脚拉高时从设备可以选择再把引脚拉高或者拉低但是当51单片机把这个引脚拉低接地后从设备也没有办法把这个引脚拉高了。 unsigned char IIC_ReadByte() {unsigned char a0,dat0;//释放总线IIC_SDA1; //起始和发送一个字节之后IIC_SCL都是0IIC_delay();//按道理来说这里应该有一个SCL0的for(a0;a8;a){IIC_SCL1;//通知从设备我要开始读了可以放bit数据到SDA了IIC_delay();dat1; //读取的时候高位再前dat|IIC_SDA;IIC_delay();IIC_SCL0;// 拉低为下一个bit周期做准备ICC_delay();}return dat; } 4.EEPROM读写测试 1. 器件寻址 1从器件的地址是由器件自身定义的不同的从器件的地址的定义方式是不同的要查具体的芯片数据手册来确定 2同一个I2C网络中只有一个主设备但是从设备可以有多个。这多个从设备的地址不能相同。【硬件工程师必须保证这一点。因为从地址是不能通过软件设定的】 3A0A1A2—-2的三次方8【表示最多只能接8个EEPROM】 从CPU的角度来分析24C02的地址定义【如果不是从CPU角度看则得出结果不一样】 从设备地址是读地址0xa1 写地址0xa0 2.24C02写高层时序 写操作时序 start-send_byte(从地址)–send_byte(字节地址)—send_byte(写入数据) 字节写 /****************************************************************************
- 函 数 名 : at24c02_write_one_byte
- 函数功能 : 在AT24CXX指定地址写入一个数据
- 输 入 : addr:写入数据的目的地址 dat:要写入的数据
- 输 出 : 无 ****************************************************************************/ void at24c02_write_one_byte(u8 addr,u8 dat) { iic_start(); iic_write_byte(0XA0); //发送写命令发送写器件地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(addr); //发送写地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(dat); //发送字节 iic_wait_ack(); iic_stop(); //产生一个停止条件delay_ms(10); } 页写 /****************************************************************************
- 函 数 名 : at24c02_write_one_byte
- 函数功能 : 在AT24CXX指定地址写入一个数据
- 输 入 : addr:写入数据的目的地址 dat:要写入的数据
- 输 出 : 无 *******************************************************************************/ void at24c02_write_one_byte(u8 addr,u8 dat[],u8 i) { u8 j; iic_start(); iic_write_byte(0XA0); //发送写命令发送写器件地址 iic_wait_ack(); //表示要接收应答 iic_write_byte(addr); //发送写地址 iic_wait_ack(); //表示要接收应答 for(j0;ji;i){iic_write_byte(dat[i]); //发送字节 iic_wait_ack();} iic_stop(); //产生一个停止条件delay_ms(10); }
- 24C02读高层时序 /*******************************************************************************
- 函 数 名 : at24c02_read_one_byte
- 函数功能 : 在AT24CXX指定地址读出一个数据
- 输 入 : addr:开始读数的地址
- 输 出 : 读到的数据 ****************************************************************************/ u8 at24c02_read_one_byte(u8 addr) { u8 temp0; iic_start(); iic_write_byte(0XA0); //发送写命令 iic_wait_ack(); iic_write_byte(addr); //发送写地址 iic_wait_ack(); iic_start(); iic_write_byte(0XA1); //进入接收模式 iic_wait_ack(); tempiic_read_byte(0); //读取字节 iic_stop(); //产生一个停止条件 return temp; //返回读取的数据 }4.复合格式 1.先发送在接收 2.字节写随机读 4.加入串口输出代码 /****************************************************************************
- 实验名 : EEPROM实验
- 使用的IO :
- 实验效果 : 按K1保存显示的数据按K2读取上次保存的数据按K3显示数据加一 *按K4显示数据清零。
- 注意 由于P3.2口跟红外线共用所以做按键实验时为了不让红外线影响实验效果最好把红外线先 *取下来。 * ******************************************************************************/ #include reg51.h #include at24c02.h #include uart.hvoid delay20ms(void) //误差 -0.000000000005us {unsigned char a,b,c;for(c1;c0;c–)for(b222;b0;b–)for(a40;a0;a–); }/****************************************************************************
- 函 数 名 : main
- 函数功能 : 主函数
- 输 入 : 无
- 输 出 : 无 *******************************************************************************/void main() {unsigned char i;unsigned char addr; unsigned char src_dataab#cde!fg1234567; unsigned char buf[8] ABCDEFGH;uart_init(); /*for (i0; i128; i){uart_sendbyte(i);}while (1); */// 先随便找一堆数据譬如abcdefg1234567--*%/\// 把这些写入EEPROM的特定地址中// 然后读EEROM的这些地址读出后通过串口打印出来看是不是我们写入的uart_send_byte(%);addr 0;for (i0; i8; i){At24c02Write(addr, src_data[i]);delay20ms();addr;}//先打印出buf//如果这里没有给buf初始化则打印会出现问题for (i0; i8; i){uart_send_byte(buf[i]);}//分割for (i0; i20; i){uart_send_byte(-);}// 读出测试addr 0;for (i0; i8; i){buf[i] At24c02Read(addr);delay20ms();addr;}//将数据打印出来for (i0; i8; i){uart_send_byte(buf[i]);}while (1);// 进一步测试// 先写入一些特定内容然后关机断电然后改代码为读出并打印显示看内容} 问题分析 1通过调试发现程序跑飞了经检测发现uart中没有关中断 2读出内容不对怀疑是EEPROM经不起快速的连续读写所以在读和写之间加入20ms的delay测试后发现读写正确了 3定义了局部变量没有初始化程序中直接去通过串口输出结果导致程序
- 上一篇: 个人+网站可以做导航吗酷维网站模版
- 下一篇: 个人备案 网站内容北京网站优化提供商
相关文章
-
个人+网站可以做导航吗酷维网站模版
个人+网站可以做导航吗酷维网站模版
- 技术栈
- 2026年03月21日
-
个人 申请域名做网站win10最强性能优化设置
个人 申请域名做网站win10最强性能优化设置
- 技术栈
- 2026年03月21日
-
个人 导航网站 备案端午节网页设计模板
个人 导航网站 备案端午节网页设计模板
- 技术栈
- 2026年03月21日
-
个人备案 网站内容北京网站优化提供商
个人备案 网站内容北京网站优化提供商
- 技术栈
- 2026年03月21日
-
个人备案放企业网站推广普通话喜迎十二大手抄报
个人备案放企业网站推广普通话喜迎十二大手抄报
- 技术栈
- 2026年03月21日
-
个人备案能做什么网站建设门户网站费用
个人备案能做什么网站建设门户网站费用
- 技术栈
- 2026年03月21日






