单片机模拟I2C总线及24C02(I2C EEPROM)读写实例

发布者:zhaodawei617最新更新时间:2020-03-10 来源: eefocus关键字:单片机  模拟I2C总线  24C02  EEPROM  读写实例 手机看文章 扫描二维码
随时随地手机看文章

/*     51系列单片机在使用时,有时需要模拟I2C总线,                      */

/*   这里举出一个实例(读写串行EEPROM芯片at2402)                       */

/************************************************************************/

/* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */

/* Language: C51单片机编程语言                                          */

/* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751     */

/* Author:  StephenZhu    javasdk@163.com                               */

/* Date: 2003年5月21日,5月22日,5月29日                                  */

/* Version: 1.1.1                            */

/* Others: None                                                         */

/************************************************************************/


    #include

    #include

    #include

    #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/

    #define TRUE 1

    #define FALSE 0


    sbit 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<8;i++)

            if((b<                SEND_1();

            else

                SEND_0();

    }


 


    char ReadI2CByte(void)reentrant

    {

        /*从I2C总线读一个字节*/

        char b=0,i;

        for(i=0;i<8;i++)

        {

            SDA=1;    /*释放总线*/

            SCL=1;    /*接受数据*/

            DELAY(10);

            F0=SDA;

            DELAY(10);

            SCL=0;

            if(F0==1)

                {

                    b=b<<1;

                    b=b|0x01;

                }

            else

                b=b<<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<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          {

                buffer[i]=ReadI2CByte();

                if(i!=n-1)

                    SEND_0();    /*发送应答*/

                else

                    SEND_1();    /*发送非应答*/

          }


   I2C_Stop();


}



void main()

{

          int i;

          char mybyte;

          char myarray[8];

          char myarray2[8];

          char rdarray[16];

          

          for(i=0;i<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);

[1] [2]
关键字:单片机  模拟I2C总线  24C02  EEPROM  读写实例 引用地址:单片机模拟I2C总线及24C02(I2C EEPROM)读写实例

上一篇:第一个单片机小程序
下一篇:5课:单片机延时程序分析

推荐阅读最新更新时间:2024-11-05 11:06

微控制器和超声波技术在汽车倒车检测系统中的应用
  倒车障碍检测系统对盲区内障碍物的探测   倒车障碍检测系统所采用的超声波传感器技术可以探测到附近的障碍物,为驾驶员提供倒车警告和辅助泊车功能,其原理是利用超声波探测倒车路径上或附近存在的任何障碍物,并及时发出警告。所设计的检测系统可以同时提供声光并茂的听觉和视觉警告,其警告表示是探测到了在盲区内障碍物的距离和方向。这样,在狭窄的地方不管是泊车还是开车,借助倒车障碍报警检测系统,驾驶员心理压力就会减少,并可以游刃有余地采取必要的动作。而这种PIC l8F8490微控制器与超声波传感器很便宜,并且可以用在众多车型上。   那末什么是基于超声波传感器的倒车障碍检测系统呢?为此应先了解超声波传感器的有关技术问题    超声
[单片机]
<font color='red'>微控制器</font>和超声波技术在汽车倒车检测系统中的应用
基于单片机的智能温度表课程设计
本设计选用AT89C51作为整个控制系统的核心部分,通过DS18B20采集温度,通过三个按键:模式切换键、加键和减键。模式切换键可以切换正常显示,上限温度设定状态,下限温度设定状态,当实测温度高于设定的上限值,蜂鸣器报警和LED红灯闪烁报警,当实测温度高于设定的下限值,蜂鸣器报警和LED黄灯闪烁报警,系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。 3.1 单片机的选型及简介 CPU是整个控制部分的核心。在考虑经济性和满足需求
[单片机]
基于<font color='red'>单片机</font>的智能温度表课程设计
[单片机框架][bsp层][cx32l003][bsp_led] LED配置和使用
LED是一种半导体器件,大家其实对LED并不陌生,各种电器的指示灯、手机键盘灯、LED液晶屏的背光、高亮LED手电筒等,都是通过LED发光的。LED有两种主要用途,一种是作为指示灯;另一种是照明。照明用的LED一般都是大功率LED,需要较大的电压电流才能正常工作。而这里我们要用到的则是用作指示灯的小功率LED。常见的小功率LED,在它的正负极加上3V左右的电压,就会发光,正常发光的时候,电流大概是2~5mA。这里要注意,LED有正负极之分,接反了不会发光。另外,电压也不可太高,那样会烧坏LED。 /*****************************************************************
[单片机]
单片机红外遥控风扇源程序
进行本实验前需要先完成《16_红外解码数码管显示》与《19_直流电机小风扇》实验。 然后对应的接上电机线和电机。 红外无线遥控风扇 + 加速 按- 减速,默认最低速度,烧录后可以按遥控器上的“+”加速。4~9档区间可以电机不会转动,着可能是因为用户供电电流不足。1-4档在接线正确的情况下几乎都可以转动。 注意:测试时间最好不要超过1分钟,观察一下实验现象即可。 单片机源程序如下: /* 红外无线遥控风扇 + 加速 按- 减速 */ #include reg52.h sbit DU = P2^6; //数码管段选 sbit WE = P2^7; //数码管位选 sbit S2 = P3^0; sbit S3 =
[单片机]
51单片机学习:定时器0实验
实验名称:定时器0实验 接线说明: 实验现象:下载程序后,D1指示灯间隔1s闪烁 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; /********************************************************************
[单片机]
基于单片机的温度记录系统
目前检测温度一般采用热电偶或热敏电阻作为传感器。这种传感器至仪表之间通常都要用专用的温度补偿导线,而温度补偿导线的价格很高,并且线路太长,会影响测量精度,这是直接以模拟量形式进行采集的不可避免的问题。在实际应用中,往往需要对较远处的温度信号进行监视。为此,设计了一种用单片机与数字温度传感器集成的方案,它可以以更低的成本和更高的精确度实现温度检测。 l 系统综述 系统硬件设计以Atmel公司的AT89S52单片机为核心,主要由电源电路、复位电路、晶振电路、串口通讯电路、温度传感器电路、12864液晶显示电路、I2C存储器电路以及按键输入电路构成。温度采集电路采用单总线数字温度传感器实现温度采集,可设计为一路或多路;温度存储电路采
[单片机]
基于<font color='red'>单片机</font>的温度记录系统
单片机软复位几种方法
如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用 复位 ,因为复位是纯硬件过程,软件是不可控的.但是我们还是要讨论方法,一般流传的方法如下: 1、放狗; 2、((void(code *)(void))0x0000)(); 3、用单片机一个引脚控制点一下RSTRST; 4、用单片机一个引脚控制重新加电; 5、用单片机自带的软件复位指令或内狗指令; 6、goto大法; 方法1: 放狗 是单片机软复位的最好办法,也基本上是唯一的一个办法。但并不是所有单片机都具备看门狗的功能,也不是一个万全之策。 办法2:这不是复位,只是把程序转到地址0
[单片机]
【GD32 MCU 入门教程】二、GD32 MCU 烧录说明 (2)SWD/JTAG在线下载
GD32系列MCU支持SWD和JTAG(部分型号不支持)接口进行下载调试,这些功能通过ARM CoreSight组件的标准配置和链状连接的TAP控制器来实现的。调试和跟踪功能集成在ARM Cortex-M内核中。调试系统支持串行(SW)调试和跟踪功能,部分型号也支持JTAG调试。调试和跟踪功能具体请参考下列文档: Cortex-M4技术参考手册; ARM调试接口V5结构规范。 目前GD32 MCU主要支持的调试下载设备有:J-linkV8/V9、U-link、标准的CMSIS-DAP调试工具如GD-link。SWD/JTAG的优势在于及下载和调试功能一体,可直接在集成开发环境IDE(如MDK、IAR)中进行下载和在线仿真。同时
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】二、GD32 <font color='red'>MCU</font> 烧录说明 (2)SWD/JTAG在线下载
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved