如何使用单片机模拟读写24C01EEPROM数据

合集下载

PIC读写24LCxx系列的EEPROM的实例C语言程序

PIC读写24LCxx系列的EEPROM的实例C语言程序

PIC:读写24LCxx系列的EEPROM的实例C语言程序//********************************************************* //* Using I2C Master Mode for access Slave (EEPRM)//*//* Written by: Richard Yang//* Sr. Corporate Application Engineer//* Microchip Technology Inc.//* Date: Oct. 3nd '2002//* Revision: 1.00//* Language tools : MPLAB-C18 v2.09.13//* MPLINK v3.10//* MPLAB-IDE v6.00.17 & ICD2 //***********************************************************/* Include Header files */#i nclude <p18f452.h>#i nclude <i2c.h> // Load I2C Header file from defult direct#i nclude <timers.h>#i nclude "P18LCD.h" // Load P18LCD Header file form current working direct/* Declare the Function Prototype */void Initialize_I2C_Master(void);void EE_Page_Write(unsigned char,unsigned char,unsigned char,unsigned char *); void EE_SEQU_Read(unsigned char,unsigned char,unsigned char,unsigned char *);void EEPROM_Write(unsigned char,unsigned char,unsigned char);void EEPROM_ACK(unsigned char);unsigned char EEPROM_Read(unsigned char,unsigned char);void I2C_Done(void);void Initialize_Timer2(void);void isr_high_direct(void);void isr_high(void);#pragma romdata My_romdata=0x1000const rom far unsigned char LCD_MSG1[]="SW2: Byte Write ";const rom far unsigned char LCD_MSG2[]="SW6: Random Read";const rom far unsigned char LCD_MSG3[]="Byte Write Mode ";const rom far unsigned char LCD_MSG4[]="Random Read Mode";const rom far unsigned char LCD_MSG5[]="Sended: ";const rom far unsigned char LCD_MSG6[]="Send: ";const rom unsigned char I2C_Write_Buffer[]="Microchip Technology";#pragma romdata/* Define following array in data memory */unsigned char I2C_Read_Buffer [32];/* define following variable in data memory at Access Bank */#pragma udata access My_RAMnear unsigned char Debounce;near unsigned char Send_Addr;near unsigned char Send_Data;near unsigned char Send_Length;near unsigned char Read_Data;near unsigned char P_SW2;near unsigned char P_SW6;#pragma udata#define Page_Length 8#define SW2 PORTAbits.RA4#define SW6 PORTEbits.RE1#define Bounce_Time 6#define EE_CMD 0xA0//***********************************************************/* *//* Main Program *//* *///***********************************************************void main(void){ADCON1=0b00000110; // Disable A/D FunctionTRISAbits.TRISA4=1; // Set SW2 for inputTRISEbits.TRISE1=1; // Set SW6 for InputInitialize_Timer2( );Initialize_I2C_Master( );OpenLCD( );if (SW2 & SW6)Debounce=0;else Debounce = Bounce_Time;while(1){LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG1);LCD_Set_Cursor(1,0); // Put LCD Cursor on (1,0)putrsLCD(LCD_MSG2);P_SW2=P_SW6=0;Send_Addr=0;while(1){if (P_SW2){P_SW2=0;Debounce = Bounce_Time;LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG3);LCD_Set_Cursor(1,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG5);do{while (!P_SW2);P_SW2=0;LCD_Set_Cursor(1,8);Send_Data=I2C_Write_Buffer[Send_Addr];EEPROM_Write(EE_CMD,Send_Addr,Send_Data);puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Send_Addr);putcLCD(' ');puthexLCD(Send_Data);EEPROM_ACK(EE_CMD);Send_Addr++;} while (I2C_Write_Buffer[Send_Addr]!=0x00);break;}if (P_SW6){P_SW6=0;Debounce = Bounce_Time;LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG4);LCD_Set_Cursor(1,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG6);while(1){if (P_SW6){P_SW6=0;LCD_Set_Cursor(1,5);Read_Data = EEPROM_Read(EE_CMD,Send_Addr);puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Send_Addr);putcLCD(' ');puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Read_Data);Send_Addr++;}if (P_SW2) break;}if (P_SW2) break;}if (P_SW2){P_SW2=0;break;}}}}//************************************************ //* #pragma Interrupt Declarations *//* *//* Function: isr_high_direct *//* - Direct execution to the actual *//* high-priority interrupt code. *//************************************************ #pragma code isrhighcode = 0x0008void isr_high_direct(void){_asm //begin in-line assemblygoto isr_high //go to isr_high function_endasm //end in-line assembly}#pragma code//************************************************ //* Function: isr_high(void) *//* High priority interrupt for Timer2 * //************************************************#pragma interrupt isr_highvoid isr_high(void){PIR1bits.TMR2IF=0; // Clear Timer2 interrupt Flagif (Debounce==0){if (!SW2){ P_SW2=1; Debounce =Bounce_Time; }if (!SW6){ P_SW6=1; Debounce =Bounce_Time; }}else if (SW2 & SW6)Debounce--;else Debounce =Bounce_Time;}#pragma code//*********************************************** //* Write a Byte to EEPROM//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - data : Data Byte of EEPROM//***********************************************void Initialize_Timer2(void){RCONbits.IPEN=1; // Enable Interrupt Priority bitIPR1bits.TMR2IP=1; // Set Timer2 for High PriorityINTCONbits.GIEH=1; // Enable High Priority InterruptOpenTimer2 (TIMER_INT_ON // Turn On the Timer2 with Interrupt & T2_PS_1_4 // (4Mhz/4) [4*10*(99+1)] = 4mS */& T2_POST_1_10);PR2 = 99;}//*********************************************** //* Write a Byte to EEPROM *//* - ctrl : Control Byte of EEPROM *//* - addr : Location of EEPROM *//* - data : Data Byte of EEPROM *//*********************************************** void EEPROM_Write(unsigned char ctrl,unsigned char addr,unsigned char data){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completed and clear SSPIF flagWriteI2C(ctrl); // Write Control+Write to EEPROM & Check BF flagwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();WriteI2C(data); // Write Data to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();StopI2C(); // Stop conditionI2C_Done(); // Wait the Stop condition completed}//***********************************************//* Pae Write to EEPROM//*//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - length : Write counter//* - *dptr : RAM point --> EEPROM//*//***********************************************void EE_Page_Write(unsigned char ctrl,unsigned char addr,unsigned char length,unsigned char *dptr){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control+Write to EEPROM & Check BF flagwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();while (length!=0) // Check write completed ?{WriteI2C(*dptr); // Write data to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();dptr++; // Point to next bytelength--;}StopI2C(); // Stop conditionI2C_Done(); // Wait the Stop condition completed}//***********************************************//* EEPROM Acknowledge Polling *//* -- The routine will polling the ACK *//* response from EEPROM *//* -- ACK=0 return *//* -- ACK=1 send Restart & loop check *//***********************************************void EEPROM_ACK(unsigned char ctrl){unsigned char i;IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROM (WRITE)I2C_Done(); // Clear SSPIF flagwhile (SSPCON2bits.ACKSTAT) // test for Acknowledge from EEPROM{for (i=0;i<100;i++); // Delay for next Repet-StartRestartI2C(); // initiate Repet-Start conditionI2C_Done(); // Wait Repet-Start condition completedWriteI2C(ctrl); // Write Control to EEPROM (WRITE)I2C_Done(); // Clear SSPIF flag}StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is over}//*********************************************** //* Random Read a Byte from EEPROM *//* - ctrl : Control Byte of EEPROM (Write) *//* (Ctrl +1 ) : Read Command *//* - addr : Address Byte of EEPROM *//* - Return : Read Data from EEPROM *//*********************************************** unsigned char EEPROM_Read(unsigned char ctrl,unsigned char addr){unsigned char f;IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROM while(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROM while(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagRestartI2C(); // initiate Restart conditionI2C_Done();WriteI2C(ctrl+1); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagf=ReadI2C(); // Enable I2C Receiver & wait BF=1 until received dataI2C_Done(); // Clear SSPIF flagNotAckI2C(); // Genarate Non_Acknowledge to EEPROMI2C_Done();StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is overreturn(f); // Return Data from EEPROM}//***********************************************//* Sequential Read from EEPROM//*//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - length : Read counter//* - *dptr : Store EEPROM data to RAM//*//***********************************************void EE_SEQU_Read(unsigned char ctrl,unsigned char addr,unsigned char length,unsigned char *dptr){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagRestartI2C(); // initiate Restart conditionI2C_Done();WriteI2C(ctrl+1); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // Test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagwhile (length!=0){*dptr=ReadI2C(); // Enable I2C Receiver & Store EEPROM data to Point bufferI2C_Done();dptr++;length--;if (length==0) NotAckI2C();else AckI2C(); // Continue read next data, send a acknowledge to EEPROMI2C_Done();}StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is over}//***********************************************//* Check I2C action that is completed *//***********************************************void I2C_Done(void){while (!PIR1bits.SSPIF); // Completed the action when the SSPIF is Hi.PIR1bits.SSPIF=0; // Clear SSPIF}//************************************************ //* Initial I2C Master Mode with 7 bits Address *//* Clock Speed : 100KHz @4MHz *//************************************************void Initialize_I2C_Master(void){OpenI2C(MASTER,SLEW_ON);SSPADD= 9;}。

