文档库 最新最全的文档下载
当前位置:文档库 › 适合AT24C01~AT24C256读写的通用程序

适合AT24C01~AT24C256读写的通用程序

适合AT24C01~AT24C256读写的通用程序
适合AT24C01~AT24C256读写的通用程序

#include

#include

#define ERROR 10

sbit SDA=P3^0;

sbit SCL=P3^1;

enum eepromtype

{AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};

enum eepromtype enumer;

unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 发送缓冲区*/

unsigned char buf2 [10]; /* 接收缓冲区*/

/* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,

此程序有五个入口条件,分别为读写数据缓冲区指针,

进行读写的字节数,EEPROM首址,EEPROM控制字节,

以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多: DataBuff为读写数据输入/输出缓冲区的首址

Length 为要读写数据的字节数量

Addr 为EEPROM的片内地址AT24256为0~32767

Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1, 表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;

enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256; 函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;

ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1

SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */

/* -----AT24C01~AT24C256 的读写程序------*/

bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,

unsigned char Control,enum eepromtype enumer)

{ void Delay(unsigned char DelayCount); /* 延时*/

void Start(void); /* 启动总线*/

void Stop(void); /* 停止IIC总线*/

bit RecAck(void); /* 检查应答位*/

void NoAck(void); /* 不对IIC总线产生应答*/

void Ack(void); /* 对IIC总线产生应答*/

unsigned char Receive(void); /* 从IIC总线上读数据子程序*/

void Send(unsigned char sendbyte); /* 向IIC总线写数据*/

unsigned char data j,i=ERROR;

bit errorflag=1; /* 出错标志*/

while(i--)

{ Start(); /* 启动总线*/

Send(Control & 0xfe); /* 向IIC总线写数据*/

if(RecAck()) continue; /* 如写正确结束本次循环*/ if(enumer > AT2416)

{ Send((unsigned char)(Addr >> 8));

if(RecAck()) continue;

}

Send((unsigned char)Addr); /* 向IIC总线写数据*/ if(RecAck()) continue; /* 如写正确结束本次循环*/ if(!(Control & 0x01))

{ j=Length;

errorflag=0; /* 清错误特征位*/

while(j--)

{ Send(*DataBuff++); /* 向IIC总线写数据*/

if(!RecAck()) continue; /* 如写正确结束本次循环*/ errorflag=1;

break;

}

if(errorflag==1) continue;

break;

}

else

{ Start(); /* 启动总线*/

Send(Control); /* 向IIC总线写数据*/

if(RecAck()) continue;

while(--Length) /* 字节长为0结束*/

{ *DataBuff ++= Receive();

Ack(); /* 对IIC总线产生应答*/

}

*DataBuff=Receive(); /* 读最后一个字节*/

NoAck(); /* 不对IIC总线产生应答*/

errorflag=0;

break;

}

}

Stop(); /* 停止IIC总线*/

if(!(Control & 0x01))

{ Delay(255); Delay(255); Delay(255); Delay(255);

}

return(errorflag);

}

/* * * * * 以下是对IIC总线的操作子程序* * * * */

/* * * * * * 启动总线* * * * */

void Start(void)

{ SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示*/ SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行*/ SCL=1;

_nop_(); _nop_(); _nop_();

SDA=0;

_nop_(); _nop_(); _nop_(); _nop_();

SCL=0;

SDA=1;

}

/* * * * * 停止IIC总线* * * * */

void Stop(void)

{ SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平*/ SDA=0; /*表示一个"停止"状态,该状态终止所有通讯*/

SCL=1;

_nop_(); _nop_(); _nop_(); /* 空操作*/

SDA=1;

_nop_(); _nop_(); _nop_();

SCL=0;

}

/* * * * * 检查应答位* * * * */

bit RecAck(void)

{ SCL=0;

SDA=1;

SCL=1;

_nop_(); _nop_(); _nop_(); _nop_();

CY=SDA; /* 因为返回值总是放在CY中的*/

SCL=0;

return(CY);

}

/* * * * *对IIC总线产生应答* * * * */

void Ack(void)

