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

艾方西(IIC)总线AT24C02读写程序

作者:佚名   来源:本站原创   点击数:  更新时间:2011年08月13日   【字体:

<pre>//****************************************************
  /*
     程序的功能:将数据写入AT24C02中,然后再从其中读取
                 回来赋给P2口,让流水灯显示。
     所涉及芯片:AT24C02
  */
//****************************************************

#include&lt;reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P0^3;//时钟线接在P0^3口
sbit sda=P0^4;//数据线接在P0^4口
void delay()//极短时间的延时
 {
   ; ; ;
 }
void delay1()//较长时间的延时
 {
   uchar i,j;
   uchar k=10;
     for(i=k;i>0;i--)
       for(j=110;j>0;j--);
 }
void chushihua()//对总线进行初始化
 {
   sda=1;
   scl=1;
 }
//=======================================
void start()//起始函数
 {
   sda=1;
   delay();
   scl=1; //时钟线为高电平期间,数据线由高到低的一个跳变表示起始
   delay();
   sda=0;
   delay();
 }
//=========================================
void stop()//终止函数
 {
  sda=0;
  delay();
  scl=1;//时钟线为高电平期间,数据线由低到高的一个跳变表示终止
  delay();
  sda=1;
  delay();
 }
//==========================================
void ack()//应答函数
 {
   uchar i;
   scl=1;
   if((sda==1)&&(i&lt;250))i++;//如果数据线一直为高电平,则一段时间后则默认为应答(即时钟线由高到底的一个跳变)
   scl=0;
   delay();
 }
//===========================================
void noack()//非应答函数 ,在数据线为高电平期间,时钟线一个完整的脉冲表示非应答
 {
   sda=1;
   delay();
   scl=0;
   delay();
   scl=1;
   delay();
   scl=0;
   delay();
 }
//====================================
void write_byte(uchar date)//写字节函数
 {
    uint i;
    scl=0;//时钟线为低电平期间,允许数据的变化
    for(i=0;i&lt;8;i++)
      {
         if(date&0x80)//如果写进的数据与0x80进行与运算为“1”(即为真),则数据线为高电平
          {
            sda=1;
          }
         else //否则为低电平
          {
            sda=0;
          }
         date=date&lt;&lt;1;//对8位数据进行移位操作
         scl=1;//时钟线为高电平(即数据稳定),把数据读走
         delay();
         scl=0; //把时钟线拉回低电平
         delay();
      }
    sda=1; //释放数据线
    delay();
 }
//========================================
uchar read_byte()//读字节函数
 {
    uchar i;
    uchar date=0x00;
    scl=0;
    delay();
    sda=1;//将总线释放
    delay();
     for(i=0;i&lt;8;i++)
       {
         scl=1;//时钟线为高电平(即数据稳定),把数据读走
         delay();
         date=date&lt;&lt;1;
         if(sda)
          {
            date++;
          }
         scl=0;
         delay();
       }
     return date;
 }
void xie(uchar add,uchar date)
 {
    start();
    write_byte(0xa0);//指令码0xa0为写操作
    ack();
    write_byte(add);
    ack();
    write_byte(date);
    ack();
    stop();
 }
uchar du(uchar t)
 {
    uchar k;
    start();
    write_byte(0xa0);
    ack();
    write_byte(t);
    ack();
    start();
    write_byte(0xa1);//指令码0xa1为读操作
    ack();
    k=read_byte();
    noack();
    stop();
    return k;//返回K的值
 }
void main()
 {
   chushihua();
   xie(10,0x44);//在0~256个地址中随意选一地址10,并在该地址写入一字节0x44
   delay1();//此处必须要一个延时函数
   P2=du(10);//将在地址10读回的数据赋给P2口(即让流水灯显示)
   while(1);//让程序停在此处
 }
</pre>

关闭窗口

相关文章