MCU读写HT24系列EEPROM的应用范例

MCU读写HT24系列EEPROM的应用范例

HT48 MCU读写HT24系列EEPROM的应用范例文件编码:HA0016s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT48系列单片机的接口部分是CMOS 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,则HT48 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)使用说明:本文是以HT48R30A-1控制HT24LC04为例的。

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

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 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void 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个数码管。

24Cxx I2C EEPROM字节读写驱动程序

24Cxx I2C EEPROM字节读写驱动程序
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit(0xa0 | page); //写页地址和操作方式,对于24C32-24C256,page不起作用
ACK(ห้องสมุดไป่ตู้;
if(eepromtype>IIC24C16) //如果是24C01-24C16,地址为一字节;24C32-24C256,地址为二字节
调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18
函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit( (address<<1) | 0x01); //写页地址和操作方式
ACK();
while (i--)
{
SDA=1;
#include "reg51.h"
#include "intrins.h"
sbit SCL= P2^7;
sbit SDA= P2^6;
enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128,IIC24C256};

单片机模拟I2C总线读写EEPROM(24CXX)程序一

单片机模拟I2C总线读写EEPROM(24CXX)程序一

单片机模拟I2C总线读写EEPROM(24CXX)程序一下面是一个最简单的读写程序,可以用来检测线路状况。

先附上程序和电路,后面附有说明。

电路:说明:P2 口的LED 都是我用来检测电路执行到哪一步的,个人觉得一目了然。

程序:#include #define unit unsigned int#define uchar unsigned charint ok;sbit scl=P0;sbit sda=P0;sb it led0=P2;sbit led1=P2;sb it led2=P2 ;sbit led3=P2;sb it led4=P2;sb it led5=P2 ;sbit led6=P2;sb it led7=P2;delay(void) //delay{ int i; led1=1; for(i=0;istart(void) //start{ sda=1; scl=1; delay(); sda=0; delay(); scl=0; led0=0;}stop(void) //stop{ sda=0; scl=1; delay(); sda=1; delay(); scl=0;}checkanswer(void) //check answer{ sda=1; scl=1; if(sda==1) { F0=1; led7=0; } scl=0; led3=0;}sendabyte(int temps) //send a byte{ uchar n=8; while(n--) { led2=1; if((temps&0x80)==0x80){ sda=1; scl=1; delay(); scl=0;}else{ sda=0; scl=1; delay(); scl=0;}temps=tempsreciveabyte() //recive a byte{ uchar n=8,tempr; while(n--) {//uchar idata *abyte scl=1;tempr=temprmain(void) //MAIN{start();sendabyte(0xa0);checkanswer();if(F0==1) return;sendabyte(0x00);checkanswer();if(F0==1) return;sendabyte(0x11);checkanswer();if(F0==1) return;/*-----------------------*/start(); sendabyte(0xa0);checkanswer();if(F0==1) return;。

24c01存储器读写代码

24c01存储器读写代码

** 入口参数:无** 出口参数:无**************************************************************************/ void iic_init(void){PINSEL0 |= (PINSEL0 & (~0xF0)) | 0xa <<20;I22SCLH = (11059200/400000 + 1) / 2; /* 设定I2C2时钟*/I22SCLL = (11059200/400000)/2;I22CONCLR = 0x6c ;I22CONSET = 0x40 ;/*I2C2中断开启控制*/VICIntSelect = 0x00000000; /* 设置所有通道为IRQ中断*/VICVectPriority30 = 5 ; /* I2C2通道分配到IRQ slot0,最高优先级*/VICVectAddr30 = (uint)IRQ_I2C2; /* 设置I2C2中断向量*/VICIntEnable = (1 << 30); /* 使能I2C2中断*/}/**************************************************************************** 函数名次:延时程序。

** 入口参数:延时时间。

** 出口参数:无**************************************************************************/ void DelayNS (int32 dly){int i;for ( ; dly>0; dly--)for (i=0; i<50000; i++);}/**************************************************************************** 函数名次:通用异步收发器(UART)0发送程序。

24C01-24C256共9种EEPROM的字节读写操作程序

24C01-24C256共9种EEPROM的字节读写操作程序

24C01-24C256共9种EEPROM的字节读写操作程序一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。

此程序结构性良好,具有极好的容错性,程序机器码也不多:#pragma ot(6,SIZE)#include#include#define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M 24256};enum eepromtype EepromType;//DataBuff为读写数据输入/输出缓冲区的首址//ByteQuantity 为要读写数据的字节数量//Address 为EEPROM的片内地址//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;/************************************************************** *********************/bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,unsigned char ControlByte,enum eepromtype EepromType) {void Delay(unsigned char DelayCount);void IICStart(void);void IICStop(void);bit IICRecAck(void);void IICNoAck(void);void IICAck(void);unsigned char IICReceiveByte(void);void IICSendByte(unsigned char sendbyte);unsigned char data j,i=ERRORCOUNT;bit errorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((unsigned char)(Address>>8)); if(IICRecAck())continue;}IICSendByte((unsigned char)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0; //********clr errorflagwhile(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte(); //read last byte data IICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************以下是对IIC总线的操作子程序***//*****************启动总线**********************/ void IICStart(void){SCL=0; //SDA=1;SCL=1;_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();SCL=0;SDA=1; //}/*****************停止IIC总线****************/ void IICStop(void){SCL=0;SDA=0;SCL=1;_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();SCL=0;}/**************检查应答位*******************/bit IICRecAck(void){SCL=0;SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();CY=SDA; //因为返回值总是放在CY中的SCL=0;return(CY);}/***************对IIC总线产生应答*******************/ void IICACK(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();}/*****************不对IIC总线产生应答***************/void IICNoAck(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;}/*******************向IIC总线写数据*********************/void IICSendByte(unsigned char sendbyte){unsigned char data j=8;for(;j>0;j--){SCL=0;sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;SDA=CY;SCL=1;}SCL=0;}/**********************从IIC总线上读数据子程序**********/ unsigned char IICReceiveByte(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--);}。

EEPROM---AT24Cxx应用介绍

EEPROM---AT24Cxx应用介绍

EEPROM---AT24Cxx应⽤介绍结论:1、读写AT24CXX芯⽚,根据容量有多种⽅式:⼀、容量为AT24C01~AT24C16,⾸先发送设备地址(8位地址),再发送数据地址(8位地址),再发送或者接受数据。

⼆、AT24C32/AT24C64~AT24C512,⾸先发送设备地址(8位地址),再发送⾼位数据地址,再发送地位数据地址,再发送或者接受数据。

三、容量AT24C1024的芯⽚,是把容量⼀和容量⼆的⽅法结合,设备地址中要⽤⼀位作为数据地址位,存储地址长度是17位。

2、它的设备地址根据容量不同有区别: 1)、AT24C01~AT24C16:这⼀类⼜分为两类,分别为AT24C01/AT24C02和AT24C04~AT24C16;他们的设备地址为⾼7位,低1位⽤来作为读写标⽰位,1为读,0为写。