{ SDA=0; /* EEPROM通过在收到每个地址或数据之后, */

SCL=1; /* 置SDA低电平的方式确认表示收到读SDA口状态*/ _nop_(); _nop_(); _nop_(); _nop_();

SCL=0;

_nop_();

SDA=1;

}

/* * * * * * * * * 不对IIC总线产生应答* * * * */

void NoAck(void)

{ SDA=1;

SCL=1;

_nop_(); _nop_(); _nop_(); _nop_();

SCL=0;

}

/* * * * * * * * * 向IIC总线写数据* * * * */

void Send(unsigned char sendbyte)

{ unsigned char data j=8;

for(;j>0;j--)

{ SCL=0;

sendbyte <<= 1; /* 使CY=sendbyte^7; */

SDA=CY; /* CY 进位标志位*/

SCL=1;

}

SCL=0;

}

/* * * * * * * * * 从IIC总线上读数据子程序* * * * */ unsigned char Receive(void)

{ register receivebyte,i=8;

SCL=0;

while(i--)

{ SCL=1;

receivebyte = (receivebyte <<1 ) | SDA;

SCL=0;

}

return(receivebyte);

}

/* * * * * * * * 一个简单延时程序* * * * * * * * * * * * */

void Delay(unsigned char DelayCount)

{ while(DelayCount--);

}

/* -----AT24C01~AT24C256 的读写程序------*/

void main()

{ unsigned char Control,*p1,*p2;

unsigned char Length;

unsigned int addr ; /* 24Cxx片内地址*/

p1=buf1;p2=buf2;

addr=0; /* 片内地址AT24C256为0~32767 */

Length=8; /* 读写长度*/

enumer=AT24256; /* 读写AT24C256 */

Control=0xa0; /* 写操作*/

RW24xx(p1,Length,addr,Control,enumer); /* 写*/

Control=0xa1; /* 读操作*/

RW24xx(p2,Length,addr,Control,enumer); /* 读*/

}

/* 以上为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。在buf1中填入需要写入的内容,buf2的大小可根据需要定义。

addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。

本程序只要在调用的程序中定义实际参数即可,上述各子程序不必改动。*/

24C02读写程序

HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s 简介: HT24系列的EEPROM是通过I2C协议控制其读写的。HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。 HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。另外两个管脚为电源脚VCC,VSS。 用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。 引脚名称I/O 功能描述 A0~A2 I 地址输入 VSS I 电源负极输入 SDA I/O 串行数据输入/输出 SCL I 串行数据传送时钟信号输入 WP I 写保护 VCC I 电源正极输入 HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示: 型号引脚A0、A1及A2使用方法容量大小 HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、 A2数据和芯片引脚A0、A1、A2所接状态需一一对应 2K(256×8) HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据 和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空 4K(512×8, 2pages) HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2 所接状态需一一对应,其余引脚浮空 8K(1024×8, 4pages) HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

24c02读写程序教学资料

24c02读写程序

E2PROM芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (一)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):

