`

51单片机学习笔记,模拟iic总线连续读写24c02存储器

阅读更多

AT24C02A, 2K SERIAL EEPROM:

Internally organized with 32 pages of 8 bytes each,
the 2K requires an 8-bit data word address for random word addressing.

24c02有32个页,每页8字节,本帖中不讨论页写的方式

-------------------------------------------------------------------




 
 

AT24C02内部设有一个8位控制寄存器,其每一位的含义如下:
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
 1      0     1    0    A2   A1   A0  R/W
其中前4位数据是芯片固定的标识,
A2/A1/A0用于选择总线上待访问的I2C器件,R/W=1读操作,R/W=0写操作;
I2C总线上最多可以扩展8片同样的2K容量EEPROM存储器,
或者是4片4Kb的EEPROM,
或者是2片容量为8Kb的EEPROM存储器。
或者是1片容量为16Kb的EEPROM存储器(此时硬件就固定了,因为A2/A1/A0已经被P2P1P0占用),
如果扩展8片2K以内容量的EEPROM存储器,每片存储器将对应一个地址,
我们的实验板上的AT24C02的A2/A1/A0引脚全部接地,
所以在实验中读写控制字分别为:0xa1/0xa0

 

主芯片stc89c52rc,晶振11.0592M

 

#include <reg52.h>
#include "MY51.H"

sbit sda=P2^0;		//总线连接口定义
sbit scl=P2^1;		//总线连接口定义

void delayus() 	//需要4个机器周期,大概4.34us
{
	;					//晶振频率11.0592M,机器周期为1.085微秒
}

void iic_start()  //启动信号
{
	sda=1;
	scl=1;
	delayus();		//sda和scl同为高电平保持4.7us以上
	_nop_();			//1.085us,共5.78us,下面sda=0是下降沿,不能计算在延时时间中
	sda=0; 			//下降沿
	delayus();		//sda低电平保持4us以上	,这里是4.34us满足要求
}

void iic_stop()	//停止信号
{
	sda=0;_nop_();	//准备状态
	scl=1;
	delayus();		//该状态稳定时间要求保持4us以上
	sda=1;			//scl高电平期间,sda来一个上升沿
	delayus();		//sda保持4.7us以上,4.34加上函数返回时间大于4.7us
						//注:此时scl和sda都为1	
}

void iic_sendByte(uchar byteData) //mcu发送一个字节
{
	uchar i;
	uchar temp=byteData;
	for(i=0;i<8;i++)
	{
		temp=temp<<1;   //移动后最高位到了PSW寄存器的CY位中
		scl=0;			 //准备
		_nop_();		    //稳定一下
		sda=CY;			 //将待发送的数据一位位的放到sda上
		_nop_();
		scl=1;    		 //每一个高电平期间,ic器件都会将数据取走
		_nop_();		
	}

	scl=0;				//如果写成scl=1;sda=1就是停止信号,不能这么写
	_nop_();				
	sda=1;				//释放总线,数据总线不用时要释放
	_nop_();
}

uchar iic_readByte() //读一个字节
{
	uchar i,temp;
	scl=0;				//准备读数据
	_nop_();
	sda=1;				//释放总线
	_nop_();

	for(i=0;i<8;i++)
	{
		scl=1;			//mcu开始取数据
		delayus();		//scl为高电平后,ic器件就会将1位数据送到sda上
							//总共用时不会大于4.34us的,然后就可以让mcu读sda了
		temp=(temp<<1)|sda; //读一位保存到temp中
		scl=0;
		delayus();		
	}
	return temp;
}

bool iic_checkACK()		//处理应答信号
{
	uchar errCounts=255; //定义超时量为255次
	scl=1;
	_nop_();
	
	while(sda)
	{	//在一段时间内检测到sda=0的话认为是应答信号
		if(0==errCounts)
		{
			scl=0;		  //钳住总线
			_nop_();
			return false; //没有应答信号
		}
		errCounts--;
	}

	scl=0;			  //钳住总线,为下1次通信做准备 
	_nop_();
	return true;	  //成功处理应答信号
}

void iic_init()	//总线初始化
{
	scl=1;
	sda=1;
	delayus();
}

void iic_sendACK(bool b_ACK)	//发送应答或非应答信号
{
	scl=0;			//准备
	_nop_();

	if(b_ACK)		//ACK
	{
		sda=0;
	}
	else			   //unACK
	{
		sda=1;
	}

	_nop_();
	scl=1;
	delayus(); 		//大于4us的延时
	scl=0;  	  		//钳住scl,以便继续接收数据	
	_nop_();
}


void AT24C02_writeByte(uchar address,uchar dataByte)//向24c02写一字节数据
{
	iic_start();
	iic_sendByte(0xa0);//mcu写控制字,前4位固定1010,后三位地址0,末位0是写
	iic_checkACK();		   //mcu处理应答信号
	iic_sendByte(address);  //准备在指定地址处写入	
	iic_checkACK();
	iic_sendByte(dataByte); //写数据
	iic_checkACK();
	iic_stop();
	delayms(2);	
	//按字节写入时,24c02在接收到停止信号后将数据擦写到内部,这需要时间
	//并且在这段时间内不会响应总线上的任何请求,故让mcu有2毫秒以上的等待	
}

void AT24C02_writeData(uchar address,uchar numBytes,uchar* buf)//写入任意长度数据
{
	while(numBytes--)
	{
		AT24C02_writeByte(address++,*buf++);
	}
}

void AT24C02_readData(uchar beginAddr,uchar dataSize,uchar* buf)//读取任意长度字节
{
	iic_start();					//起始信号
	iic_sendByte(0xa0);			//控制字,写
	iic_checkACK();				//处理应答信号
	iic_sendByte(beginAddr);	//发送地址
	iic_checkACK();				//处理应答信号	
	iic_start();			   	//发送起始信号
	iic_sendByte(0xa1);			//控制字,读
	iic_checkACK();				//处理应答信号
	while(dataSize--)				//读取dataSize个字节
	{
		*buf++=iic_readByte();	//读取一个个字节并保存到缓冲区buf中
		iic_sendACK(dataSize);  //发送应答,当dataSize为0时发送非应答
	}
	iic_stop();						//发送停止信号
}

void main()
{
	uchar buf[2];					//接受数据的缓冲区
	uchar arr[34]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,   			//0x00-0x0f
						16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,//0x10-0x1f
						32,0x55};													//0x20-0x21
	iic_init();											//总线初始化
	//AT24C02_writeByte(0x08,0x11);  			//向指定地址处写入一个字节数据,代码测试
	AT24C02_writeData(0x00,sizeof(arr),arr);	//向指定地址处开始写入34字节的数据
	AT24C02_readData(0x20,sizeof(buf),buf);   //从指定地址开始读2个字节
	P1=buf[1];	//buf中的第二个元素就是arr中的最后一个数据0x55
											
	while(1){P1=~P1;delayms(500);} //将这个0x55用led灯显示出来10101010变化
}

 

my51.h头文件中主要用到
#include <intrins.h>
typedef unsigned char  uchar ;

void delayms(uint16 ms)  //软延时函数
{
	uint16 i,j;
	for(i=ms;i>0;i--)
	{
        for(j=113;j>0;j--)
        {}
	}
}

  

 

 

  • 大小: 28.3 KB
  • 大小: 75.7 KB
0
0
分享到:
评论

相关推荐

    IIC接口技术与24C02在瑞萨RL78/G13中的开发笔记整理

    ### IIC接口技术与24C02...通过上述介绍,我们不仅了解了IIC总线的基本原理和技术细节,还学习了如何利用24C02 EEPROM与瑞萨RL78/G13进行有效的交互。这对于从事嵌入式系统开发的技术人员来说,是非常宝贵的参考资料。

    【多智能体控制】基于matlab事件触发多智能体编队控制(含间歇控制)【含Matlab源码 13223期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    《网页制作基础教程(Dreamweaver-CS3)》第11章-嵌入表单元素.ppt

    《网页制作基础教程(Dreamweaver-CS3)》第11章-嵌入表单元素.ppt

    V1_3_example.ipynb

    V1_3_example.ipynb

    《计算机应用基础项目教程》项目四-电子表格软件Excel2010的使用.pptx

    《计算机应用基础项目教程》项目四-电子表格软件Excel2010的使用.pptx

    《计算机系统结构》第4章-指令级并行.ppt

    《计算机系统结构》第4章-指令级并行.ppt

    西门子1200博途三部十层电梯控制系统及WinCC RT Pro界面设计详解

    内容概要:本文详细介绍了基于西门子S7-1200 PLC和WinCC RT Pro的三部十层电梯联控系统的设计与实现。主要内容涵盖硬件配置、核心算法如电梯间协同算法、方向判断函数、状态机设计、呼叫调度算法以及WinCC画面设计中的动画效果和平滑移动实现方法。文中还讨论了常见的调试问题及其解决方案,如方向锁死、编码器干扰等。此外,强调了状态机在电梯控制中的重要性,并提供了具体的代码示例来解释各个功能模块的工作原理。 适合人群:自动化工程师、PLC程序员、HMI开发者、工业控制系统设计师。 使用场景及目标:适用于希望深入了解电梯控制系统设计原理和技术实现的专业人士。目标是帮助读者掌握电梯联控系统的编程技巧,提高对工业控制项目的理解和应用能力。 其他说明:文章不仅提供详细的代码片段,还分享了许多实践经验,有助于读者更好地理解和应对实际工程项目中的挑战。

    飞猫智联u20一键打开adb并安装

    飞猫智联u20一键打开adb并安装

    DeepSeek:智能时代的全面到来和人机协作的新常态.pdf

    DeepSeek:智能时代的全面到来和人机协作的新常态.pdf

    电机控制领域PMSM无传感HFI高频谐波注入与滑模观测器仿真模型解析(基于28035)

    内容概要:本文深入探讨了永磁同步电机(PMSM)无传感器控制技术中的高频谐波注入(HFI)方案及其滑模观测器仿真模型。主要介绍了HFI的工作原理,即通过向电机定子绕组注入高频信号并检测其响应来估算转子位置和速度。文中提供了详细的代码实现,包括高频信号生成、电流检测与处理、滑模观测器核心算法等。此外,还分享了实际工程项目中的调试经验和常见问题解决方案,如参数选择、硬件配置、滤波处理等。 适合人群:从事电机控制系统开发的技术人员,尤其是对PMSM无传感器控制感兴趣的工程师。 使用场景及目标:适用于需要提高PMSM电机控制性能的应用场合,如工业自动化设备、伺服系统等。目标是在低速条件下实现精确的转子位置和速度估算,从而提升系统的整体性能。 其他说明:文章不仅提供了理论和技术细节,还结合了大量实践经验,帮助读者更好地理解和应用HFI技术。同时强调了实际工程中需要注意的各种细节,如参数整定、硬件配置、滤波处理等,确保方案的可靠性和稳定性。

    OAI-10th-Anniversary-Workshop

    5G 6G NR-NTN A Hardware perspective && OAI-10th-Anniversary-Workshop-Qualcomm-2.pdf An SMEs Journey Towards 5G6G NTN Disruptive Technologies Lasting Software--OAI-10th-Anniversary-Workshop-Lasting-Software.pdf Deploying Private 5G with the Open Air Interface- OAI-10th-Anniversary-Workshop-Firecell-.pdf End-to-End Open-Source 5G and O-RAN Prototyping in ARA for Low-Latency Agriculture Applications OAI-10th-Anniversary-Workshop-Iowa-State-University.pdf OAI 5G NR NTN – PHY and MAC Layer Contributions 20240913_Fraunhofer_IIS_OAI_NTN_reduced.pdf Open Source in Telecoms Driving 5G innovatio--OAI-10th-Anniversary-Workshop-Canonical.pdf OpenAirInterface Recent Developments & Roadmap OAI-10th-Anniversary-Workshop-Florian-Kaltenberger.pdf The road of artificial intelligence towards the 6G

    三菱FX2N PLC编码器脉冲数测量距离的技术解析及应用

    内容概要:本文详细介绍了如何使用三菱FX2N系列PLC通过编码器脉冲数计算输出距离的方法。首先,文章阐述了核心思路,即通过采集编码器产生的脉冲数,结合预先设定的脉冲数和输出长度参数,经过一系列浮点数运算得出输出距离。文中展示了详细的代码实现步骤,包括初始化部分、脉冲采集部分、浮点数运算部分和结果处理部分。此外,还讨论了一些常见的调试技巧和注意事项,如数据溢出处理、双编码器校验、方向信号处理等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要精确测量距离的工业控制系统,如输送带系统、机械臂定位等。主要目标是帮助工程师掌握如何利用PLC和编码器实现高精度的距离测量。 其他说明:文章提供了丰富的代码示例和调试建议,有助于读者在实际项目中灵活运用相关技术和解决常见问题。同时强调了浮点运算在提高测量精度方面的优势及其潜在挑战。

    无刷直流电机BLDC转速电流双闭环调速系统的Matlab Simulink仿真研究

    内容概要:本文详细介绍了如何使用Matlab Simulink搭建无刷直流电机(BLDC)的转速电流双闭环调速系统。首先阐述了系统的基本架构,即外层转速环和内层电流环的作用及其相互关系。接着逐步讲解了各个模块的具体实现方法,包括电机模型参数设置、PI控制器参数配置、PWM信号生成、坐标变换等关键技术。通过仿真结果分析,展示了转速和电流响应曲线,探讨了参数调整对系统性能的影响。最终实现了对电机转速的精确控制,并提供了优化建议。 适合人群:从事电机控制领域的工程师和技术人员,尤其是有一定Matlab/Simulink基础的研究人员。 使用场景及目标:适用于希望深入了解BLDC电机控制原理及仿真的技术人员。目标是在理论基础上通过仿真工具掌握双闭环调速系统的构建与优化方法。 其他说明:文中不仅提供了详细的建模步骤,还分享了许多实用的经验技巧,如PI参数选择、PWM生成方式的选择、死区时间设置等,有助于提高实际应用中的系统性能。

    网课搜题 小猿题库多接口微信小程序源码 自带流量主.zip

    多接口小猿题库等综合网课搜题微信小程序源码带流量主,网课搜题小程序, 可以开通流量主赚钱 搭建教程 1, 微信公众平台注册自己的小程序 2, 下载微信开发者工具和小程序的源码 3, 上传代码到自己的小程序

    weixin287火锅店点餐系统的设计与实现+ssm(文档+源码)_kaic

    weixin287火锅店点餐系统的设计与实现+ssm(文档+源码)_kaic

    DotCom Secrets:在线增长策略揭秘

    《DotCom Secrets》是拉斯洛·布劳恩所著的一本关于如何使用在线营销策略来增长公司业务的书籍。本书揭示了在线营销巫师兄弟会不愿公开的秘密,强调了直接响应营销的重要性,并提供了构建和优化营销漏斗的系统方法。书中不仅介绍了如何通过各种在线渠道获取流量、提高转化率和销售,还提供了如何发现目标客户、构建价值阶梯以及如何利用“肥皂剧序列”等策略。拉斯洛·布劳恩通过本书,旨在帮助企业家在充满变数的互联网世界中找到坚实的营销基础。

    基于单片机的智能秤设计(程序+电路+仿真)(51+1602+HX711+10KG+BZ+KEY16)#0415

    包括:源程序工程文件、Proteus仿真工程文件、电路原理图文件、配套技术手册、论文资料等 1、采用51/52单片机(通用)作为主控芯片; 2、采用压力传感器+HX711模块检测压力; 3、可通过按键设置物品单价; 4、采用LCD1602对重量/单价/总价进行显示; 5、当物品超出传感器量程时,蜂鸣器进行过载报警。

    First Word Fall Through FIFO与Standard FIFO对比仿真

    First Word Fall Through FIFO特点是输出端口数据保持有效,读使能有效时即有数据输出。Standard FIFO在读使能有效时,数据一般延时1个时钟周期输出。通过仿真来查看这两种FIFO的特点。

    电力电子领域中二极管箝位型三电平逆变器(NPC)的SVPWM调制与中点电位平衡仿真

    内容概要:本文深入探讨了二极管箝位型三电平逆变器(NPC)的关键技术和挑战,主要包括三电平空间矢量调制(SVPWM)和中点电位平衡调制。SVPWM通过合成参考电压矢量使输出电压接近正弦波,而中点电位平衡则解决因直流侧电容充放电不平衡导致的问题。文中提供了详细的MATLAB代码示例,展示了如何实现这两种调制方法,并介绍了在MATLAB/Simulink中构建仿真模型的具体步骤。此外,文章还讨论了一些实用技巧,如使用坐标变换简化扇区判断、引入滞回比较稳定矢量位置、以及通过预测电流法改善中点电位平衡的动态响应。 适合人群:从事电力电子领域的研究人员和技术人员,尤其是对三电平逆变器有兴趣的工程师。 使用场景及目标:适用于需要深入了解NPC三电平逆变器工作原理的研究人员,帮助他们掌握SVPWM调制和中点电位平衡的技术细节,从而优化逆变器的设计和性能。 其他说明:文章不仅提供了理论分析,还包括大量实际工程中的经验和技巧,有助于读者更好地理解和应用相关技术。

Global site tag (gtag.js) - Google Analytics