*1*、AT24C01/AT24C02。

AT24C01/AT24C02的A0、A1、A2引脚作为7位设备地址的低三位,⾼4为固定为1010B,低三位A0、A1、A2确定了AT24CXX的设备地址,所以⼀根I2C线上最⼤可以接8个AT24CXX,地址为1010000B~1010111B。

*2*、AT24C04~AT24C16的 A0、A1、A2只使⽤⼀部分,不⽤的悬空或者接地(数据⼿册中写的是悬空不接)。

举例:AT24C04只⽤A2、A1引脚作为设备地址,另外⼀位A0不⽤悬空,发送地址中对应的这位(A0)⽤来写⼊页寻址的页⾯号,⼀根I2C线上最⼤可以接4个,地址为101000xB~101011xB 2)、AT24C32/AT24C64:和AT24C01/AT24C02⼀样,区别是,发送数据地址变成16位。

注意事项:对AT24C32来说,WP置⾼,则只有四分之⼀受保护,即0x0C00-0x0FFF。

也就是说保护区为1KBytes。

对于低地址的四分之三,则不保护。

所以,如果数据较多时,可以有选择地存储。

实验十四 SMbus串行EEPROM数据读写实验 (1)

实验十四 SMbus串行EEPROM数据读写实验 (1)

实验十四SMbus串行EEPROM数据读写实验一、实验目的∙了解SMbus(I2C)总线的标准及使用。

