资源简介

本人亲自写的I2C读写24C256和24C02程序,程序直接可以,根据硬件修改下即可。

资源截图

代码片段和文件信息

#include //包含文件
#include 
#include 
#include
#include“i2c.h“
#define Byte unsigned char//宏定义
#define uint unsigned int
#define uchar unsigned char
#define device_16bit_Waddress 0xa0//器件写数据地址24c256
#define device_16bit_Raddress 0xa1//器件读数据地址24c256
#define device_8bit_Waddress 0xa2       //定义PCF8563的写数据地址
#define device_8bit_Raddress 0xa3       //定义PCF8563的读数据地址
sbit SCL= P3^5;
sbit SDA =P3^4;
/*sbit SCL= P1^5;
sbit SDA =P1^6;*/
/*延时子程序大概10ms左右*/
void delay()
{
    uint ij;
    for(i=0;i<10;i++)
    {
        for(j=0;j<1000;j++)
        {
            ;
        }
    }
}

/*开始I2C数据发送或接收*/
void Start_I2C()//在时钟线为高,数据线从高电平跳到低电平时,开始传送

   SDA=1;           //数据先
   _nop_();         //延时一段时间
   _nop_();
   SCL=1;           //时钟线为高等数据线下降才开始
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   SDA=0;           //数据线下降拉启动了
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   SCL=0;           
}

/*结束数据传送*/
void Stop_I2C()
{  
   SDA=0;            //时钟线为高时数据线上升沿为结束信号
   _nop_();
   _nop_();   
   SCL=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   SDA=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   SCL=0;
}

/*发送字节子程序入口参数为要发送的数据无返回变量分8位进行发送*/
void Sent_Byte(Byte Data)      
{
    Byte BitCount;                       //定义发送的位数
    for(BitCount=0;BitCount<8;BitCount++)
       {
         _nop_();
         _nop_();
         if((Data<           else SDA=0;
           _nop_();
   _nop_();
           SCL=1;              //置位SCL通知从器件开始接收数据SCL上升沿发数据
           _nop_();            //SCL为1数据线电平不能变
           _nop_();
           _nop_();
           _nop_();
           SCL=0;           //钳住总线,等下次接收
 }
   
}

/*应答子程序无入口参数返回值是应答位*/
bit Ack_Check()  
{
    SDA=1;      //先置时钟线为高第九位数据过来会强行把数据线拉低
    _nop_();
    _nop_();
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    F0=SDA;    //将数据线上的该位保存到F0中
    SCL=0;
    if(F0==1) 
return 1;//没有应答返回1否则返回0
    else return 0;
}

/*接收字节子函数,先接收高位再接收低位无入口参数,返回值是一个无符号型的一个8位的数*/
Byte Rec_Byte()
{
  Byte BitCount RecData=0;
                                 
  for(BitCount=0;BitCount<8;BitCount++)
  {
     SDA=1;                               //数据线先给1的话如果从器件发0给主器件
    _nop_();                              //SDA会拉低那主器件接收到的为0否则不拉低接收到的为1
    _nop_();                              //这相当释放数据总线一样
     SCL=1;                                
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     F0=SDA;          //用F0来保存当前数据线上的值                     
     SCL=0;
     
     if(F0) 
     {
      RecData=RecData<<1;
      RecData=RecData|0x01;
     }
  
     else RecData=RecData<<1;
  }
  return(RecData);
}

/*发送数据子函数,入口参数是16位的器件地址和要发送的数据,无返回值*/
Sent_Data16(uint addressByte Data)
{
    bit ack_temp;    //响应寄存位
uchar addr_Haddr_L;
addr_H=(uchar)(addre

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5471  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\i2c

     文件       3074  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\i2c.hex

     文件         81  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\i2c.lnp

     文件      22862  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\i2c.M51

     文件       5967  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\i2c.obj

     文件       2432  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel\Serial.obj

     文件       7750  2009-09-07 09:13  I2C读写24c02和24c56\i2c.c

     文件        373  2009-09-04 11:22  I2C读写24c02和24c56\i2c.h

     文件        821  2009-09-07 09:23  I2C读写24c02和24c56\i2c.muo

     文件       2428  2009-09-07 09:23  I2C读写24c02和24c56\i2c.xmp

     文件       2096  2009-09-04 11:27  I2C读写24c02和24c56\Serial.c

     文件        136  2009-09-04 11:06  I2C读写24c02和24c56\Serial.h

     目录          0  2009-09-07 09:13  I2C读写24c02和24c56\DebugRel

     目录          0  2009-09-04 11:14  I2C读写24c02和24c56

----------- ---------  ---------- -----  ----

                53491                    14


评论

共有 条评论