专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

i2c总线AT24C02存储器读写程序

作者:佚名   来源:本站原创   点击数:  更新时间:2012年03月21日   【字体:
#include <reg52.h>
#define uint unsigned int  //定义unsigned int 为uint
#define uchar unsigned char //定义unsigned char  为uchar
#define uchar unsigned char //定义unsigned char  为uchar
#define uint unsigned int  //定义unsigned int 为uint
sbit sda=P3^3;//定义I2C数据线
sbit scl=P3^2;//定义I2C时钟线
void delay2()//延迟6us函数
{;;;}
void start()//I2C开始时钟函数
{
   sda=1;
   delay2();//延迟6us是时序要求。
   scl=1;
   delay2();
   sda=0;
   delay2();
}
void stop()//I2C结束时钟函数
{
   sda=0;
   delay2();//延迟6us是时序要求。
   scl=1;
   delay2();
   sda=1;
   delay2();
}
void respons()//应答函数
{
uchar i;//定义变量I
scl=1;
delay2();
while((sda==1)&&(i<250))i++;//没有收到应答信号在等
 //过一段时间后还是没收到自动跳出该语句.相与。
scl=0;
delay2();
}
void init()//初始化函数。
{
 scl=1;
 sda=1;
}
void write_byte(uchar date)//写一字节函数。
{
  uchar i,temp;
   temp=date;
 for(i=0;i<8;i++)
  {
   temp=temp<<1;//TEMP左移一位!
     scl=0;
     delay2();
     sda=CY;//送走最高位,依次把八位送完。
     scl=1;//保持数据稳定。
     delay2();
    
   }
   scl=0;
   delay2();
   sda=1;//总线释放。
   delay2();
}
uchar read_byte()//读一字节函数。带返回值的函数
{
  uchar i,j,k;
  scl=0;
  delay2();
  sda=1;//总线释放。
  delay2();
 for(i=0;i<8;i++)
{ 
   scl=1;
   delay2();
   j=sda;
   k=(k<<1)|j;//k左移一位最低位变成了0,再与J相或,J就送到K最低位。
   scl=0;//置低以便下次读数据。
   delay2();
  }
  return k;
}
void write_add(uchar address,uchar date)
{  start();//I2C开始时钟函数
   write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都为0。
   respons();//写完后调用应答函数
 write_byte(address);//确定从at24c02的第address位置写数据。
   respons();//写完后调用应答函数
   write_byte(date);//在芯片第address位置写date.
   respons();//写完后调用应答函数
   stop();//I2C结束时钟函数
}
uchar read_add(uchar address)
{ 
   uchar date;
   start();//I2C开始时钟函数
   write_byte(0xa0);//开始读。
   respons();//读完后调用应答函数
   write_byte(address);//确定从at24c02的第address位置读数据。
   respons();//读完后调用应答函数
   start();//I2C开始时钟函数
   write_byte(0xa1);//读数据
   respons();//读完后调用应答函数
   date=read_byte();//送到P1口显示。
   stop();//I2C结束时钟函数
   return date;
}
 
uint intnum,aa,ee,dd,cc;
sbit D1=P3^4;//位定义
sbit D2=P3^5;//位定义
sbit D3=P3^7;//位定义
sbit D4=P1^6;//位定义
sbit D5=P1^7;//位定义
void delay (uint z);
void main ()
{
 P1=0xff;
 dd=0;
 D2=0;
 D3=0;
 delay (2200);  
 //aa=5;
 //ee=11000;
 while(1)
{ 
   uchar f,k;
   f=2;
   init();//写直址,最后低位应为0。
   delay (1);
   k=read_add(f);//送到P1口显示。//从23地址读数据
   aa=k;
   ee=aa*2200;
 if(D4==0)
  {  
  delay (100);   
   if(D4==1)
     {
   aa++;
     delay (1);
     init();//写直址,最后低位应为0。
     write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。
     delay (1);
     k=read_add(2);//送到P1口显示。//从23地址读数据
     aa=k;
     stop();
     if(aa==8)
      {
     aa=7;
     }
      }
     }
 if(aa>1)
   {
   if(D5==0)
  { 
  delay (100);   
   if(D5==1)
      {
   aa--;
     delay (1);
     init();//写直址,最后低位应为0。
     write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。
     delay (1);
     k=read_add(2);//送到P1口显示。//从23地址读数据
     aa=k;
     stop();
     //ee=aa*2200;
     if(aa==1)
      {
     aa=2;
    }
       }
     }
    }
  if(dd==0)
  {
   if(D1==0)
   { 
    delay (5000);
     if(D1==0)
       {
    D2=0;
    D3=1;
  dd=1;
      delay (ee);
    D2=0;
    D3=0;
      }
       }
       }
 if(dd==1)
  {
  if(D1==1)
  {
    delay (5000);
     if(D1==1)
     {
    D2=1;
    D3=0;
      dd=0;
    delay (ee);   
      D2=0;
    D3=0;
   }
    }
    }
   }
}
void delay(uint z)//代参数无返回值
 { uint x,y;
   for (x=300;x>0;x--)
 for (y=z;y>0;y--);//100*2000次
}
关闭窗口

相关文章