- 浏览: 587399 次
文章分类
最新评论
-
wjwjwjwj:
void T0_Work() //T0定时器调用的工作函数 ...
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发) -
xouou_53320:
lastSeries 写道前辈,是不是在工作以后连System ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
lastSeries:
前辈,是不是在工作以后连System.out.println( ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
xouou_53320:
chuanwang66 写道不过改了iconv.exe路径也不 ...
Source Insight 中文乱码,用iconv转码,解决中文乱码问题_20150930更新 -
anazel:
正在学习,多谢分享
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发)
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--) {} } }
发表评论
-
基于c8051f310的mcp41010数字电位器驱动源码
2015-05-16 20:22 4188#include "mcp41010.h" ... -
12864液晶驱动源码,独创中英文混合输出
2015-02-02 15:46 10924控制器7920 代码没啥 ... -
51单片机学习笔记:合并1602和12864液晶排插接口
2013-03-23 17:44 5916今天成功合并1602和12864液晶排插接口! ... -
51单片机学习笔记:ST7920控制器的12864液晶使用总结
2013-03-22 17:05 11019总结:1、 控制芯片不 ... -
51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度
2013-03-04 11:43 15892使用定时器T0产生PWM方波, 用按键调整占空比,20级可 ... -
51单片机学习笔记:写了个led宏,并尝试控制led灯的亮度
2013-03-02 11:19 4890经常用led灯来观察现象,甚至调试代码,修改代码时用0和1很 ... -
51单片机学习笔记:步进电机控制,正转反转等
2013-03-01 17:52 10755步进电机应用广泛, 例 ... -
51单片机学习笔记:连续读写STC89C52RC内部EEPROM存储器
2013-02-26 17:03 23981STC单片机的内部EEPROM是用DATAFLASH模拟出 ... -
51单片机学习笔记:红外接收(对原子哥的ALIENTEK遥控器进行解码)
2013-02-23 15:50 10922正点原子的ALIENTEK遥控 ... -
51单片机学习笔记:使用DS1302芯片制作电子钟
2013-02-15 20:07 20839百度ds1302 写道 DS1302 是美国DALLAS公 ... -
51单片机学习笔记:DS18B20测温程序
2013-02-13 10:51 18099#include "my51.h&quo ... -
手工制作51开发板
2013-01-29 16:08 1390纯山寨tx-1c开发板 ,第一次动手焊板子, ,*_* ... -
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发)
2013-01-20 10:27 23665之前的电子钟程序中,用的按键消抖处理方法是10ms的延时, ... -
硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器
2013-01-19 17:46 3161硬件上由于24c01的A0A1A2管脚不允许悬空,故暂时的 ... -
51单片机学习笔记,操作1602液晶
2012-08-16 14:12 1331TX-1C板 操作并行模式的1602液晶液晶第1,2脚 ... -
51单片机学习笔记:利用ADC0804模数转换器采集电压
2012-08-10 20:06 8012电位器调节待检测电压值,在数码管上显示出来, 代码大多从书上 ... -
51单片机学习笔记:串口接收和发送数据
2012-08-05 16:57 41137芯片STC89C52RC 在PC端向单片机发送任意数 ... -
51单片机学习笔记,4*4矩阵键盘
2012-07-27 21:59 5720今天学习了下矩阵键盘, 4*4, 分别代表0~F这16个数 ... -
51单片机学习笔记:可对时电子钟
2012-07-24 20:45 1765本篇是对上一篇的改进,昨天学习了第4章 中的独立键盘的使用 ... -
51单片机学习笔记,简易时钟
2012-07-19 16:31 2009使用芯片STC89C52RC, 2个锁存器 6个带小数点共阴 ...
相关推荐
STM32f103VE通过IIC读写24C02存储器,完成对于存储器的数据读写和写入。使用Cortex-M3 IIC通讯方法;Cortex-M3数据从24C02存储器进行读写;使用STM32CubMX软件,正确配置STM32 IIC;操控STM32 实现对24C02存储器的...
51单片机IIC总线操作及24c02指定地址的读写 在本文中,我们将探讨51单片机的IIC总线操作和24c02指定地址的读写。我们的目标是使用STC89C58RD+单片机实现对24c02的读写操作,并将读取的数据显示在数码管上。 一、...
本主题聚焦于软件模拟IIC总线在MSP430F149微控制器上实现对24C02电可擦可编程只读存储器(EEPROM)的读写操作。 24C02是一款两线制(IIC)接口的EEPROM,具有256个字节的存储空间,通常用于存储小量非易失性数据,...
清晰明确的操作思路 详细的注释 通过IIC总线读写AT24C02B(EEPROM),同时用LED反映读出数据状态
在本文中,我们将探讨如何在STM32F103芯片上,利用Keil MDK5开发环境,通过软件模拟IIC(Inter-Integrated Circuit)协议来实现对24C02 EEPROM的读写操作。 24C02是一种常见的I2C接口的EEPROM,它具有2Kbit的存储...
在本文中,我们将深入探讨如何使用51单片机模拟IIC(Inter-Integrated Circuit)协议来与24C02 EEPROM进行通信,以实现数据的读写操作。IIC协议是一种两线制的串行通信协议,由Philips(现为NXP)公司开发,用于在...
### STM32 模拟 IIC 读写 AT24C02 程序解析 #### 一、概述 本篇文章将详细解读一个使用STM32微控制器通过模拟I2C接口对AT24C02 EEPROM进行读写的程序。AT24C02是一种非易失性存储器(EEPROM),它可以通过I2C总线...
51单片机Proteus仿真实例 IIC-24C04与蜂鸣器实验51单片机Proteus仿真实例 IIC-24C04与蜂鸣器实验51单片机Proteus仿真实例 IIC-24C04与蜂鸣器实验51单片机Proteus仿真实例 IIC-24C04与蜂鸣器实验51单片机Proteus仿真...
本文将详细介绍如何使用STM32进行24C02存储器的读写操作,并通过模拟IIC(Inter-Integrated Circuit)协议来实现这一过程。 首先,IIC协议是一种多主机、两线接口,用于连接微控制器和其他外围设备。在STM32中,...
标题中的"GPIO模拟IIC,通信AT24C02"指的是使用STM32F7微控制器的GPIO端口来模拟I2C通信协议,从而与AT24C02 EEPROM进行数据交换。AT24C02是一种常见的电可擦除只读存储器(EEPROM),常用于在嵌入式系统中存储小量...
在实际应用中,如例中所示,我们可能会用51单片机模拟IIC协议与EEPROM24C02进行通信。24C02是一种常见的IIC接口的存储器,有2K位(256×8位)的容量。编写相应的程序,可以使用51单片机的IO口模拟IIC协议,向24C02中...
本主题聚焦于模拟IIC与AT24C512的读写操作。AT24C512是一款256Kbit(32KB)的电可擦除可编程只读存储器(EEPROM),通常用于存储小量数据,如配置参数或用户设置。它支持IIC协议,因此可以方便地与微控制器进行通信...
在本实例中,我们将探讨如何利用 Proteus 仿真51单片机的IO口来模拟IIC(I2C)总线协议。IIC总线是由Philips公司开发的一种高效、简单的串行通信协议,适用于IC器件之间的通信,它只需要两条线——SDA(数据线)和...
标题"IIC.rar_51 IIC_IIC_iic 51_iic 单片机_模拟IIC At24C02"所提及的主题是51单片机使用模拟IIC(Inter-Integrated Circuit)通信协议来与AT24C02电可擦除可编程只读存储器(EEPROM)进行交互。描述进一步阐述了...
总结来说,模拟I2C读写24C256和24C02涉及了对I2C协议的理解、单片机的GPIO控制、C语言编程以及针对特定硬件的适配。这个过程对于嵌入式开发人员来说是一项重要的技能,因为它允许他们利用任何具有GPIO引脚的单片机与...
功能概述 ...模拟IIC总线读写24C02存储芯片 向24C02存储器写入数据 从24C02存储器中读取数据并显示到数码管 源码风格 编程规范达到企业级标准 工程文档分类明确 代码注释量大于50% 编程风格简洁一致
最新单片机仿真 对I2C总线上挂接多个AT24C02的读写操作最新单片机仿真 对I2C总线上挂接多个AT24C02的读写操作最新单片机仿真 对I2C总线上挂接多个AT24C02的读写操作最新单片机仿真 对I2C总线上挂接多个AT24C02的读写...
在本项目中,我们关注的是如何使用STM32F103的硬件IIC(Inter-Integrated Circuit)接口与24C02存储器进行通信。24C02是一款常见的I2C总线接口的E2PROM(电可擦除可编程只读存储器),通常用于存储小量非易失性数据...
标题中的“模拟IIC读写24C64”指的是使用飞思卡尔单片机(Microcontroller Unit,MCU)来模拟I2C(Inter-Integrated Circuit)通信协议,与24C64电可擦可编程只读存储器(Electrically Erasable Programmable Read-...
本文旨在介绍如何通过软件模拟实现51单片机中的IIC总线,使不带IIC总线接口的51单片机也能扩展IIC总线接口器件,并通过访问IIC总线接口芯片EEPROM AT24C02作为实例,给出具体的程序实现过程。 #### IIC总线的工作...