∙熟悉24C01的芯片的功能。

∙掌握用I2C总线方式读写串行EEPROM 24C01的方法。

二、实验说明1.串行EEPROM(24C01)接口方法在新一代单片机中,无论总线型还是非总线型单片机,为了简化系统结构,提高系统的可靠性,都推出了芯片间的串行数据传输技术,设置了芯片间的串行传输接口或串行总线。

串行总线扩展接线灵活,极易形成用户的模块化结构,同时将大大简化其系统结构。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时还具有工作电压宽,抗干扰能力强,功耗低,资料不宜丢失和支持在线编程等特点。

目前,各式各样的串行接口器件层出不穷,如:串行EEPROM,串行ADC/DAC,串行时钟芯片,串行数字电位器,串行微处理器监控芯片,串行温度传感器等等。

串行EEPROM是在各种串行器件应用中使用较频繁的器件,和并行EEPROM相比,串行EEPROM的资料传送的速度较低,但是其体积较小,容量小,所含的引脚也较少。

所以,它特别适合于需要存放非易失性资料,要求速度不高,引脚少的单片机的应用。

2.串行EEPROM及其工作原理串行EEPROM中,较为典型的有ATMEL公司的AT24CXX系列以及该公司生产的AT93CXX 系列,较为著名的半导体厂家,包括Microchip,国家半导体厂家等,都有AT93CXX系列EEPROM 产品。

AT24CXX系列的串行电可改写及可编程只读存储器EEPROM有10种型号,其中典型的型号有AT24C01A/02/04/08/16等5种,它们的存储容量分别是1024/2048/4096/8192/16384位,也就是128/256/512/1 024/2048字节。

这个系列一般用于低电压,低功耗的工业和商业用途,并且可以组成优化的系统。

信息存取采用2线串行接口。

这里例举24C01的结构特点。

K24C系列EEPROM烧写操作流程

K24C系列EEPROM烧写操作流程

K24C系列EEPROM烧写操作流程一:烧录器型号适用于K24C系列EEPROM的烧录器有:周立功EasyPro系列,SmartPro系列、LPC Pro 等二:烧写步骤1)确认烧录器、软件版本支持烧录该型号之组件。

