电子制作天地网站欢迎您的光临,欢迎提出宝贵意见或建议。本站信息产业部备案: 粤ICP备05114582号
单片机模拟I2C总线及24C02读写实例(c源代码)
24C02 read / write process

时间:2010-1-25 21:18:42 来源:互联网 作者:不详 编辑: 【关闭


单片机模拟I2C总线及24C02读写实例(c源代码),24C02 read / write process

关键字:单片机模拟I2C总线及24C02读写实例(c源代码)

单片机模拟I2C总线及24C02(I2C EEPROM)读写实例(c源代码)
/*     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的函数**********/见下一页面


◆相关文章◆
◆ 编辑推荐 ◆
用户:
更多评论
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。60个字以内
留言:
验证码:

免责声明:
●本站所有内容均来自网络,以学习为目的,如果侵犯了您的利益,请来信告知,立即删除,站长邮件为"diy+dzdiy.com",请将"+"变更为"@"
●电子制作存在风险,请注意人身安全,如果您在根据本站电路进行制作过程中发生伤害,本站不负任何责任。

版权所有:www.dzdiy.com ? 2001-2019 本站信息产业部备案: 粤ICP备05114582号