專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

i2c總線AT24C02存儲(chǔ)器讀寫程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間: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數(shù)據(jù)線
sbit scl=P3^2;//定義I2C時(shí)鐘線
void delay2()//延遲6us函數(shù)
{;;;}
void start()//I2C開始時(shí)鐘函數(shù)
{
   sda=1;
   delay2();//延遲6us是時(shí)序要求。
   scl=1;
   delay2();
   sda=0;
   delay2();
}
void stop()//I2C結(jié)束時(shí)鐘函數(shù)
{
   sda=0;
   delay2();//延遲6us是時(shí)序要求。
   scl=1;
   delay2();
   sda=1;
   delay2();
}
void respons()//應(yīng)答函數(shù)
{
uchar i;//定義變量I
scl=1;
delay2();
while((sda==1)&&(i<250))i++;//沒有收到應(yīng)答信號(hào)在等
 //過一段時(shí)間后還是沒收到自動(dòng)跳出該語句.相與。
scl=0;
delay2();
}
void init()//初始化函數(shù)。
{
 scl=1;
 sda=1;
}
void write_byte(uchar date)//寫一字節(jié)函數(shù)。
{
  uchar i,temp;
   temp=date;
 for(i=0;i<8;i++)
  {
   temp=temp<<1;//TEMP左移一位!
     scl=0;
     delay2();
     sda=CY;//送走最高位,依次把八位送完。
     scl=1;//保持?jǐn)?shù)據(jù)穩(wěn)定。
     delay2();
    
   }
   scl=0;
   delay2();
   sda=1;//總線釋放。
   delay2();
}
uchar read_byte()//讀一字節(jié)函數(shù)。帶返回值的函數(shù)
{
  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;//置低以便下次讀數(shù)據(jù)。
   delay2();
  }
  return k;
}
void write_add(uchar address,uchar date)
{  start();//I2C開始時(shí)鐘函數(shù)
   write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都為0。
   respons();//寫完后調(diào)用應(yīng)答函數(shù)
 write_byte(address);//確定從at24c02的第address位置寫數(shù)據(jù)。
   respons();//寫完后調(diào)用應(yīng)答函數(shù)
   write_byte(date);//在芯片第address位置寫date.
   respons();//寫完后調(diào)用應(yīng)答函數(shù)
   stop();//I2C結(jié)束時(shí)鐘函數(shù)
}
uchar read_add(uchar address)
{ 
   uchar date;
   start();//I2C開始時(shí)鐘函數(shù)
   write_byte(0xa0);//開始讀。
   respons();//讀完后調(diào)用應(yīng)答函數(shù)
   write_byte(address);//確定從at24c02的第address位置讀數(shù)據(jù)。
   respons();//讀完后調(diào)用應(yīng)答函數(shù)
   start();//I2C開始時(shí)鐘函數(shù)
   write_byte(0xa1);//讀數(shù)據(jù)
   respons();//讀完后調(diào)用應(yīng)答函數(shù)
   date=read_byte();//送到P1口顯示。
   stop();//I2C結(jié)束時(shí)鐘函數(shù)
   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();//寫直址,最后低位應(yīng)為0。
   delay (1);
   k=read_add(f);//送到P1口顯示。//從23地址讀數(shù)據(jù)
   aa=k;
   ee=aa*2200;
 if(D4==0)
  {  
  delay (100);   
   if(D4==1)
     {
   aa++;
     delay (1);
     init();//寫直址,最后低位應(yīng)為0。
     write_add(2,aa);//23為at24c02內(nèi)部?jī)?chǔ)存地址,0xaa為寫到23地址的數(shù)據(jù)。
     delay (1);
     k=read_add(2);//送到P1口顯示。//從23地址讀數(shù)據(jù)
     aa=k;
     stop();
     if(aa==8)
      {
     aa=7;
     }
      }
     }
 if(aa>1)
   {
   if(D5==0)
  { 
  delay (100);   
   if(D5==1)
      {
   aa--;
     delay (1);
     init();//寫直址,最后低位應(yīng)為0。
     write_add(2,aa);//23為at24c02內(nèi)部?jī)?chǔ)存地址,0xaa為寫到23地址的數(shù)據(jù)。
     delay (1);
     k=read_add(2);//送到P1口顯示。//從23地址讀數(shù)據(jù)
     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)//代參數(shù)無返回值
 { uint x,y;
   for (x=300;x>0;x--)
 for (y=z;y>0;y--);//100*2000次
}
關(guān)閉窗口

相關(guān)文章