我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。 (三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。 那么是不是所有I2C总线中的信号都必须符合上述的有效性呢?只有两个例外,就是开始和停止信号。 开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。 停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。 开始和结束信号的时序图如下图所示:

24c02读写程序大全

24c02读写程序大全 2C总线的应用(24C02子程序) // 对24C02的读、写 // extern void DelayMs(unsigned int); // extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes); // extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes); /***************************************************************************/ #define WriteDeviceAddress 0xa0 #define ReadDviceAddress 0xa1 #include #include #include /***************************************************************************/ sbit SCL=P2^7; sbit SDA=P2^6; bit DOG; /***************************************************************************/ void DelayMs(unsigned int number) { unsigned char temp; for(;number!=0;number--,DOG=!DOG) { for(temp=112;temp!=0;temp--) { } } } /***************************************************************************/ void Start() { SDA=1; SCL=1; SDA=0; SCL=0; } /***************************************************************************/ void Stop() { SCL=0; SDA=0;

ATMEGA16读写iic(TWI)(24c02) C语言程序

ATMEGA16读写iic(24c02) C语言程序测试通过 #include #include "I2C.h" #include "1602.h" #include "delay.h" /*通过AVR往I IC写数据,并通过串口把数据读出显示出来*/ //=============================================================== void UART_init(void) //UART初始化 { DDRD = 0x02; PORTD = 0x00; UCSRA = 0x02; /*无倍速*/ UCSRB = 0x18; /*允许接收和发送*/ UC SRC = 0x06; /*8位数据,1位停止位,无校验*/ UBRRH = 0x00; UBRRL = 12; /*9600*/ } //=============================================================== void USART_TXD(float data) //发送采用查询方式 { while( !(UCSRA & BIT(UDRE)) ); UDR=data; while( !(UCSRA & BIT(TXC )) ); UCSRA|=BIT(TXC); } void main(void) { unsigned char i; //LCD_init(); uart_init();//TART初始化 SEI(); //全局中断使能

while(1) {/* I2C_Write('n',0x00); I2C_Write('c',0x01); I2C_Write('e',0x02); I2C_Write('p',0x03); I2C_Write('u',0x04); */ i=I2C_Read(0x00); //LCD_write_char(0,0,i); USART_TXD(i); i=I2C_Read(0x01); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x02); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x03); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x04); //LCD_write_data(i); USART_TXD(i); } } /*上面上主函数部分*/ #include #include "delay.h" //I2C 状态定义 //MT 主方式传输 MR 主方式接受#define START 0x08 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58

STM32F103读写24C02程序使用过肯定能用

//实验24C02连接在PF口 //WP、A0、A1、A2都接地 #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #define AT24C02 0xa0 //AT24C02 地址 /******************************** 变量定义---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure; //GPIO ErrorStatus HSEStartUpStatus; unsigned char Count1 , Count2; unsigned int USEC; static vu32 TimingDelay; unsigned char Readzfc; unsigned char pDat[8] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}; unsigned char R_Dat[8]; /*********************************声明函数-----------------------------------------------*/ void RCC_Configuration(void); void SysTick_Configuration(void); void Delay_us_24C02(u32 nTime); /************************************24C02硬件接口******************************/ #define SData GPIO_Pin_6 //I2C 时钟 #define SCLK GPIO_Pin_7 //I2C 数据 /********************************宏定义*******************************************/ #define SCL(x) x ? GPIO_SetBits(GPIOF , SCLK) : GPIO_ResetBits(GPIOF , SCLK) #define SDA(x) x ? GPIO_SetBits(GPIOF , SData) : GPIO_ResetBits(GPIOF , SData) /********************************变量*******************************************/ u8 ack; /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA(1); //SDA=1; 发送起始条件的数据信号 Delay_us_24C02(1); SCL(1); //SCL=1; Delay_us_24C02(5); //起始条件建立时间大于4.7us,延时 SDA(0); //SDA=0; /*发送起始信号*/ Delay_us_24C02(5); // 起始条件锁定时间大于4μs

应广单片机读写24C02程序代码

应广单片机读写24C02程序代码 #include "extern.h" #include "main.h" //*************************************************** //*************************************************** //??ò?I2C?ó?ú I2C_SDA equ pb.2 I2C_SCL equ pb.0 I2C_SDA_DIR equ pbc.2 I2C_SCL_DIR equ pbc.0 I2C_LONG_DLY equ 50 I2C_SHORT_DLY equ 20 I2C_SDA_HIGH equ set1 I2C_SDA I2C_SDA_LOW equ set0 I2C_SDA I2C_SCL_HIGH equ set1 I2C_SCL I2C_SCL_LOW equ set0 I2C_SCL I2C_SDA_OUTPUT equ set1 I2C_SDA_DIR I2C_SDA_INPUT equ set0 I2C_SDA_DIR I2C_SCL_OUTPUT equ set1 I2C_SCL_DIR I2C_SCL_INPUT equ set0 I2C_SCL_DIR //??ò?I2C??á? uchar i2c_rw_addr; //?áD?μ??? uchar i2c_rw_byte; //?áD?êy?Y uchar i2c_rw_cmd; //?áD?μ????tμ??? uchar i2c_rw_temp; //?áD??y?ì?D????á? uchar i2c_rw_cnt; //?áD??y?ì?D????á? //---------------------------- //?úéúSTARTD?o? //---------------------------- i2c_start: I2C_SDA_OUTPUT

怎么实现对存储器24C02程序的读写

决 怎么实现24C02程序的读写 我是个新手,对24C02 一窍不通,请问怎么给24C02写程序。是不是要像给单片机写程序那样需要一个编程器,或是需要其他的什么软硬件。另外再给我介绍一些24C02的入门知识,谢谢。 问题补充: 24C02是不是只是一个存储器?使用它时需不需要专门给它写段程序再烧进去? 我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义: sbit SCL=P2^7; sbit SDA=P2^6; 在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。 写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。――――――――――――― #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include //包括一个52 标准内核的头文件 //本课试验写入一个字节到24c02 中 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 #define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址 #define ReadDviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6; sbit P10=P1^0; //定时函数 void DelayMs(uint number) { uchar temp; for(;number!=0;number--) { for(temp=112;temp!=0;temp--) ; } } //开始总线

E2PROM芯片24C02的读写程序

E2PR0M 芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的 串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (—)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL )。具有I2C 接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线 的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的 控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、 E2PROM、ADC各器件都是具有I2C总线接口的器件): SDA SCL|| || || || 微控制器LCD驱动ADC E2PR0M 我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据 线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非 常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。(三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须 一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保 持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于 4.7us。

24c02读写程序大全

51晶振为 〖文件〗 2001/09/18 --------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------- 调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18 函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata 调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18 函数说明:读取IIC芯片24CXX,指定地址address的数据。 -----------------------------------------------------------------------------------------------------------------*/ #include "" #include "" sbit SCL= P2^7; sbit SDA= P2^6; enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128 ,IIC24C256}; enum EEPROMTYPE eepromtype; delay() { unsigned int i=1200; while(i--); } /*---------------------------------------------------------------------------- 调用方式:write_8bit(unsigned char ch) ﹫2001/03/23 函数说明:内函数,私有,用户不直接调用。 -------------------------------------------------------------------------------*/ void write_8bit(unsigned char ch)

E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (一)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件): 我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。(三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

24c02典型程序

#include #include #include #define uchar unsigned char #define uint unsigned int #define adwrite 0xae //24c02地址(写) #define adread 0xaf //24c02地址(读) uchar num_wr[4]={'a','b','c','d'}; //存放写入数据(液晶显示abcd)//uchar num_rd[4]; //存放读24c02回的数据 /******************************************* 函数名称:delayms() 功能:延迟j毫秒 参数:char j 返回值:无 ********************************************/ void delayms(uchar j) { uint i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } /******************************************* 函数名称:rom_write() 功能:循环写进num个字节 参数:如下 返回值:无 ********************************************/ void rom_write(uchar date[],uchar address,uchar num) { uchar i; // 循环次数 iic_start(); iic_write(adwrite); // 24c02写地址 iic_ack(); iic_write(address); // 24c02起始存储地址写入可自动+1 iic_ack(); for(i=0;i

24C02数据读写

一这物行时每如一、认识IIC 这是最常用、物理结构上,行信息 传输。时钟。信息传每个器件都有如:存储器)C 总线的工作方最典型的II IIC 系统由一。在数据传输传输的对象和方有一个唯一的地。发送器或接方式 C 总线连接方一条串行数据输时,由主机初方向以及信息地址,而且可 接收器可以在IIC 时方式。 据线SDA 和一条初始化一次数息传输的开始可以是单接收的 在主模式或从模时序24C02的 条串行时钟线数据传输,主和终 止均由的器件(例如 模式下操作,的操作 线SCL 组成。主机使数据在S 主机决定。如:LCD 驱动器 这取决于芯片 主机按一定的SDA 线上传输 器)或者可以接 片是否必须启的通信协议向输的同时还通过接收也可以发启动数据的传从机寻址和进过SCL 线传输发送的器件(例传输还是仅仅被进输例被

寻1I 在低2I 寻址。 1.总线上数据IIC 总线是以在时钟线高电低电平时,才2.总线上的信IIC 总线在传据的有效性 串行方式传输电平期间数据线才允许数据线上信号 送数据过程中输数据,从数据线上必须保持上的电平状态 中共有四种类据字节的最高持稳定 的逻辑态变化,如图 类型信号,它们高位开始传送,辑电平状态,11-2所示。 们分别是:开,每一个数据位高电平为数据 开始信号、停止 位在SCL 上都据1,低电平为 止信号、重新都有一个时钟为数据0。只新开始信号和应脉冲相对应。有在时钟线为应答信号。 为

开的停停重之所开始信号(STA 的时候,例如停止信号(STO 停止信号,结重新开始信号之前,主机通所示,当SCL ART):如图1如,没有主动设OP):如图11结束数据通信。号(Repeated S 通过发送重新开L 为高电平时,1-3所示,当设备在使用总-3所示,当。 START):在I 开始信号,可,SDA 由高电当SCL 为高电总线(SDA 和S SCL 为高电平IC 总线上,由可以转换与当 电平向低电平跳平时,SDA 由CL 都处于高电平时,SDA 由低由主机发送一前从机的通信 跳变,产生重由高电平向低电电平),主机通低电平向高电一个开始信号启信模 式,或是 重新开始信号,电平跳变,产通过发送开始电平跳变,产生启动一次通信是切换到与另 ,它的本质就产生开始信号始(START)信号 生停止信号。信后,在首次另一个从机通信就是一个开始。当总线空闲号建立通信。主机通过发送次发送停止信号信。如图11-信号。 闲 送号3

好的24C02储存开机次数实验读写程序

24C02储存开机次数实验 24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。 串行EEPROM简称I2C总线式串行器件。串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。 I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。 我们通过一个实验来了解24C02的读写操作过程: 该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。 相关原理: 程序运行的照片:

接线方法: 1、接8位数码管的数据线。将数码管部份的数据口 JP5接到CPU部份的P0口JP51. 2、接8位数码管的显示位线。将数码管部份的显示位口 JP8接到CPU部份的P2口JP52. 3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。 烧写后用手按复位键可以看到数码管每按一下加一。 程序流程图:

汇编语言参考程序:SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000H AJMP MAIN ORG 0080H MAIN:

CLR P3.7 ;打开写保护 MOV DPTR,#TAB MOV A,#00H ;读地址 LCALL RD24 CJNE A,#10,TT TT: JNC TT1 AJMP TT2 TT1: MOV A,#00 TT2: MOV 30H,A MOVC A,@A+DPTR CLR P2.6 ;开数码管 MOV P0,A ;送显示 MOV A,30H INC A MOV B,A MOV A,#00H LCALL WT24 AJMP $ TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H RD24: PUSH ACC ;读24C02子程序。 SETB SDA24 CLR SCLK24 CALL START24 ;启动 MOV A,#0A0H CALL SHIFT8 ;移位 CALL ACK ;响应 POP ACC CALL SHIFT8 CALL ACK CALL START24 MOV A,#0A1H CALL SHIFT8 CALL ACK SETB SDA24 MOV R7,#8 CLR A SETB SDA24

STM32-24C02读写程序(亲自编写检验可用)

本文档内容为在STM32条件下的24C02读写程序。全文共分四部分,第一部分24C02的C程序,第二部分为24C02的.h程序,第三部分为端口与时钟配置函数,第四部分为主函数。下面分别进行介绍。 第一部分:24C02的.c函数 ******************************************************************************/ #include "stm32f10x.h" #include "system_config.h" #include "24C02.h" u8 savedata[10]={10,9,8,7,6,5,4,3,2,1}; /******************************************************************************* * Function Name : AT24C02_SDA_IO_SET(uchar io_set) * Description : SDA方向控制 * Input : None * Output : None * Return : None *******************************************************************************/ void AT24C02_SDA_IO_SET(unsigned char io_set) { GPIO_InitTypeDef GPIO_InitStructure; if(io_set) { GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//SDA 设置为输出

C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序: /* void start() //开始信号 void stop() //停止信号 void Ack() //发确认信号 void NoAck() //发无确认信号 void init()//初始化信号,拉高SDA和SCL两条总线 bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中 uchar read_byte()//读一字节,从AT24C02 中读一字节 bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询 //初始化EEPROM子程序内容为0XFF,nPage(0~31) void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFF void write_add(uchar address,uchar date)//向AT24C02 中写数据 //从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02 void write_flash(uchar *nContent,uchar nAddr, uchar nLen) uchar read_add(uchar address)//从AT24C02 中读出数据 //从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的

存储空间。 void read_flash(uchar *nContent,uchar nAddr, uchar nLen) */ /* 单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0 译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。包括2个四位一体数码管LG3641BH,共2x4=8个数码管。 数码管数据口为P0口。数码管为共阳4位一体数码管。 功能: 译码器输出为1——8个数码管的段选信号,轮流选择1——8数码管。 void display(uchar *nContent,uchar nLen)功能:在8段数码管上显示nLen个字符,这些字符存储在指针nContent开头的往下的内容中。 显示原理: 1、送出要显示的段数 2、P2译码,选择要显示的位 3、延时1——2ms,时间不能太长,否则会闪烁,也不能太短,否则会很暗。 4、取消段选,消隐! 若要显示多段,重复以上4步! */ #include #include #define uchar unsigned char #define uint unsigned int sbit L8 =P1^7; sbit P2_3 =P2^3; // 74HC138--/EI sbit P2_2 =P2^2; // 74HC138--A2 sbit P2_1 =P2^1; // 74HC138--A1 sbit P2_0 =P2^0; // 74HC138--A0 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e }; // 共阳数码管0——F sbit sda=P1^2; sbit scl=P1^0;

24C02读写练习详细(C语言新手细看)

24C02读写练习详细(C语言新手细看) #include #include #define OP_READ 0xa1 // 器件地址以及读取操作 #define OP_WRITE 0xa0 // 器件地址以及写入操作 #define MAX_ADDR 0x7f // AT24C02最大地址 unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff}; // 写入到AT24C01的数据串 sbit SDA = P3^4; sbit SCL = P3^3; void start(); void stop(); unsigned char shin(); bit shout(unsigned char write_data); unsigned char read_random(unsigned char random_addr); void write_byte( unsigned char addr, unsigned char write_data); void fill_byte(unsigned char fill_data); void delayms(unsigned char ms); main(void) { unsigned char i; SDA = 1; SCL = 1; fill_byte(0xff); // 全部填充0xff for(i = 0 ; i < 8; i++) //写入显示代码到AT24Cxx { write_byte(i, dis_code[i]); } i = 0; while(1) { P0 = read_random(i); // 循环读取24Cxx内容,并输出到P0口 i++;

24C02(IIC)读写操作

1. AT24C02写操作 首先我们来看一下写AT24C02。 一般步骤是: 1) 发送起始信号 2) 发送写器件地址 3) 等待应答 4) 发送要写入的24C02 的地址 5) 等待应答 6) 发送要写入的数据 7) 等待应答 8) 发送数据结束发送结束信号 具体程序如下: /****************************************************************************** * * 函数名: AT24Cxx_WriteOneByte * 函数功能: 24c02写一个字节地址数据 * 输入: addr dt * 输出: 无 ********************************************/ void AT24Cxx_WriteOneByte(u16 addr,u8 dt) { I2C_Start(); if(EE_TYPE>AT24C16) { I2C_Send_Byte(0xA0); I2C_Wait_Ack(); I2C_Send_Byte(addr>>8); //发送数据地址高位 } else { I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址 } I2C_Wait_Ack(); I2C_Send_Byte(addr%256);//双字节是数据地址低位 //单字节是数据地址低位 I2C_Wait_Ack(); I2C_Send_Byte(dt); I2C_Wait_Ack(); I2C_Stop(); delay_ms(10); } 2. AT24C02读操作 那么读取AT24C02 的步骤是:

相关文档