2)将烧录器与电脑连接,并上电。

3)将EEPROM装入烧录器的插座中(注意方向)。

4)鼠标双击桌面上的快捷图标SmartPRO Programmer, 见下图5)弹出下图对话框,选择烧录器的型号,并点击OK。

若无需选择直接跳过这一步。

6)选择好型号后,您可以看到以下界面。

7)“芯片”菜单,点击“选择芯片”,或在快捷工具栏中点击“选择”。

见下图参见下图红色标记处。

9)打开“选项”菜单,点击“系统设置”,或点击快捷工具栏内的“设置”,参见下图10)在设置对话框内选中所需设置,点击“确定”。

11)点击“编辑”菜单,选择“编辑缓冲区”或“填充缓冲区”,或点击“打开”菜单其中:“编辑缓冲区”您可以进行所有字节编辑,填写您所需数据。

光标停留处可以通过键盘输入。

“填充缓冲区”您可以对所有字节进行编辑,但填充的数据是单一的。

当然您可以通过“打开”文件菜单,导入您所需要的hex文件。

12)若您对每个芯片设置不同的ID,可以点击“芯片”菜单,选择“芯片编号”13)在“芯片编号”对话框中填写您要设定的不同ID的地址段,变化量(自增步长),初始值,自增方式。

例如,我要求每个芯片除了00000040h---00000045h的数据不同,其余地址数据都相同,那么在“自增首址”中填入00000040h,“自增末址”中填入00000045h,自增步长为“1”,初始文件为“00”。

既第一个芯片的00000040h的数据为00,第二个芯片的00000040h的数据为01,其余数据都相同。

14)点击快捷工具栏的“编程”,开始烧录数据。

见下图,若您进行了第12、13步的操作,请在“芯片编号自增”栏打勾。

15)编程结束后,您可以选择“校验”,对烧录好的数据进行对比是否出错。

IAR STM8 24C02 24cxx 读写程序

IAR STM8 24C02 24cxx 读写程序
asm("nop"); /*5.0us*/ asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop");
asm("nop");
asm("nop");
I2C_SCL=0;
//只有在低电平时,才允许修改 SDA 数据
F_delay_5us_24Cxx();
I2C_SDA=1;
//Start 是在 SCL 为高时,SDA 为下降沿
F_delay_5us_24Cxx();
I2C_SCL=1;
F_delay_5us_24Cxx();
I2C_SDA=0;
/*发送起始信号*/
else
date &= 0xfe;
I2C_SCL=0;
F_delay_5us_24Cxx();
}
return date;
}
/*==============================================================================
=
将数据写入 24Cxx 里面
F_delay_5us_24Cxx();
for(uchar i=0;i<8;i++) /*要传送的数据长度为 8 位*/
{
I2C_SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
F_delay_5us_24Cxx();

24c01存储器读写代码

24c01存储器读写代码

** 入口参数:无** 出口参数:无**************************************************************************/ void iic_init(void){PINSEL0 |= (PINSEL0 & (~0xF0)) | 0xa <<20;I22SCLH = (11059200/400000 + 1) / 2; /* 设定I2C2时钟*/I22SCLL = (11059200/400000)/2;I22CONCLR = 0x6c ;I22CONSET = 0x40 ;/*I2C2中断开启控制*/VICIntSelect = 0x00000000; /* 设置所有通道为IRQ中断*/VICVectPriority30 = 5 ; /* I2C2通道分配到IRQ slot0,最高优先级*/VICVectAddr30 = (uint)IRQ_I2C2; /* 设置I2C2中断向量*/VICIntEnable = (1 << 30); /* 使能I2C2中断*/}/**************************************************************************** 函数名次:延时程序。

** 入口参数:延时时间。

** 出口参数:无**************************************************************************/ void DelayNS (int32 dly){int i;for ( ; dly>0; dly--)for (i=0; i<50000; i++);}/**************************************************************************** 函数名次:通用异步收发器(UART)0发送程序。

如何利用PIC16F877A单片机读写AT24C系列储存器

如何利用PIC16F877A单片机读写AT24C系列储存器

如何利用PIC16F877A单片机读写AT24C系列储存器
AT24C系列在增强型PIC实验板上编程的硬件原理图如下图所示,U7为实验板上24C02芯片,SDA与单片机的RB5口相连,SCL与单片机RB4相连,七段数码管D5、D7、D8组成了显示单元,字形码的数据通过RC口送入,各数码管的显示片选信号分别不同的RA口进行控制。

在MPLab IDE软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。

编写的程序代码如下,其中程序流程图如下图所示。

软件代码
编好程序后将编译好的HEX码通过ICD2仿真烧写器烧入单片机芯片,上电运行,主程序中在O×01地址写入了“O×55”,在O×02地址写入了“O×aa”,然后在while循环中读出O×02地址的值,也就是我们之前写入的“O×55”,读出后显示在数码管上,我们可以看到数码管显示“170”,即“O×aa”相应的十进制数。

EEPROM------AT24C01A_IIC总线驱动读写程序

EEPROM------AT24C01A_IIC总线驱动读写程序

/*河北工程大学信电学院自动化系调试成功EEPROM------A T24C01A_IIC总线驱动读写程序晶振:6MHz目标板:STC90C52AD编译环境:Keil C uVision V2.38a*/#include <reg52.h>#include <intrins.h>//由于是01A,1Kbit,故此这里第一个字节的读写格式是1010,A2,A1,A0,R/W #define Read_Addr 0xa1#define Write_Addr 0xa0#define uchar unsigned char//总线的定义,时钟线P1.0,数据线P1.1sbit SCL=P1^0;sbit SDA=P1^1;//短码数组uchar tab[]={2,5,6};void Start(){SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0; //可以视作第一个SCL=0}void Stop(){SDA=0;_nop_();SCL=1;_nop_();SDA=1;}//------------------------------------------------------------------------- bit Write_Byte(uchar DA TA){bit Ack;uchar i;for(i=0;i<8;i++){SDA=(bit)(DA TA&0x80);_nop_();SCL=1;_nop_();_nop_();SCL=0; //第九个SCL=0DA TA<<=1;}SDA=1; //主机释放SDA_nop_();_nop_();SCL=1; //第九个SCL=1_nop_();//SDA=1; //对程序好像没出来影响Ack=SDA; //前面是否先置1,特别注意是否是准双向口SCL=0; //下一个字节的第一个SCL=0return (Ack);}uchar Read_Byte(){uchar DA TA,i;for(i=0;i<8;i++){SCL=1;DA TA<<=1;//注意强制类型转换SDA=1; //对程序好像没出来影响DA TA|=(uchar)SDA;//前面是否先置1,特别注意是否是准双向口SCL=0;}return(DA TA);}//-------------------------------------------------------------------------//读当前地址的数据uchar Read_Current_Addr(){uchar DA TA;Start();Write_Byte(Read_Addr);DA TA=Read_Byte();Stop();return(DA TA);}//向指定地址读数据uchar Read_Random_Addr(uchar addr) //256*8byte=1024Kbit,uchar类型正好合适{uchar DA TA;Start();Write_Byte(Write_Addr);Write_Byte(addr);DA TA=Read_Current_Addr();return(DA TA);}/*-------------------------------------------------------------功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针nContent开头的往下内容。

单片机读写24C01

单片机读写24C01

单片机读写24C01~24C16程序51单片机 2009-08-14 10:13 阅读150 评论0字号:大中小单片机读写24C01~24C16程序AT89S52 晶振频率为11.0592MHz 指令周期:1.0852us功能说明:24C01-16程序,能读写:24C01、24C02、24C04、24C08、24C16读出的数据送P1 口显示#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit sda=P3^7;//;模拟I2C 数据传送位sbit scl=P3^6;//;模拟I2C 时钟控制状态标志void delay1(uint z)//延时为1ms{uchar x,x1;for(;z>0;z--){for(x=0;x<114;x++){for(x1=0;x1<1;x1++);}}}void delay()//5us延时{_nop_();_nop_();_nop_();}void star()//开始{sda=1;delay();//5us延时scl=1;delay();//5us延时sda=0;delay();//5us延时}void stop()//停止{sda=0;delay();//5us延时scl=1;delay();//5us延时sda=1;delay();//5us延时}void ack()//应答{ uchar z=0;while((sda==1)&&(z<50))z++;//条件判断,sda=1,则没有应答。

如果没有应答则延时:z<50,z++;后返回scl=0;delay();//5us延时}///写一个数据函数//器件写地址slave_write_address//字节地址byte_address//待写入数据data_datavoid write(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据{uchar temp,temp1,i,ii;star();//开始for(ii=0;ii<3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}else if(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}else if(ii==2){temp=data_data;//送数据temp1=data_data;}for(i=0;i<8;i++){scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;// 相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1sda=1;elsesda=0;delay();//5us延时scl=1;delay();//5us延时scl=0;delay();//5us延时temp1=temp1<<1;//向左移出1位}sda=1;delay();//5us延时scl=1;delay();//5us延时ack();}stop();//停止}///读一个数据函数//器件写地址slave_write_address//器件读地址slave_read_address//字节地址byte_address//读出的数据data_dataread(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据{uchar temp,temp1,i,ii,x,data_data;star();//开始for(ii=0;ii<3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}else if(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}else if(ii==2){star();//开始temp=slave_read_address;//送器件读地址temp1=slave_read_address;}for(i=0;i<8;i++)//开始读数据{scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;// 相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1sda=1;elsesda=0;delay();//5us延时scl=1;delay();//5us延时scl=0;delay();//5us延时temp1=temp1<<1;//向左移出1位}sda=1;delay();//5us延时scl=1;delay();//5us延时ack();//应答}for(x=0;x<8;x++){data_data=data_data<<1;//向左移入1位sda=1;delay();//5us延时scl=0;delay();//5us延时scl=1;delay();//5us延时if(sda==1)//判断数据线是否是高电平data_data|=0x01;//把读到的数据或0X01//else//data_data|=0x00;}ack();//应答stop();//停止return data_data;//返回读到的数据}void main(){write(0xa0,0xff,0x66);//向器件写一个数据:(0xa0 是器件写地址;0xff 是字节地址;0x66 是待写入的数据)delay1(5);//写与读的时间间隔应大于5ms,取决于器件24C02的响应速度//向器件读一个数据//把读出的数据送P1口显示P1=read(0xa0,0xff,0xa1);//向器件读一个数据:(0xa0 是器件写地址;0xff 是字节地址;0xa1 是器件读地址)while(1);//跳转,相当于汇编指令JUMP $}//0x66==亮灭灭亮亮灭灭亮。

单片机EEPROM读写数据流程解析

单片机EEPROM读写数据流程解析

单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。

第二步,发送数据的存储地址。

24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。

第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。

在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。

EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。

这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。

这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。

第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。

第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。

这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。

第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,。

AT24C01应用实例

AT24C01应用实例

单片机模拟I2C总线及AT24C01应用实例 2006-2-25 逸风I 2 C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

I 2 C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。

例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。

可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

1. I2C总线特点I 2 C总线最主要的优点是其简单性和有效性。

由于接口直接在组件之上,因此I 2 C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。

总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。

I 2 C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。

一个主控能够控制信号的传输和时钟频率。

当然,在任何时间点上只能有一个主控。

2. I2C总线工作原理2.1 总线的构成及信号类型I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。

在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。

各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I 2 C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。

CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。

这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。

单片机模拟IC总线及CICEEPROM读写实例

单片机模拟IC总线及CICEEPROM读写实例

单片机模拟IC总线及C(IC EEPROM)读写实例单片机模拟I2C总线及24C02(I2C EEPROM)读写实例(源代码)浏览选项:大中小颜色默认灰度橄榄色绿色蓝色褐色红色/* 51系列单片机在使用时,有时需要模拟I2C总线,*/ /* 这里举出一个实例(读写串行EEPROM芯片at2402)*/ /************************************************************************//* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数*/ /* Language: C51单片机编程语言*//* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751 *//* Author: StephenZhu javasdk@ *//* Date: 2003年5月21日,5月22日,5月29日*/ /* Version: 1.1.1 *//* Others: None *//************************************************************************/#include&lt;string.h&gt;#include&lt;reg52.h&gt;#include&lt;intrins.h&gt;#define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/#define TRUE 1#define FALSE 0sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/sbit SDA=P1^6;/********** Function Definition函数定义************/void DELAY(unsigned int t) /*延时函数*/{while(t!=0)t--;}void I2C_Start(void){/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ SDA=1;SCL=1;DELAY(DELAY_TIME);SDA=0;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void I2C_Stop(void){/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/SDA=0;SCL=1;DELAY(DELAY_TIME);SDA=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void SEND_0(void) /* SEND ACK */{/*发送0,在SCL为高电平时使SDA信号为低*/SDA=0;SCL=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void SEND_1(void){/*发送1,在SCL为高电平时使SDA信号为高*/SDA=1;SCL=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}bit Check_Acknowledge(void){/*发送完一个字节后检验设备的应答信号*/ SDA=1;SCL=1;DELAY(DELAY_TIME/2);F0=SDA;DELAY(DELAY_TIME/2);SCL=0;DELAY(DELAY_TIME);if(F0==1)return FALSE;return TRUE;}void WriteI2CByte(char b)reentrant{/*向I2C总线写一个字节*/char i;for(i=0;i&lt;8;i++)if((b&lt;&lt;i)&amp;0x80)SEND_1();elseSEND_0();}char ReadI2CByte(void)reentrant{/*从I2C总线读一个字节*/char b=0,i;for(i=0;i&lt;8;i++){SDA=1; /*释放总线*/SCL=1; /*接受数据*/DELAY(10);F0=SDA;DELAY(10);SCL=0;if(F0==1){b=b&lt;&lt;1;b=b|0x01;}elseb=b&lt;&lt;1;}return b;}/**********以下为读写24c02的函数**********/ void Write_One_Byte(char addr,char thedata){bit acktemp=1;/*write a byte to mem*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr);/*address*/acktemp=Check_Acknowledge();WriteI2CByte(thedata);/*thedata*/acktemp=Check_Acknowledge();I2C_Stop();}void Write_A_Page(char *buffer,char addr){bit acktemp=1;bit wrtmp;int i;/*write a page to at24c02*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr);/*address*/acktemp=Check_Acknowledge();for(i=0;i&lt;7;i++){WriteI2CByte(buffer[i]);if(!Check_Acknowledge()){I2C_Stop();}}I2C_Stop();}char Read_One_Byte(char addr){ bit acktemp=1;char mydata;/*read a byte from mem*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr);/*address*/acktemp=Check_Acknowledge();I2C_Start();WriteI2CByte(0xa1);acktemp=Check_Acknowledge();mydata=ReadI2CByte();acktemp=Check_Acknowledge();return mydata;I2C_Stop();}void Read_N_Bytes(char *buffer,char n,char addr) {bit acktemp=1;int i=0;/*read 8 bytes from mem*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr);/*address*/acktemp=Check_Acknowledge();I2C_Start();WriteI2CByte(0xa1);acktemp=Check_Acknowledge();for(i=0;i&lt;n;i++){buffer[i]=ReadI2CByte();if(i!=n-1)SEND_0(); /*发送应答*/ elseSEND_1(); /*发送非应答*/ }I2C_Stop();}void main(){int i;char mybyte;char myarray[8];char myarray2[8];char rdarray[16];for(i=0;i&lt;8;i++){myarray[i]=i;myarray2[i]=i+0x08;}Write_One_Byte(0x20,0x28);Write_A_Page(myarray,0x10); Write_A_Page(myarray2,0x18);mybyte=Read_One_Byte(0x20); Read_N_Bytes(rdarray,16,0x10);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//函数名:i2c_readdata(ucharaddr);
voidi2c_writedata(ucharaddr,uchar*ptt)
{
uchari;
i2c_start();//产生启动信号
i2c_writebyte(0XA0);//I2C写指令和IC地址
i2c_writebyte(addr);//写EEPROM地址
for(i=0;i《8;i++,ptt++)//写8个数据
//出口参数:无
//函数作用:微妙延时
//说明:
voiddelayus(ucharTIme)
{
while(TIme--)
{
asm(“nop”);
}
}
//函数名:delayms(ucharTIme);
//入口参数:time
//出口参数:无
//函数作用:延时
//说明:
//***********************************************
如何使用单片机模拟读写24C01EEPROM数据
实验目的:
熟悉使用单片机模拟读写24C01EEPROM
1、首先向24C01EEPROM写入数据
2、在从24C01EEPROM中读取数据,并用LED显示
硬件设置:
1、SW4开关全部闭合
2、SW2开关1闭合,其它断开
3、SW3开关7和8闭合,其它断开
#include
#defineSDATRISC4
定义写入EEPROM数据
ucharcode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
定义读取EEPROM数据变量
ucharack,data[8];
//函数名:delayus(uchartime);
//入口参数:TIme
delayus(5);
SCL=1;
delayus(2);
data=data《《1;
if(RC4)//判断读取数据是否为1
{
data=data|0x01;
}
delayus(2);
}
SCL=0;
delayus(2);
return(data);//返回读取的数据
}
//***********************************************
}
//***********************************************
//函Байду номын сангаас名:i2c_writedata(ucharaddr,uchar*ptt);
//入口参数:addr,*ptt
//出口参数:无
//函数作用:按地址向EEPROM写数据块
//说明:
//***********************************************
//函数作用:产生启动信号
//说明:
//***********************************************
voidi2c_start(void)
{
SDA=1;//当SCL为高电平时使SDA产生一个负跳变
delayus(1);
SCL=1;
delayus(5);
SDA=0;
delayus(2);
voidi2c_stop(void)
{
SDA=0;//当SCL为高电平时使SDA产生一个正跳变
delayus(1);
SCL=1;
delayus(5);
SDA=1;
delayus(4);
}
//***********************************************
//函数名:i2c_writebyte(uchardata);
//说明:
//***********************************************
unsignedchari2c_readbyte(void)
{
uchardata,i;
data=0;
SDA=1;
for(i=0;i《8;i++)//读8位数据
{
delayus(1);
SCL=0;
else{SDA=0;}
delayus(1);
SCL=1;
delayus(5);
SCL=0;
data=data《《1;//写下一位
}
delayus(2);
SDA=1;
delayus(2);
SCL=1;
delayus(3);
while(RC4){;}//等待应答信号,RC4=0则有应答
SCL=0;
delayus(2);
SCL=0;//钳住I2C总线,准备发送数据或接收数据
delayus(2);
}
//***********************************************
//函数名:i2c_stop(void);
//入口参数:无
//出口参数:无
//函数作用:产生停止信号
//说明:
//***********************************************
voiddelayms(uchartime)
{
uinti;
while(time--)
{
for(i=93;i》0;i--){;}
}
}
//***********************************************
//函数名:i2c_start(void);
//入口参数:无
//出口参数:无
__CONFIG(0x3545);
//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护
//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器
#defineucharunsignedchar
#defineuintunsignedint
#defineSCLTRISC3
//入口参数:data
//出口参数:无
//函数作用:写一个字节函数
//说明:
//***********************************************
voidi2c_writebyte(uchardata)
{
uchari;
for(i=0;i《8;i++)//写8位数据
{
if(data}//先写高位
{
i2c_writebyte(*ptt);
}
i2c_stop();//产生停止信号
}
//***********************************************
//函数名:i2c_readbyte(void);
//入口参数:无
//出口参数:SSPBUF
//函数作用:从EEPROM读取一个字节数据
相关文档
最新文档